BMS STM32 V4.0.0.0

This commit is contained in:
2026-08-25 17:30:40 +08:00
commit 3ae7bcb054
313 changed files with 115734 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
{
"recommendations": [
"cl.keil-assistant"
]
}
+242
View File
@@ -0,0 +1,242 @@
/**
******************************************************************************
* @file gpio.c
* @author Jerry Cai
* @version V2.1
* @date 19-April-2022
* @brief gpio program body.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
//【引脚】
//GPIOA
#define PIN_T1 GPIO_Pin_5
#define PIN_T2 GPIO_Pin_4
#define PIN_T3 GPIO_Pin_1
#define PIN_T4 GPIO_Pin_0
//GPIOC
#define PIN_LOAD_VOL GPIO_Pin_4
//【ADC通道】
#define CH_T1 ADC_Channel_5
#define CH_T2 ADC_Channel_4
#define CH_T3 ADC_Channel_1
#define CH_T4 ADC_Channel_0
#define CH_LOAD ADC_Channel_14
int16_t TemperatureAverage; // 平均温度
int16_t TemperatureMax; // 最高温度
int16_t TemperatureMin; // 最低温度
uint16_t TemperatureMaxIndex; // 最高温度序号
uint16_t TemperatureMinIndex; // 最低温度序号
uint32_t loadvol; //负载检测的电压
//ADC单通道单次转换
void uf_ADC_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//PC4 负载电压检测脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = PIN_LOAD_VOL;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//PA0.1.4.5 T1~T4输入引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = PIN_T1 | PIN_T2 | PIN_T3 | PIN_T4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE ); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6,ADC最大时间不能超过14M
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
}
//指定通道ADC值
uint16_t ADC_GetVal(uint8_t ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
//负载电压检测
void LOAD_VOL(void)
{
uint16_t adcvol;
adcvol = ADC_GetVal(CH_LOAD);
loadvol = adcvol * 40 * 3300 / 4095; //将AD值线性变换到0~3.3V的范围,表示电压
}
//温度处理
void MCU_TemperaProcess(void)
{
uint16_t adctmp[4]; //adc read value
uint16_t resntc[4]; //res calc value
uint16_t mcutmp[4];
uint16_t T[4]; //4路MCU
uint8_t i;
//获取ADC值
adctmp[0] = ADC_GetVal(CH_T1);
adctmp[1] = ADC_GetVal(CH_T2);
adctmp[2] = ADC_GetVal(CH_T3);
adctmp[3] = ADC_GetVal(CH_T4);
resntc[0] = (1000 * adctmp[0]) / (4096-adctmp[0]);
resntc[1] = (1000 * adctmp[1]) / (4096-adctmp[1]);
resntc[2] = (1000 * adctmp[2]) / (4096-adctmp[2]);
resntc[3] = (1000 * adctmp[3]) / (4096-adctmp[3]);
mcutmp[0] = TEMP_Cal(resntc[0]);
mcutmp[1] = TEMP_Cal(resntc[1]);
mcutmp[2] = TEMP_Cal(resntc[2]);
mcutmp[3] = TEMP_Cal(resntc[3]);
bmsMem.mcu_T1 = mcutmp[0];
bmsMem.mcu_T2 = mcutmp[1];
bmsMem.mcu_T3 = mcutmp[2];
bmsMem.mcu_T4 = mcutmp[3];
//当至少有1个温度可用时
if((paraMem.temp_disable & 0x0F) != 0x0F)
{
uint8_t act_num = 0; //有效个数
if((paraMem.temp_disable & BIT0) == 0)
{
T[act_num] = bmsMem.mcu_T1;
act_num++;
}
if((paraMem.temp_disable & BIT1) == 0)
{
T[act_num] = bmsMem.mcu_T2;
act_num++;
}
if((paraMem.temp_disable & BIT2) == 0)
{
T[act_num] = bmsMem.mcu_T3;
act_num++;
}
if((paraMem.temp_disable & BIT3) == 0)
{
T[act_num] = bmsMem.mcu_T4;
act_num++;
}
//平均温度
TemperatureAverage = 0;
for(i=0;i<act_num;i++)
{
TemperatureAverage += T[i];
}
TemperatureAverage = TemperatureAverage/act_num;
//最高最低温度
TemperatureMax = T[0];
TemperatureMin = T[0];
TemperatureMaxIndex = 0;
TemperatureMinIndex = 0;
for(i=0;i<act_num;i++)
{
if(TemperatureMax < T[i])
{
TemperatureMax = T[i];
TemperatureMaxIndex = i;
}
if(TemperatureMin > T[i])
{
TemperatureMin = T[i];
TemperatureMinIndex = i;
}
}
}
//当4路温度都不可用时
else
{
TemperatureAverage = 0;
TemperatureMin = 0;
TemperatureMax = 0;
TemperatureMinIndex = 0;
TemperatureMaxIndex = 0;
}
//sum of all packs
bmsMem.can_temp = TemperatureAverage;
bmsMem.can_TempMax = TemperatureMax;
bmsMem.can_TempMaxIndex = TemperatureMaxIndex;
bmsMem.can_TempMin = TemperatureMin;
bmsMem.can_TempMinIndex = TemperatureMinIndex;
//当至少有1个温度可用时
if((paraMem.temp_disable & 0x0F) != 0x0F)
{
//电芯温度告警和告警释放
Trigger_mcuTAlarm(); //电芯温度告警
Release_mcuTAlarm(); //电芯温度告警恢复
//电芯温度保护和保护释放
Trigger_mcuTProtect(); //电芯温度保护相关
Release_mcuTProtect(); //电芯温度保护释放
#if DO2_Warm
//加热
WARM_Ctrl(); //电芯低温启动加热,温度升高释放
#endif
}
//当4路温度都不可用时
else
{
bmsMem.bStatus2 &= ~0xF000;
bmsMem.temperaStatus &= ~0x000F;
}
//电流告警和告警释放
Trigger_CurAlarm(); //电流告警
Release_CurAlarm(); //电流告警恢复
//电流保护和保护释放
Trigger_CurProtect(); //电流保护
Release_CurProtect(); //电流保护释放
/*电流保护连续出现的计算*/
Trigger_CurProtectLock();
}
+213
View File
@@ -0,0 +1,213 @@
/**
******************************************************************************
* @file tim.c
* @author Jerry
* @version V2.1
* @date 19-April-2022
* @brief tim program body.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
#define CAN_MON_CNT 1000 //1000*10ms = 10s
CanTxMsg TxMessage[20];
CanRxMsg RxMessage;
uint8_t TxMailBox[20];
uint8_t CAN_SendCount;
uint16_t CAN_MoniCount;
CAN_MEMORY canMem[AddrMax+2];
//HSE --> PLL倍频到72M --> APB1 2分频到36M
void uf_CAN1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
//Config CAN pin : RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Config CAN pin : TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//NVIC
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //CAN通信 优先级:1,0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//彻底复位CAN外设:先禁用,再重新使能,确保完全复位
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, DISABLE);
delay_ms(1);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
//控制器配置
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
CAN_InitStructure.CAN_TTCM = DISABLE; //时间触发通信模式
CAN_InitStructure.CAN_ABOM = DISABLE; //自动离线管理
CAN_InitStructure.CAN_AWUM = DISABLE; //自动唤醒
CAN_InitStructure.CAN_NART = ENABLE; //自动重传 改启用
CAN_InitStructure.CAN_RFLM = DISABLE; //FIFO锁定
CAN_InitStructure.CAN_TXFP = DISABLE; //发送FIFO优先级
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //普通模式
//波特率配置
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;
if(protocol == 7) //MUST协议的波特率是100k
{
CAN_InitStructure.CAN_Prescaler = 40; //36MHz/40/(1+6+2)=100kbs
}
else //其他协议是500k
{
CAN_InitStructure.CAN_Prescaler = 8; //36MHz/8/(1+6+2)=500kbs
}
CAN_Init(CAN1, &CAN_InitStructure);
//过滤器配置
CAN_FilterInitStructure.CAN_FilterNumber = 0; //选择过滤器0
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //标识符屏蔽模式
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //过滤器位宽32位
CAN_FilterInitStructure.CAN_FilterIdHigh = 0;
CAN_FilterInitStructure.CAN_FilterIdLow = 0;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FilterFIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
//中断配置
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); //FIFO0中有消息允许中断
//清除所有可能的错误标志
CAN1->ESR = 0; // 清除错误状态寄存器
CAN1->MSR &= ~(CAN_MSR_ERRI); // 清除错误中断标志
//更新倒计时数
CAN_MoniCount = CAN_MON_CNT;
}
void USB_LP_CAN1_RX0_IRQHandler(void)
{
//处理接收中断
if(CAN_GetITStatus(CAN1, CAN_IT_FMP0) != RESET)
{
//接收报文
CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);
if(RxMessage.StdId == 0x305)
{
RxMessage.StdId = 0;
CAN_MoniCount = CAN_MON_CNT;
if(sleep_flag == 1)
{
//CAN网口收到数据,退出休眠且更新计时起点
sleep_flag = 0;
SLEEP_Refresh();
SLEEP2_Refresh();
}
}
}
}
void CAN_TIM_Moni(void)
{
CAN_MoniCount--;
if(CAN_MoniCount == 0)
{
uf_CAN1_Init();
}
}
/*
1."Sol-Ark", 2."GoodWe", 30."Megarevo", 12."Pylon",
11."Deye", 7."MUST", 37."solis", 3."Growatt",
4."Aiswei", 35."Afore", 27."Victron", 6."Sorotec",
5."SMA", 39."Sunways", 23."Luxpower", 24."Schneider",
40."AlpSolarr", 13."SRNE", 14."Voltronic", 32."COSUPER",
17."SMK", 31."SAKO", 18."SNADI", 21."invt",
*/
void CAN_UpdateData(void)
{
//第1页:
if(protocol == 1) CAN_Protocol_SolArk();
// else if(protocol == 2) CAN_Protocol_GoodWe();
// else if(protocol == 30) CAN_Protocol_Megarevo();
else if(protocol == 12) CAN_Protocol_Pylon();
else if(protocol == 11) CAN_Protocol_Deye();
// else if(protocol == 7) CAN_Protocol_MUST();
else if(protocol == 37) CAN_Protocol_solis();
else if(protocol == 3) CAN_Protocol_Growatt();
// else if(protocol == 4) CAN_Protocol_Aiswei();
// else if(protocol == 35) CAN_Protocol_Afore();
// else if(protocol == 27) CAN_Protocol_Victron();
// else if(protocol == 6) CAN_Protocol_Sorotec();
//第2页:
// else if(protocol == 5) CAN_Protocol_SMA();
// else if(protocol == 39) CAN_Protocol_Sunways();
// else if(protocol == 23) CAN_Protocol_Luxpower();
// else if(protocol == 24) CAN_Protocol_Schneider();
// else if(protocol == 40) CAN_Protocol_AlpSolarr();
}
//CAN报文发送函数
void CAN1_SendData(uint32_t Id, uint8_t *data)
{
uint16_t can_timeout;
can_timeout = CAN_TIMEOUT_COUNT;
if(Id < 0x1000)
{
TxMessage[CAN_SendCount].StdId = Id; //ID
TxMessage[CAN_SendCount].IDE = CAN_ID_STD; //标准ID
}
else
{
TxMessage[CAN_SendCount].ExtId = Id; //ID
TxMessage[CAN_SendCount].IDE = CAN_ID_EXT; //扩展ID
}
TxMessage[CAN_SendCount].RTR = CAN_RTR_DATA; //数据帧
TxMessage[CAN_SendCount].DLC = 8;
TxMessage[CAN_SendCount].Data[0] = data[0];
TxMessage[CAN_SendCount].Data[1] = data[1];
TxMessage[CAN_SendCount].Data[2] = data[2];
TxMessage[CAN_SendCount].Data[3] = data[3];
TxMessage[CAN_SendCount].Data[4] = data[4];
TxMessage[CAN_SendCount].Data[5] = data[5];
TxMessage[CAN_SendCount].Data[6] = data[6];
TxMessage[CAN_SendCount].Data[7] = data[7];
TxMailBox[CAN_SendCount] = CAN_Transmit(CAN1, &TxMessage[CAN_SendCount]); //发送,返回当前邮箱号
while(CAN_TransmitStatus(CAN1,TxMailBox[CAN_SendCount]) != CANTXOK) //等待发送完成
{
if((can_timeout--) == 0) return;
}
CAN_SendCount++;
}
+1222
View File
File diff suppressed because it is too large Load Diff
+1053
View File
File diff suppressed because it is too large Load Diff
+531
View File
@@ -0,0 +1,531 @@
/**
******************************************************************************
* @file tim.c
* @author Jerry
* @version V2.1
* @date 22-April-2022
* @brief tim program body.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
#include "string.h"
#include "sys.h"
#include "soe.h"
//64-byte page write buffer
//1,000,000 program/erase cycles
//100 year data retention
//AT24C256 32K Bytes = 128 * 256 bytes
//0x0000 不可初始化数据
//0x0200 厂内可初始化数据
//0x0400 升级初始化数据
//0x0800 报警记录数据
#define I2C_EEPROM I2C1
#define I2C_AFE I2C1
#define DEVICE_ID_EEPROM 0xA0
#define DEVICE_ID_AFE 0x34
#define I2C_TIMEOUT_COUNT 10000
#define FLASH_PAGE_ADDR 0x0800FC00 //要擦除的FLASH页地址
#define JUMP_TO_USER 0X20230612 //用户固件更新标记
#define JUMP_BUTNULL 0XFFFFFFFF //无更新标记
uint8_t IAP_Run; //执行程序时是否正常的标志
uint8_t DL_Index; //跳转位置的标识
uint32_t DL_Addr; //根据标识计算出的位置
uint32_t DL_Jump;
void uf_I2C1_Init(void)
{
uint8_t tmp[8];
uint32_t ee_index;
uint16_t ee_pc;
uint16_t ee_num;
/*初始化IIC*/
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
/* Configure I2C1 pins: PB6->SCL and PB7->SDA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 80000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
I2C_AcknowledgeConfig(I2C1, ENABLE);
/*IAP标志*/
IAP_Run = 0x55;
EEPROM_WrMulByte(EE_IAP_NEW1,&IAP_Run);
delay_ms(10);
EEPROM_WrMulByte(EE_IAP_NEW2,&IAP_Run);
delay_ms(10);
/*为兼容此前底层,写入标识*/
EEPROM_RdMulByte(0,1,1,&DL_Index);
if((DL_Index != 0) && (DL_Index != 1)) //之前未刷过程序
{
DL_Index = 1; //现在一般是1
}
//读出检查,确认是这个位置并且无用户数据/跳转标志,才进行写入
DL_Addr = FLASH_PAGE_ADDR + 0x10000 * DL_Index;
FLASH_RdWord(DL_Addr, &DL_Jump, 1);
if(DL_Jump == JUMP_BUTNULL)
{
DL_Jump = JUMP_TO_USER;
FLASH_WrData(DL_Addr,(uint16_t *)&DL_Jump,8);
}
//若该位置有值,且不是跳转标志,跳转到另一个位置检查并写入
else if(DL_Jump != JUMP_TO_USER)
{
DL_Index = (DL_Index==0) ? 1:0; //取另一个地址查询,若仍然不对,那该用户程序不依靠IAP底层
DL_Addr = FLASH_PAGE_ADDR + 0x10000 * DL_Index;
FLASH_RdWord(DL_Addr, &DL_Jump, 1);
if(DL_Jump == JUMP_BUTNULL)
{
DL_Jump = JUMP_TO_USER;
FLASH_WrData(DL_Addr,(uint16_t *)&DL_Jump,8);
}
}
#if LTE_Conn
//上电读OTA升级回复标志
EEPROM_RdMulByte(EE_OTA_FINE,&tmp[0]);
if((tmp[0] == 0xAA) || (tmp[0] == 0xBB))
{
LTE_OTA_fineFlag = tmp[0];
}
else
{
LTE_OTA_fineFlag = 0;
}
#endif
/*EEPROM无值,赋默认值,但不主动写入EEPROM*/
//上电读485地址(先暂时获得一个值,之后根据paraMem参数来决定是否改变)
EEPROM_RdMulByte(EE_ADDR,&tmp[0]);
if((tmp[0]>=1) && (tmp[0]<=AddrMax))
{
bmsMem.E2_485Addr = tmp[0];
}
else
{
bmsMem.E2_485Addr = 2;
}
// //上电读屏幕语言
// EEPROM_RdMulByte(EE_LANG,&tmp[0]);
// if((tmp[0]==0) || (tmp[0]==1)) //0对应英文,1对应中文
// {
// language = tmp[0];
// }
// else
// {
// language = 0; //默认英文
// }
#if Addr_SetAuto
uint16_t random;
//上电读自动分配地址的随机队列标志
EEPROM_RdMulByte(EE_ASSIGN,&tmp[0]);
random = tmp[0]<<8 | tmp[1];
if((random>AddrMax) && (random<0xffff)) //AddrMax+1~65534
{
bmsMem.can_ArrayIndex = random;
}
else
{
bmsMem.can_ArrayIndex = 0;
}
#endif
//上电读是否需要充电校准总容量
EEPROM_RdMulByte(EE_FCC_TIME,&tmp[0]);
fcc_Calitimecount = tmp[0]<<24 | tmp[1]<<16 | tmp[2]<<8 | tmp[3];
if(fcc_Calitimecount <= timecount) //存的数据不算异常
{
fcc_CaliStartFlag = 1; //记录了起始时间,说明正在计时等满充
}
#if LTE_Conn
//上电读取消绑定标志
EEPROM_RdMulByte(EE_UNSUB,&tmp[0]);
if(tmp[0] <= 1)
{
LTE_UNSUB_Flag = tmp[0];
}
else
{
LTE_UNSUB_Flag = 0;
}
#endif
/*上电读取记录相关信息*/
EEPROM_RdMulByte(EE_SOE_INF,tmp);
ee_index = tmp[0]<<24 | tmp[1]<<16 | tmp[2]<<8 | tmp[3];
ee_pc = tmp[4]<<8 | tmp[5];
ee_num = tmp[6]<<8 | tmp[7];
//当前地址=0或0XFFFF或不为64倍数,初始化地址和记录序号
if((ee_pc < 0x1000) || (ee_pc > 0x2940) || (ee_pc == 0xffff) || (ee_pc%64 !=0))
{
soe.pc = RECORD_START_ADDR;
soe.index = 0;
soe.num = 0;
}
else
{
soe.index = ee_index;
soe.pc = ee_pc;
soe.num = ee_num;
}
}
//EEPROM写多字节,注意写入时不要跨page
uint8_t EEPROM_WrMulByte(uint8_t addrH, uint8_t addrL, uint8_t lenth, uint8_t *data)
{
uint8_t i;
uint16_t i2c_timeout;
//I2C总线BUSY
i2c_timeout = I2C_TIMEOUT_COUNT;
while(I2C_GetFlagStatus(I2C_EEPROM,I2C_FLAG_BUSY) == SET)
{
if((i2c_timeout--) == 0) return 9;
}
/*起始位*/
I2C_GenerateSTART(I2C_EEPROM, ENABLE);
i2c_timeout = I2C_TIMEOUT_COUNT;
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS) //EV5
{
if((i2c_timeout--) == 0) return 1;
}
/*EV5事件检测到,发送Device ID(写)*/
I2C_Send7bitAddress(I2C_EEPROM, DEVICE_ID_EEPROM, I2C_Direction_Transmitter);
i2c_timeout = I2C_TIMEOUT_COUNT;
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS) //EV6
{
if((i2c_timeout--) == 0) return 2;
}
/*EV6事件检测到,发送EEPROM 存储单元地址*/
//检测EV8,表示发送寄存器空了就可以继续填数据了,无需等待移位寄存器空
I2C_SendData(I2C_EEPROM, addrH);
i2c_timeout = I2C_TIMEOUT_COUNT;
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS)
{
if((i2c_timeout--) == 0) return 3;
}
/*发送EEPROM 存储单元地址*/
I2C_SendData(I2C_EEPROM, addrL);
i2c_timeout = I2C_TIMEOUT_COUNT;
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS)
{
if((i2c_timeout--) == 0) return 4;
}
/*发送写入EERPOM数据*/
for(i=0;i<lenth-1;i++)
{
i2c_timeout = I2C_TIMEOUT_COUNT;
I2C_SendData(I2C_EEPROM, *data++);
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS)
{
if((i2c_timeout--) == 0) return 5;
}
}
//最后一个数据EV8_2
i2c_timeout = I2C_TIMEOUT_COUNT;
I2C_SendData(I2C_EEPROM, *data++);
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_BYTE_TRANSMITTED) != SUCCESS)
{
if((i2c_timeout--) == 0) return 5;
}
/*停止位*/
I2C_GenerateSTOP(I2C_EEPROM, ENABLE);
return 0;
}
//EEPROM随机读多字节
uint8_t EEPROM_RdMulByte(uint8_t addrH, uint8_t addrL, uint8_t lenth, uint8_t *data)
{
uint8_t i;
uint16_t i2c_timeout;
//I2C总线BUSY
i2c_timeout = I2C_TIMEOUT_COUNT;
while(I2C_GetFlagStatus(I2C_EEPROM,I2C_FLAG_BUSY) == SET)
{
if((i2c_timeout--) == 0) return 9;
}
//ACK
I2C_AcknowledgeConfig(I2C_EEPROM, ENABLE);
/*起始位*/
i2c_timeout = I2C_TIMEOUT_COUNT;
I2C_GenerateSTART(I2C_EEPROM, ENABLE);
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS) //EV5
{
if((i2c_timeout--) == 0) return 1;
}
/*发送Device ID(写)*/
i2c_timeout = I2C_TIMEOUT_COUNT;
I2C_Send7bitAddress(I2C_EEPROM, DEVICE_ID_EEPROM, I2C_Direction_Transmitter);
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS)
{
if((i2c_timeout--) == 0) return 2;
}
/*发送EEPROM 存储单元地址*/
i2c_timeout = I2C_TIMEOUT_COUNT;
I2C_SendData(I2C_EEPROM, addrH);
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_BYTE_TRANSMITTED) != SUCCESS)
{
if((i2c_timeout--) == 0) return 3;
}
/*发送EEPROM 存储单元地址*/
i2c_timeout = I2C_TIMEOUT_COUNT;
I2C_SendData(I2C_EEPROM, addrL);
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_BYTE_TRANSMITTED) != SUCCESS)
{
if((i2c_timeout--) == 0) return 4;
}
/*起始位*/
i2c_timeout = I2C_TIMEOUT_COUNT;
I2C_GenerateSTART(I2C_EEPROM, ENABLE);
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_MODE_SELECT)!= SUCCESS)
{
if((i2c_timeout--) == 0) return 5;
}
/*发送DEVICE(读)*/
i2c_timeout = I2C_TIMEOUT_COUNT;
I2C_Send7bitAddress(I2C_EEPROM, DEVICE_ID_EEPROM, I2C_Direction_Receiver);
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) != SUCCESS)
{
if((i2c_timeout--) == 0) return 6;
}
/*读lenth长度数据*/
for(i=0;i<lenth-1;i++)
{
i2c_timeout = I2C_TIMEOUT_COUNT;
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS)
{
if((i2c_timeout--) == 0) return 7;
}
*data++ = I2C_ReceiveData(I2C_EEPROM);
}
//NACK
I2C_AcknowledgeConfig(I2C_EEPROM, DISABLE);
//我认为ACK disable因该放在接收数据之前,这样接到数据后可以马上发NACK信号
i2c_timeout = I2C_TIMEOUT_COUNT;
while(I2C_CheckEvent(I2C_EEPROM, I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS)
{
if((i2c_timeout--) == 0) return 8;
}
*data++ = I2C_ReceiveData(I2C_EEPROM);
/*停止位*/
I2C_GenerateSTOP(I2C_EEPROM, ENABLE);
return 0;
}
//AFE通信函数(AFE_WriteOneByte/AFE_ReadMulByte)已移至BSP/spi.c,使用SPI2与SH3673520通信
//write zero cali data to eeprom
//read from eeprom and check
uint8_t EEPROM_CALI_WrZero(int16_t data)
{
uint8_t tempW[4];
uint8_t tempR[4];
uint8_t i;
tempW[0] = (data >>8) & 0xff;
tempW[1] = data & 0xff;
tempW[2] = tempW[0] ^ 0xff;
tempW[3] = tempW[1] ^ 0xff;
if(EEPROM_WrMulByte(EE_CALI_ZERO,tempW) !=0)
{
return 1; //iic write error
}
delay_ms(20); //are there?
if(EEPROM_RdMulByte(EE_CALI_ZERO,tempR) !=0)
{
return 2; //iic read error
}
for(i=0;i<4;i++)
{
if(tempR[i] != tempW[i])
{
return 3; //check error
}
}
return 0;
}
//write gain cali data to eeprom
uint8_t EEPROM_CALI_WrGain(int16_t data)
{
uint8_t tempW[4];
uint8_t tempR[4];
uint8_t i;
tempW[0] = (data >>8) & 0xff;
tempW[1] = data & 0xff;
tempW[2] = tempW[0] ^ 0xff;
tempW[3] = tempW[1] ^ 0xff;
if(EEPROM_WrMulByte(EE_CALI_GAIN,tempW) !=0)
{
return 1;
}
delay_ms(20);
if(EEPROM_RdMulByte(EE_CALI_GAIN,tempR) !=0)
{
return 2; //iic read error
}
for(i=0;i<4;i++)
{
if(tempR[i] != tempW[i])
{
return 3; //check error
}
}
return 0;
}
int16_t EEPROM_CALI_RdZero(void)
{
uint8_t i;
uint8_t tempR[4];
int16_t result;
EEPROM_RdMulByte(EE_CALI_ZERO,tempR);
if(((tempR[0] ^ 0xff) == tempR[2]) && ((tempR[1] ^ 0xff) == tempR[3]))
{
result = tempR[0] << 8 | tempR[1];
return result;
}
else
{
EEPROM_RdMulByte(2,0,4,tempR); //读取旧地址的数据
if(((tempR[0] ^ 0xff) == tempR[2]) && ((tempR[1] ^ 0xff) == tempR[3]))
{
//符合存储格式,说明之前校准值保存在旧地址,赋值到新地址,并清除
EEPROM_WrMulByte(EE_CALI_ZERO,tempR);
delay_ms(5);
result = tempR[0] << 8 | tempR[1];
//为了不影响现在在旧地址的数据,将这部分清空
for(i=0;i<4;i++)
{
tempR[i] = 0xff;
}
EEPROM_WrMulByte(2,0,4,tempR);
delay_ms(5);
EEPROM_WrMulByte(2,4,4,tempR);
delay_ms(5);
}
else
{
result = 0;
}
return result;
}
}
int16_t EEPROM_CALI_RdGain(void)
{
uint8_t i;
uint8_t tempR[4];
int16_t result;
EEPROM_RdMulByte(EE_CALI_GAIN,tempR);
if(((tempR[0] ^ 0xff) == tempR[2]) && ((tempR[1] ^ 0xff) == tempR[3]))
{
result = tempR[0] << 8 | tempR[1];
return result;
}
else
{
EEPROM_RdMulByte(3,0,4,tempR); //读取旧地址的数据
if(((tempR[0] ^ 0xff) == tempR[2]) && ((tempR[1] ^ 0xff) == tempR[3]))
{
//符合存储格式,说明之前校准值保存在旧地址,赋值到新地址,并清除
EEPROM_WrMulByte(EE_CALI_GAIN,tempR);
delay_ms(5);
result = tempR[0] << 8 | tempR[1];
//为了不影响现在在旧地址的数据,将这部分清空
for(i=0;i<4;i++)
{
tempR[i] = 0xff;
}
EEPROM_WrMulByte(3,0,4,tempR);
delay_ms(5);
EEPROM_WrMulByte(3,4,4,tempR);
delay_ms(5);
}
else
{
result = 10000;
}
return result;
}
}
+269
View File
@@ -0,0 +1,269 @@
/**
******************************************************************************
* @file pwm.c
* @author
* @version
* @date
* @brief
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
//GPIOA
#define PIN_CHG_LIMIT_PON GPIO_Pin_8 //限流 电源控制管脚
//GPIOB
#define PIN_CHG_LIMIT_PWM GPIO_Pin_9 //限流 电流值控制
#define BIAS_VOLTAGE (200 * bmsMem.ucCellNum/16) //基准偏差电压值,单位1mV
#define BASE_VOLTAGE (60000 * bmsMem.ucCellNum/16) //基准电压值,单位1mV
#define BASE_CURRENT 10000 //基准/目标电流值10A,单位1mA
#define MAX_DUTY 99.00f //最大占空比(百分比)
#define MIN_DUTY 50.00f //最小占空比(百分比)
#define PWM_ARR 3599 //定时器自动重装值(对应0~100%占空比)
#define PWM_PSC 0 //预分频系数(PWM频率=72M/(0+1)/(3599+1) = 20kHz
uint8_t curLimit_ctrlFlag; //执行限流开/关的标志 0:关限流 1:开限流
float base_duty; //初始电流值偏小最好,对应假设充电器电压是最大值60V
float old_duty; //有效的上一次调整的占空比
float duty_cycle; //实时基准占空比
//开限流
void CHG_LIMIT_On(void)
{
if(curLimit_ctrlFlag != 1)
{
curLimit_ctrlFlag = 1;
delay_ms(10); //关充电MOS后,再延时开限流
//计算初始占空比
base_duty = (float)(bmsMem.packVoltage + BIAS_VOLTAGE) / BASE_VOLTAGE * 100;
base_duty = (int)(base_duty * 100 + 0.5) / 100.0f;
if(base_duty < MIN_DUTY)
{
base_duty = MIN_DUTY;
}
else if(base_duty > MAX_DUTY)
{
base_duty = MAX_DUTY;
}
//限流功能开启
GPIO_SetBits(GPIOA, PIN_CHG_LIMIT_PON);
//PWM占空比为默认值
duty_cycle = base_duty;
old_duty = duty_cycle;
PWM_Set_Duty_Percent(duty_cycle);
}
}
//关限流
void CHG_LIMIT_Off(void)
{
if(curLimit_ctrlFlag != 0)
{
curLimit_ctrlFlag = 0;
//限流功能关闭
GPIO_ResetBits(GPIOA, PIN_CHG_LIMIT_PON);
//PWM占空比为0%
duty_cycle = 0.00f;
old_duty = duty_cycle;
PWM_Set_Duty_Percent(duty_cycle);
delay_ms(10); //关限流后,延时开充电MOS
}
}
//限流控制脚和PWM脚的初始化
void CHG_LIMIT_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//限流充电控制
GPIO_InitStructure.GPIO_Pin = PIN_CHG_LIMIT_PON;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, PIN_CHG_LIMIT_PON); //限流控制脚,默认关闭状态
//限流PWM波初始化
TIM4_PWM_Init(PWM_ARR, PWM_PSC);
}
/**************************************************************************
** 初始化TIM4_CH1PA8)的PWM输出
** arr: 定时器自动重装值
** psc: 定时器预分频系数
***************************************************************************/
void TIM4_PWM_Init(uint16_t arr, uint16_t psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 开启外设时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); // TIM4+GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE); // 复用功能时钟(必要)
// 配置PB9为复用推挽输出(PWM必须用复用模式)
GPIO_InitStructure.GPIO_Pin = PIN_CHG_LIMIT_PWM;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置TIM4时基参数
TIM_TimeBaseStructure.TIM_Period = arr; // 自动重装值
TIM_TimeBaseStructure.TIM_Prescaler = psc; // 预分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟分割(无分频)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
// 配置TIM4_CH1的PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1CNT<CCR时输出高电平
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能通道输出
TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比0CCR值)
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 有效电平为高
TIM_OC4Init(TIM4, &TIM_OCInitStructure); // 初始化通道4
// 使能预装载寄存器(保证参数修改生效)
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); // 通道4预装载使能
TIM_ARRPreloadConfig(TIM4, ENABLE); // TIM4自动重装预装载使能
// 开启主输出(否则无PWM波形)
TIM_CtrlPWMOutputs(TIM4, ENABLE);
// 启动TIM4
TIM_Cmd(TIM4, ENABLE);
}
/*************************************************************************************************
* 函数名: PWM_Set_Duty_Percent
* 参 数: 无
* 返回值: 无
* 描 述:
*************************************************************************************************/
void PWM_Set_Duty_Percent(float duty_per)
{
uint16_t ccr_val;
//限制百分比范围
if (duty_per < 0.00f) duty_per = 0.00f;
if (duty_per > 100.00f) duty_per = 100.00f;
//转换为定时器CCR值(四舍五入,提升精度)
ccr_val = (u16)(duty_per / 100.00f * PWM_ARR + 0.50f);
//设置CCR值
TIM_SetCompare4(TIM4, ccr_val);
}
/*************************************************************************************************
* 函数名: CHG_LIMIT_PWM_Adjust
* 参 数: 无
* 返回值: 无
* 描 述: pwm限流,根据电流来计算占空比,53.4V 10A时占空比为93.0
*************************************************************************************************/
void CHG_LIMIT_PWM_Adjust(void)
{
int16_t cur_diff = bmsMem.packCurrent - BASE_CURRENT;
//根据电流差值调整占空比,变化越大电流波动越大
if(cur_diff >= 9000)
{
//电流超过目标9A以上,快速减小占空比(步长5.00,因为大电流有风险)
duty_cycle -= 5.00f;
}
else if(cur_diff >= 5000)
{
//电流超过目标5A以上,快速减小占空比(步长1.50,因为大电流有风险)
duty_cycle -= 1.50f;
}
else if(cur_diff >= 2000)
{
//电流超过目标2A以上,中速减小占空比(步长0.30)
duty_cycle -= 0.30f;
}
else if(cur_diff >= 1000)
{
//电流超过目标1A以上,中速减小占空比(步长0.20)
duty_cycle -= 0.20f;
}
else if(cur_diff >= 500)
{
//电流超过目标0.5A以上,慢速减小占空比(步长0.05)
duty_cycle -= 0.05f;
}
else if(cur_diff >= 100)
{
//电流超过目标0.5A以上,慢速减小占空比(步长0.01)
duty_cycle -= 0.01f;
}
else if(cur_diff <= -9000)
{
//电流低于目标9A以上,快速增大占空比(步长2.00)
duty_cycle += 2.00f;
}
else if(cur_diff <= -5000)
{
//电流低于目标5A以上,快速增大占空比(步长1.00)
duty_cycle += 1.00f;
}
else if(cur_diff <= -2000)
{
//电流低于目标3A以上,中速增大占空比(步长0.30)
duty_cycle += 0.30f;
}
else if(cur_diff <= -1000)
{
//电流低于目标1A以上,中速增大占空比(步长0.20)
duty_cycle += 0.20f;
}
else if(cur_diff <= -500)
{
//电流低于目标0.5A以上,慢速增大占空比(步长0.05)
duty_cycle += 0.05f;
}
else if(cur_diff <= -100)
{
//电流低于目标0.5A以上,慢速增大占空比(步长0.01)
duty_cycle += 0.01f;
}
else
{
//电流差在±500mA(0.5A)以内,占空比保持不变
duty_cycle = old_duty;
}
//限制占空比范围
if(duty_cycle < MIN_DUTY)
{
duty_cycle = MIN_DUTY;
}
else if(duty_cycle > MAX_DUTY)
{
duty_cycle = MAX_DUTY;
}
old_duty = duty_cycle;
PWM_Set_Duty_Percent(duty_cycle);
}
+793
View File
@@ -0,0 +1,793 @@
/**
******************************************************************************
* @file gpio.c
* @author Jerry Cai
* @version V2.1
* @date 19-April-2022
* @brief gpio program body.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "rtc.h"
#include "global.h"
#define sleepEnd 60*(paraMem.sleep_min_disable&0x7FFF) //休眠1等待时长min,单位1s
#define sleep2End 60*(paraMem.sleep2_min_disable&0x7FFF) //休眠2等待时长min,单位1s
#define sleep2Vol paraMem.sleep2_vol //休眠方案2对应休眠电压,单位1mV
#define uvoffEnd 300 //强制欠压复位等待时长5min,单位1s
#define ocvEnd 60*(paraMem.ocv_min_disable&0x7FFF) //开路电压校准等待时长min,单位1s
#define fcccaliEnd 60*(paraMem.cali_min_disable&0x7FFF) //校准满充容量等待时长min,单位1s
_calendar_obj calendar; //时钟结构体
_calendar_obj calendar_WRITE;
_calendar_obj calendar_BACKUP;
uint8_t const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //平年的月修正数据表(基准是1900年1月1日),闰年其他相同只是1.2月要-1
const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年的月份日期表.闰年的2月有29天
uint32_t timecount; //当前计时s
uint32_t oldtimecnt; //上一秒的计时s
uint8_t LSEErrFlag; //外部低频晶振有问题的标志,需要让屏幕的时间不再显示
uint8_t LSEErrCount;//时间不走的计数,满足了会把时间清零,标志置1
uint8_t sleep_flag; //休眠执行标志位
uint8_t sleep_enableflag;//开启休眠功能标志位
uint32_t sleeptimecount; //休眠1的计时起点s
uint32_t sleeptime; //休眠启动的倒计时数
uint32_t sleep2timecount; //休眠2的计时起点s
uint32_t sleep2time; //休眠2启动的倒计时数
uint32_t uvofftimecount; //关闭欠压功能后的计时起点
uint16_t uvofftime; //关闭欠压功能的倒计时数(会在屏幕显示故只设uint16)
uint32_t ocvtimecount; //开路电压法的计时起点
uint32_t ocvtime; //开路电压法的倒计时数
uint32_t fcc_Calitimecount; //校准满充容量的计时起点
uint32_t fcc_Calitime; //校准满充容量的倒计时数,超过则不可更新
uint8_t RTC_UpdateFlag; //起始点刷新标志位,用以刷新休眠和欠压强制复位的时间
/*
* 函数名:Is_Leap_Year
* 描述 :判断是否为闰年
月份 1 2 3 4 5 6 7 8 9 10 11 12
闰年 31 29 31 30 31 30 31 31 30 31 30 31
非闰年 31 28 31 30 31 30 31 31 30 31 30 31
* 输入 :年份
* 输出 :该年份是不是闰年.1,是.0,不是
* 调用
*/
uint8_t Is_Leap_Year(uint8_t yed)
{
uint8_t year;
year=2000+yed;
if(year%4==0) //必须能被4整除
{
if(year%100==0)
{
if(year%400==0)
return 1;//如果以00结尾,还要能被400整除
else
return 0;
}
else
{
return 1;
}
}
else
{
return 0;
}
}
/*
* 函数名:RTC_Get_Week
* 描述 :输入公历日期得到星期
* 输入 :公历年月日
* 输出 :星期号
* 调用
*/
uint8_t RTC_Get_Week(uint8_t ye, uint8_t month, uint8_t day)
{
uint16_t temp2;
uint16_t year;
uint8_t yearH,yearL;
ye=ye/16*10+ye%16; //十六进制转十进制
month=month/16*10+month%16;
day=day/16*10+day%16;
year=2000+ye; //(输入格式决定了必定是21世纪)
yearH=year/100;//用于判断是21世纪
yearL=year%100;//用于计算多的年数
//计算自1900年1月1日以来积累的多出来的天数
temp2=yearL+yearL/4; //平年365%7=1 闰年366%7=2 (自动把可以略去的7的倍数略掉了)(不用计算/100和/400)
temp2=temp2%7;
temp2=temp2+day+table_week[month-1];
// 21世纪需要加6(因为1900年1月1日是星期一,2000年1月1日是星期六)
if(yearH == 20)
{
temp2+=6;
}
//若日期是闰年的1.2月,星期修正要-1
if(yearL%4==0&&month<3)
{
temp2--;
}
return(temp2%7!=0)?temp2%7:7; //周一到周日=1~7
}
/*
* 函数名:RTC_Get
* 描述 :根据RTC计算器值计算当前年/月/日/时/分/秒/星期放入calendar结构体
* 输入 :无
* 输出 :0,成功;其他:错误代码
* 调用
*/
uint8_t RTC_Get(void)
{
static uint16_t daycnt=0;
uint32_t temp=0;
uint16_t temp1=0;
uint16_t tempppy;
timecount=RTC_GetCounter();
/*时分秒的计算*/
#if LTE_Conn
temp=(timecount+28800)/86400; //得到(总秒钟数对应的)天数 //在计算年月日时,中国时区-8h
#else
temp=timecount/86400; //得到(总秒钟数对应的)天数
#endif
if(daycnt!=temp)//超过一天了
{
daycnt=temp;
temp1=1970; //计算年份,从1970年开始
while(temp>=365)
{
if(Is_Leap_Year(temp1))//闰年-366
{
if(temp>=366)temp-=366;
else {temp1++;break;}
}
else temp-=365; //平年-365
temp1++;
}
tempppy=temp1;
temp1=0; //计算月份,最后的temp就是日期
while(temp>=28)
{
if(Is_Leap_Year(tempppy)&&temp1==1)//闰年且是2月份-29
{
if(temp>=29)temp-=29;
else break;
}
else
{
if(temp>=mon_table[temp1])temp-=mon_table[temp1];//其他都按表上来
else break;
}
temp1++;
}
tempppy=tempppy-2000;//得到年份
calendar.w_year =(tempppy/10)*16+(tempppy%10);
temp1=temp1+1; //得到月份
calendar.w_month=(temp1/10)*16+(temp1%10);
temp=temp+1; //得到日期
calendar.w_date=(temp/10)*16+(temp%10);
}
#if LTE_Conn
temp=(timecount+28800)%86400; //得到(去掉天数后 当天的)秒钟数 //在计算年月日时,中国时区-8h
#else
temp=timecount%86400; //得到(去掉天数后 当天的)秒钟数
#endif
tempppy=temp/3600; //得到小时
calendar.hour=(tempppy/10)*16+(tempppy%10);
tempppy=(temp%3600)/60;//得到分钟
calendar.min=(tempppy/10)*16+(tempppy%10);
tempppy=(temp%3600)%60;//得到秒钟
calendar.sec=(tempppy/10)*16+(tempppy%10);
calendar.week=RTC_Get_Week(calendar.w_year,calendar.w_month,calendar.w_date);//获取星期
/*判断合法*/
//在初始化后的第一次调用时,oldtimecnt还未赋值,此时将合法的当前时间写入EEPROM
if(oldtimecnt==0)
{
oldtimecnt = timecount;
if(calendar.w_month != 0)
{
uint8_t tmpRd[6];
tmpRd[0] = calendar.w_year;
tmpRd[1] = calendar.w_month;
tmpRd[2] = calendar.w_date;
tmpRd[3] = calendar.hour;
tmpRd[4] = calendar.min;
tmpRd[5] = calendar.sec;
EEPROM_WrMulByte(EE_TIME_BACKUP,tmpRd);
delay_ms(5);
}
}
//当时钟一直不走,判定有问题
if(timecount==oldtimecnt)
{
LSEErrCount++;
if(LSEErrCount>10)
{
LSEErrFlag=1;
sleep_Moni_Count=SLEEP_MON_CNT;
sleep2_Moni_Count = SLEEP2_MON_CNT;
calendar.w_year = 0; //结构体清零,方便此时的报警记录计入的时间为全0无效值
calendar.w_month = 0;
calendar.w_date = 0;
calendar.week = 0;
calendar.hour = 0;
calendar.min = 0;
calendar.sec = 0;
return 1; //数据异常,返回1
}
}
else
{
LSEErrCount=0;
oldtimecnt = timecount;
}
//休眠功能-RTC,比较当前秒与开始秒的差别来定时
//方案1
if((sleep_flag == 0) && ((sleep_enableflag & 0x01) != 0)) //未进入休眠+启用休眠方案1
{
if(sleeptimecount != 0)
{
if(RTC_UpdateFlag == 1)
{
sleeptimecount = timecount - (sleepEnd - sleeptime); //更新起始点=当前时间-已消耗时间,此时剩余时间保持原值
}
else
{
sleeptime = sleepEnd - (timecount - sleeptimecount); //更新剩余时间
}
if((sleeptime == 0) || (sleeptime > sleepEnd))
{
sleep_flag = 1;
#if LTE_Conn
pre_sleep_flag = 2;
pre_sleep_waitCnt = 0;
sleepOn_time=timecount;
#endif
}
}
else
{
sleeptimecount = timecount;
}
}
//方案2
if((sleep_flag == 0) && ((sleep_enableflag & 0x02) != 0)) //未进入休眠+启用休眠方案2
{
//满足休眠电压,无充电电流
if((cellVoltageMin <= sleep2Vol) && (bmsMem.packCurrent < 500))
{
if(sleep2timecount != 0)
{
if(RTC_UpdateFlag == 1)
{
sleep2timecount = timecount - (sleep2End - sleep2time); //更新起始点=当前时间-已消耗时间,此时剩余时间保持原值
}
else
{
sleep2time = sleep2End - (timecount - sleep2timecount); //更新剩余时间
}
if((sleep2time == 0) || (sleep2time > sleep2End))
{
#if Key_PressLong
power_old = 4; //写入关机
power_state = 0;
#else
sleep_flag = 1;
#if LTE_Conn
pre_sleep_flag = 2;
pre_sleep_waitCnt = 0;
sleepOn_time=timecount;
#endif
#endif
}
}
else
{
sleep2timecount = timecount;
}
}
//否则停止计时
else
{
sleep2timecount = 0;
}
}
//不启用任何休眠方案
if(sleep_enableflag == 0)
{
sleep_flag = 0;
}
//屏幕手动关欠压启动了
if((bmsMem.balanceStatus & 0x20) != 0)
{
if(RTC_UpdateFlag == 1)
{
uvofftimecount = timecount - (uvoffEnd - uvofftime); //更新起始点=当前时间-已消耗时间,此时剩余时间保持原值
}
else
{
uvofftime = uvoffEnd - (timecount - uvofftimecount);
}
if((uvofftime == 0) || (uvofftime > uvoffEnd)) //防止反向溢出
{
bmsMem.balanceStatus &= 0xffdf;
}
}
//开路电压法校准SOC启动了
if(OCV_Wait_flag == 1)
{
if(RTC_UpdateFlag == 1)
{
ocvtimecount = timecount - (ocvEnd - ocvtime); //更新起始点=当前时间-已消耗时间,此时剩余时间保持原值
}
else
{
ocvtime = ocvEnd - (timecount - ocvtimecount);
}
if((ocvtime == 0) || (ocvtime > ocvEnd)) //防止反向溢出
{
OCV_CaliSOC_flag = 1;
}
}
//充电校准满充容量的倒计时启动了
if(fcc_CaliStartFlag == 1)
{
if(RTC_UpdateFlag == 1)
{
fcc_Calitimecount = timecount - (fcccaliEnd - fcc_Calitime); //更新起始点=当前时间-已消耗时间,此时剩余时间保持原值
}
else
{
fcc_Calitime = fcccaliEnd - (timecount - fcc_Calitimecount);
}
if((fcc_Calitime == 0) || (fcc_Calitime > fcccaliEnd)) //防止反向溢出
{
fcc_CaliStartFlag = 0;
EEPROM_WrMulByte(EE_FCC_TIME,ClearEE);
delay_ms(5);
}
}
//该刷新的都刷新后,标志置0
if(RTC_UpdateFlag != 0)
{
RTC_UpdateFlag = 0;
}
return 0;
}
/*
* 函数名:RTC_Set
* 描述 :把输入的年/月/日/时/分/秒转换为秒钟 写入RTC计数器
以1970年1月1日为基准
* 输入 :无
* 输出 :0,成功;1:错误代码
* 调用
*/
uint8_t RTC_Set(uint8_t ear,uint8_t smon,uint8_t sday,uint8_t hour,uint8_t min,uint8_t sec)
{
uint16_t t,syear;
uint32_t seccount=0;
ear=(ear/16)*10+ear%16;
smon=(smon/16)*10+smon%16;
sday=(sday/16)*10+sday%16;
hour=(hour/16)*10+hour%16;
min=(min/16)*10+min%16;
sec=(sec/16)*10+sec%16;
syear=2000+ear;
if(syear<1970||syear>2099) //1970~2099年为合法年份
{
return 1;
}
for(t=1970;t<syear;t++) //把所有年份的秒钟相加
{
if(Is_Leap_Year(t))seccount+=31622400;//闰年的秒钟数
else seccount+=31536000; //平年的秒钟数
}
smon-=1;
for(t=0;t<smon;t++) //把前面月份的秒钟数相加
{
seccount+=(u32)mon_table[t]*86400; //各月份的秒钟数
if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//闰年2月份增加一天的秒钟数
}
seccount+=(u32)(sday-1)*86400; //把前面日期的秒钟数相加
seccount+=(u32)hour*3600;//小时的秒钟数
seccount+=(u32)min*60; //分钟的秒钟数
seccount+=sec; //最后的秒钟加上去
#if LTE_Conn
//4G的timecount是世界时间,中国对应显示需+8h,存储就要比电脑写入的少8h=28800s
seccount -= 28800;
#endif
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
PWR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问
RTC_SetCounter(seccount); //设置RTC计数器的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
//RTC_Get();
return 0;
}
/*
* 函数名:RTC_GetSynchro
* 描述 :由函数RTC_WaitForSynchro()改得,增加超时判断说明晶振出现问题
* 输入 :无
* 输出 :0,成功;1:错误代码
* 调用
*/
uint8_t RTC_GetSynchro(void)
{
uint16_t temp=0;
/* Clear RSF flag */
RTC->CRL &= (uint16_t)~RTC_FLAG_RSF;
/* Loop until RSF flag is set */
while ((RTC->CRL & RTC_FLAG_RSF) == (uint16_t)RESET)
{
temp++;
if(temp>=2000) return 1; //初始化时钟失败,晶振有问题
delay_ms(1); //1ms延时,总共2s
}
return 0;
}
/*
* 函数名:uf_RTC_Init
* 描述 :RTC初始化配置.第一次配置时会写入2023-6-25 14:00:00.
* 输入 :无
* 输出 :0,成功;1:错误代码
* 调用
*/
//开机执行一次
//第一次配置写入2023-6-25 14:00:00,此后正常读RTC后备寄存器的存值。若RTC值意外丢失则读EEPROM存值使用
uint8_t uf_RTC_Init(void)
{
uint16_t temp=0;
uint8_t tmpRd[6];
//上电读备份的时间信息
EEPROM_RdMulByte(EE_TIME_BACKUP,tmpRd);
if((tmpRd[0]!=0xff) && (tmpRd[1]!=0xff) && (tmpRd[2]!=0xff) && (tmpRd[3]!=0xff) && (tmpRd[4]!=0xff) && (tmpRd[5]!=0xff)) //时分秒格式存储,不可能存在0xff
{
calendar_BACKUP.w_year = tmpRd[0];
calendar_BACKUP.w_month = tmpRd[1];
calendar_BACKUP.w_date = tmpRd[2];
calendar_BACKUP.hour = tmpRd[3];
calendar_BACKUP.min = tmpRd[4];
calendar_BACKUP.sec = tmpRd[5];
}
else
{
//0x23,0x06,0x25,0x14,0x00,0x00
calendar_BACKUP.w_year = 0x23;
calendar_BACKUP.w_month = 0x06;
calendar_BACKUP.w_date = 0x25;
calendar_BACKUP.hour = 0x14;
calendar_BACKUP.min = 0x00;
calendar_BACKUP.sec = 0x00;
}
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
if(BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //检查是不是第一次配置时钟
{
// /*使用内部低速晶振*/
// BKP_DeInit(); //复位备份区域
// RCC_LSICmd(ENABLE); //使能LSI时钟
// while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) //等待LSI晶振就绪
// {
// temp++;
// if(temp>=5000) return 1; //持续5s无法起振,初始化时钟失败,晶振有问题
// delay_ms(1); // 1ms延时
// }
// RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //设置RTC时钟(RTCCLK),选择LSI作为RTC的时钟源
// RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
// RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
// RTC_WaitForSynchro(); //等待RTC寄存器同步
// RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
// RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
// RTC_EnterConfigMode(); //允许配置
// RTC_SetPrescaler(40000 - 1); //设置RTC预分频的值40kHz
// RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
// /*使用内部低速晶振*/
/*使用外部低速晶振*/
BKP_DeInit(); //复位备份区域
RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
{
temp++;
if(temp>=5000) return 1; //持续5s无法起振,初始化时钟失败,晶振有问题
delay_ms(1); // 1ms延时
}
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_EnterConfigMode(); // 允许配置
RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
/*使用外部低速晶振*/
//RTC_Set(0x23,0x06,0x25,0x14,0x00,0x00);
RTC_Set(calendar_BACKUP.w_year,calendar_BACKUP.w_month,calendar_BACKUP.w_date,calendar_BACKUP.hour,calendar_BACKUP.min,calendar_BACKUP.sec);
RTC_ExitConfigMode(); //退出配置模式
BKP_WriteBackupRegister(BKP_DR1, 0x5050); //向指定的后备寄存器中写入指定数据
}
else//系统继续计时
{
// /*使用内部低速晶振*/
// RCC_LSICmd(ENABLE); //使能LSI时钟
// while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) //等待LSI晶振就绪
// {
// temp++;
// if(temp>=5000) return 1; //持续5s无法起振,初始化时钟失败,晶振有问题
// delay_ms(1); // 1ms延时
// }
// RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
// /*使用内部低速晶振*/
if(RTC_GetSynchro() == 1)return 1; //等待RTC寄存器同步 //10.8 晶振坏了这里会卡死,所以增加超时失败退出
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
}
/**更多功能**/
//更新当前时间
timecount=RTC_GetCounter();
//若启用休眠1,则以当前秒数为起始点
if((paraMem.sleep_min_disable & 0x8000) == 0) //0代表启用休眠
{
sleep_enableflag |= 0x01;
sleeptimecount=timecount;
}
else
{
sleep_enableflag &= 0xfe;
}
//若启用休眠2,则判断此时最低电压是否满足条件,满足则以当前秒数为起始点
if((paraMem.sleep2_min_disable & 0x8000) == 0) //0代表启用休眠
{
sleep_enableflag |= 0x02;
//满足休眠电压,无均衡,无电流
if((cellVoltageMin <= sleep2Vol) && ((bmsMem.balanceStatus & 0x0001) == 0) && (bmsMem.packCurrent > (-200)) && (bmsMem.packCurrent < 200))
{
//无除过压以外的保护
if(((bmsMem.bStatus1 & 0x067e) == 0) && ((bmsMem.bStatus2 & 0x00ff) == 0) && ((bmsMem.bStatus3 & 0x0008) == 0) && ((bmsMem.temperaStatus & 0x0f7f) == 0))
{
sleep2timecount=timecount;
}
}
}
else
{
sleep_enableflag &= 0xfd;
}
return 0; //ok
}
/*
* 函数名:uf_RTC_Update
* 描述 :将calendar_WRITE结构体的值写入RTC时间
* 输入 :无
* 输出 :0,成功;1:错误代码
* 调用
*/
uint8_t uf_RTC_Update(void)
{
if(calendar_WRITE.w_month != 0) //有写入的数组
{
uint16_t temp=0;
uint8_t Wrtime[6];
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
// /*使用内部低速晶振*/
// BKP_DeInit(); //复位备份区域
// RCC_LSICmd(ENABLE); //使能LSI时钟
// while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) //等待LSI晶振就绪
// {
// temp++;
// if(temp>=5000) return 1; //持续5s无法起振,初始化时钟失败,晶振有问题
// delay_ms(1); // 1ms延时
// }
// RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //设置RTC时钟(RTCCLK),选择LSI作为RTC的时钟源
// RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
// RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
// RTC_WaitForSynchro(); //等待RTC寄存器同步
// RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
// RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
// RTC_EnterConfigMode(); //允许配置
// RTC_SetPrescaler(40000 - 1); //设置RTC预分频的值40kHz
// RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
// /*使用内部低速晶振*/
/*使用外部低速晶振*/
BKP_DeInit(); //复位备份区域
RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
{
temp++;
if(temp>=5000) return 1; //持续5s无法起振,初始化时钟失败,晶振有问题
delay_ms(1); // 1ms延时
}
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_EnterConfigMode(); // 允许配置
RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
/*使用外部低速晶振*/
RTC_Set(calendar_WRITE.w_year,calendar_WRITE.w_month,calendar_WRITE.w_date,calendar_WRITE.hour,calendar_WRITE.min,calendar_WRITE.sec);
RTC_ExitConfigMode(); //退出配置模式
BKP_WriteBackupRegister(BKP_DR1, 0x5050); //向指定的后备寄存器中写入用户程序数据
//刷新休眠和欠压复位的时间
RTC_UpdateFlag = 1;
//存储时间备份
Wrtime[0] = calendar_WRITE.w_year;
Wrtime[1] = calendar_WRITE.w_month;
Wrtime[2] = calendar_WRITE.w_date;
Wrtime[3] = calendar_WRITE.hour;
Wrtime[4] = calendar_WRITE.min;
Wrtime[5] = calendar_WRITE.sec;
EEPROM_WrMulByte(EE_TIME_BACKUP,Wrtime);
delay_ms(5);
//清零
calendar_WRITE.w_year = 0;
calendar_WRITE.w_month = 0;
calendar_WRITE.w_date = 0;
calendar_WRITE.week = 0;
calendar_WRITE.hour = 0;
calendar_WRITE.min = 0;
calendar_WRITE.sec = 0;
}
return 0; //ok
}
//用于处理因各种原因需要的时间备份
int32_t oldCur;
void RTC_BackUp(void)
{
uint8_t WrFlag=0;
//当正在充放电,开始时记录一次,之后每5分钟记录一次
if(bCHGING == 1)
{
if(oldCur <= 0) //原来在放电或待机
{
WrFlag = 1;
oldCur = bmsMem.packCurrent;
}
if((calendar.min%5 == 0x00) && (calendar.sec == 0x00))
{
WrFlag = 1;
}
}
else if(bDSGING == 1)
{
if(oldCur >= 0) //原来在充电或待机
{
WrFlag = 1;
oldCur = bmsMem.packCurrent;
}
if((calendar.min%5 == 0x00) && (calendar.sec == 0x00))
{
WrFlag = 1;
}
}
//在待机状态,每1h记录一次
else
{
oldCur = 0;
if((calendar.min == 0x00) && (calendar.sec == 0x00))
{
WrFlag = 1;
}
}
//需要写入备份时间,执行
if(WrFlag == 1)
{
if(calendar.w_month != 0)
{
uint8_t tmpRd[6];
tmpRd[0] = calendar.w_year;
tmpRd[1] = calendar.w_month;
tmpRd[2] = calendar.w_date;
tmpRd[3] = calendar.hour;
tmpRd[4] = calendar.min;
tmpRd[5] = calendar.sec;
EEPROM_WrMulByte(EE_TIME_BACKUP,tmpRd);
delay_ms(5);
}
}
}
+28
View File
@@ -0,0 +1,28 @@
#ifndef __RTC_H
#define __RTC_H
#include "stm32f10x.h"
//时间结构体
typedef struct
{
vu8 sec;
vu8 min;
vu8 hour;
vu8 week;
vu8 w_date;
vu8 w_month;
vu8 w_year;
}_calendar_obj;
extern _calendar_obj calendar; //日历结构体
extern _calendar_obj calendar_WRITE;
extern _calendar_obj calendar_BACKUP;
extern uint8_t uf_RTC_Init(void);
extern uint8_t uf_RTC_Update(void); //用于上位机修改时间
extern uint8_t RTC_Set(uint8_t ear,uint8_t smon,uint8_t sday,uint8_t hour,uint8_t min,uint8_t sec);
extern uint8_t RTC_Get(void);
extern void RTC_BackUp(void);
#endif
+234
View File
@@ -0,0 +1,234 @@
/**
******************************************************************************
* @file spi.c
* @author
* @version
* @date
* @brief SPI通信程序,用于与AFE芯片(SH3673520)通信
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
//SH3673517 SPI通信
//PB12 = SPI1_CS (GPIO推挽输出,软件控制片选)
//PB13 = SPI1_SCK (AF1) - 时钟
//PB14 = SPI1_MISO(AF1) - 主机输入从机输出
//PB15 = SPI1_MOSI(AF0) - 主机输出从机输入
#define PIN_SPI_NSS GPIO_Pin_12
#define PIN_SPI_SCK GPIO_Pin_13
#define PIN_SPI_MISO GPIO_Pin_14
#define PIN_SPI_MOSI GPIO_Pin_15
#define SPI_Enable() GPIO_ResetBits(GPIOB, PIN_SPI_NSS) //使能通信
#define SPI_Disable() GPIO_SetBits(GPIOB, PIN_SPI_NSS) //关闭通信
/*
SPI_MOSI PB15 主设备输出,从设备输入
SPI_MISO PB14 主设备输入,从设备输出
SPI_SCK PB13 时钟
SPI_CS PB12 片选信号
*/
void uf_SPI2_Init(void)
{
/*定义SPI参数*/
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
// 使能SPI2和GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
// PB13 (SCK), PB15 (MOSI)
GPIO_InitStructure.GPIO_Pin = PIN_SPI_SCK | PIN_SPI_MOSI;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// PB14 (MISO)
GPIO_InitStructure.GPIO_Pin = PIN_SPI_MISO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// PB12 (CS)
GPIO_InitStructure.GPIO_Pin = PIN_SPI_NSS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, PIN_SPI_NSS); //初始化拉高CS,关闭SPI通信
/*配置SPI模式*/
SPI_I2S_DeInit(SPI2);
// 配置SPI2与AFE芯片的SPI3通信方式:4线通信,全双工,主模式,数据同边传输,MSB在前
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全双工模式
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //数据帧大小为 8 位
// 配置SPI3极性参数CPOL和CPHA
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //时钟极性为1,空闲时SCK电平状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //时钟相位为1,在第二个跳变沿开始采样数据(第一个跳变沿,失效)
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件控制 NSS 信号(PB12)
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;//波特率预分频系数为 64 //36MHz/64 = 0.5625MHz < 1MHz
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值的生成多项式=x^8+x^2+x+1,省略高位,可为任意值1,只用到低8位,生成二进制编码为0000111=7
SPI_Init(SPI2, &SPI_InitStructure);
// 使能SPI2
SPI_Cmd(SPI2, ENABLE);
}
//通信失败时,复位SPI
void SPI2_Error(void)
{
//写也无法确有效,因为需要时序
//这里重新初始化SPI
uf_SPI2_Init();
}
//AFE只支持单字节写操作
//可写地址 40H~59H
//rtnval 0-true; other-false
uint8_t AFE_WriteOneByte(uint8_t addr, uint8_t *data)
{
uint8_t tx_buffer[5], rx_buffer[5];
uint8_t i;
uint8_t response;
// 构造发送数据帧: [0x01][reg_addr][write_data][CRC][0x00]
tx_buffer[0] = 0x01; // 写命令
tx_buffer[1] = addr; // 寄存器地址
tx_buffer[2] = *data; // 写入数据
tx_buffer[3] = CRC8_Cal(tx_buffer, 3); // CRC8
tx_buffer[4] = 0x00; // 无效数据接收
// 拉低CS片选
SPI_Enable();
for (i = 0; i < 5; i++)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, tx_buffer[i]);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
rx_buffer[i] = SPI_I2S_ReceiveData(SPI2);
}
// 获取返回值
response = rx_buffer[4];
SPI_Disable();
delay_us(5);
return (response == 0xA5) ? 0 : 1;
}
//AFE可1次读取多个字节操作
//可读取地址 40H~99H
//rtnval 0-success, other-fail
uint8_t AFE_ReadMulByte(uint8_t addr, uint8_t lenth, uint8_t *data)
{
uint8_t tx_buffer[4]; // 发送缓冲区
uint8_t rx_buffer[40]; // 接收缓冲区,最大可读取24字节,留有余量
uint8_t crc_calculated, crc_received;
uint8_t i;
// 构造发送数据帧: [0x02][reg_addr][data_length][0x00]
tx_buffer[0] = 0x02; // 读命令
tx_buffer[1] = addr; // 寄存器地址
tx_buffer[2] = lenth; // 数据长度
tx_buffer[3] = 0x00;
// 拉低CS片选
SPI_Enable();
// 第一阶段:发送时钟和命令,发送(命令/地址/长度/0x00) 接收(0xFF/命令/地址/长度)
for( i=0; i<4; i++)
{
while(!SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)); // 等待发送缓冲区空
SPI_I2S_SendData(SPI2, tx_buffer[i]);
while(!SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE)); // 等待接收完成
rx_buffer[i] = SPI_I2S_ReceiveData(SPI2);
}
// 第二阶段:接收有效数据(0x00)发送接收数据(需要提供接收时钟)
for( i=0; i<lenth; i++)
{
while(!SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE));
SPI_I2S_SendData(SPI2, 0x00); // 发送无效数据维持时钟
while(!SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE));
rx_buffer[4+i] = SPI_I2S_ReceiveData(SPI2);
}
// 第三阶段:接收CRC
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, 0x00);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
rx_buffer[4 + lenth] = SPI_I2S_ReceiveData(SPI2);
// 拉高CS片选
SPI_Disable();
delay_us(5);
// 校验应头(发送时同时接收)
if(rx_buffer[0] != 0xFF || // 第一个字节应为0xFF
rx_buffer[1] != 0x02 || // 回显读命令
rx_buffer[2] != addr || // 回显寄存器地址
rx_buffer[3] != lenth) // 回显数据长度
{
return 0; // 头部校验失败
}
// 提取有效数据(跳过前4个应答字节)
for (i = 0; i < lenth; i++)
{
data[i] = rx_buffer[4 + i]; // 跳过0xFF、命令、地址、长度
}
crc_received = rx_buffer[4 + lenth]; // 最后1字节为CRC
// CRC计算范围:0xFF + 命令 + 地址 + 长度 + 数据,直到CRC前
crc_calculated = CRC8_Cal(&rx_buffer[0], 4 + lenth);
return (crc_received == crc_calculated) ? 0 : 1;
}
//软件复位
//rtnval 0-success, other-fail
uint8_t AFE_Reset(void)
{
uint8_t tx_buffer[5], rx_buffer[5];
uint8_t response;
uint8_t i = 0;
// 构造发送数据帧: [0x0B][0xBB][0xCC][CRC][0x00]
tx_buffer[0] = 0x0B; // 复位命令
tx_buffer[1] = 0xBB; // 固定参数1
tx_buffer[2] = 0xCC; // 固定参数2
tx_buffer[3] = CRC8_Cal(tx_buffer, 3); // CRC8
tx_buffer[4] = 0x00; // 无效数据接收
// 拉低CS片选
SPI_Enable();
for ( i = 0; i < 5; i++)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, tx_buffer[i]);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
rx_buffer[i] = SPI_I2S_ReceiveData(SPI2);
}
// 获取返回值
response = rx_buffer[4];
// 拉高CS片选
SPI_Disable();
return (response == 0xA5) ? 0 : 1;
}
+52
View File
@@ -0,0 +1,52 @@
#ifndef __SYS_H
#define __SYS_H
#include "stm32f10x.h"
//位带操作,实现51类似的GPIO控制功能
//IO口操作宏定义
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
//确保n的值小于16!
//IO口操作,只对单一的IO口!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
#endif
+78
View File
@@ -0,0 +1,78 @@
/**
******************************************************************************
* @file tim.c
* @author Jerry
* @version V2.1
* @date 19-April-2022
* @brief tim program body.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
//相对精确的ms延时,不使用中断
//优化:防止和其他中断冲突,导致卡死
void delay_ms(uint16_t ms)
{
uint16_t i;
volatile uint32_t tempreg;
uint32_t timeout; //等待时间
for(i=0; i<ms; i++)
{
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
SysTick->LOAD = 72000 - 1;
SysTick->VAL = 0;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
timeout = 72000;
do
{
tempreg = SysTick->CTRL;
timeout--;
if(timeout == 0)
{
break; //超时退出
}
}
while( (tempreg & SysTick_CTRL_COUNTFLAG_Msk) ==0);
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0;
}
}
//相对精确的us延时,不使用中断
//(没调用过)
void delay_us(uint16_t us)
{
uint16_t i;
volatile uint32_t tempreg;
for(i=0; i<us; i++)
{
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
SysTick->LOAD = 72;
SysTick->VAL = 0;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
do
{
tempreg = SysTick->CTRL;
}
while( (tempreg & SysTick_CTRL_COUNTFLAG_Msk) ==0);
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0;
}
}
+231
View File
@@ -0,0 +1,231 @@
/**
******************************************************************************
* @file tim.c
* @author Jerry
* @version V2.1
* @date 19-April-2022
* @brief tim program body.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
uint32_t tmrSys = 0;
uint32_t tmrTemp[20];
//10MS
void uf_TIM3_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 10000-1;
TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //主定时器 优先级:0,0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE );
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
//10ms中断
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源
tmrSys++;
KEY_TIM_Moni();
Cali_SOC_Moni();
Screen_TIM_Moni(); //[陶晶驰]
CAN_TIM_Moni();
MODBUS_TIM_Moni();
MODBUS1_TIM_Moni();
// DI_TIM_Moni();
// DI_Ctrl();
OCC2_TIM_Moni();
OCC2_Ctrl();
#if Addr_SetAuto
//休眠时,地址变动暂停
if(sleep_flag == 0)
{
if(paraMem.addr_FREE_Flg == 0) ADDR_Rank_Moni();
if(paraMem.addr_FREE_Flg == 0) ADDR_Assign_Moni();
}
#endif
//只有RTC时钟有问题时,才会启用下列函数
if(LSEErrFlag==1)
{
SLEEP_TIM_Moni(); //休眠的倒计时
SLEEP2_TIM_Moni(); //休眠2的倒计时
UVOff_TIM_Moni(); //欠压强制复位的倒计时
FCCCali_TIM_Moni(); //容量校准要在12h内的倒计时
}
if(Screen_RevFlg == 1) //屏幕收到完整一帧去处理
{
Screen_RevCount++;
if(Screen_RevCount > 1)
{
Screen_RevFlg = 0;
Screen_RevCount = 0;
//Screen_IT_Update();
Screen_RevHandlerFlg = 1;
}
}
if(MODBUS_RevFlg == 1) //MODBUS收到完整一帧去处理
{
MODBUS_RevCount++;
if(MODBUS_RevCount > 1)
{
MODBUS_RevFlg = 0;
MODBUS_RevCount = 0;
MODBUS_IT_TIMUpdate();
}
}
if(MODBUS1_RevFlg == 1) //MODBUS1收到完整一帧去处理
{
MODBUS1_RevCount++;
if(MODBUS1_RevCount > 1)
{
MODBUS1_RevFlg = 0;
MODBUS1_RevCount = 0;
MODBUS1_IT_TIMUpdate();
}
}
/*三选一模块*/
#if BLE_Conn
BLE_TIM_Moni(); //BLE无通信定时初始化
if(BLE_RevFlg == 1) //BLE收到完整一帧去处理
{
BLE_RevCount++;
if(BLE_RevCount > 3)
{
BLE_RevFlg = 0;
BLE_RevCount = 0;
BLE_IT_Update();
}
}
#endif
#if WIFI_Conn
WIFI_TIM_Moni(); //WIFI无通信定时初始化
if(WIFI_RevFlg == 1) //WIFI收到完整一帧去处理
{
WIFI_RevCount++;
if(WIFI_RevCount > 3)
{
WIFI_RevFlg = 0;
WIFI_RevCount = 0;
WIFI_IT_Update();
}
}
#endif
#if LTE_Conn
LTE_TIM_Moni(); //LTE无通信定时初始化
if(LTE_RevFlg == 1) //LTE收到完整一帧去处理
{
LTE_RevCount++;
if(LTE_RevCount > 3)
{
LTE_RevFlg = 0;
LTE_RevCount = 0;
//有回复,清零等待倒计时
LTE_WaitRxFlg = 0;
LTE_WaitRxDelay = 0;
if(LTE_OTA_Flag == 0)
{
LTE_4G_IT_Update();
}
else
{
LTE_OTA_IT_Update();
}
}
}
#endif
}
}
/**************************************************************************
** 函数名: TIMER_Update
** 输 入: nothing
** 输 出: tmrSys value
** 备 注:tmrSys do ++ in the SysTick_Handler function
***************************************************************************/
uint32_t TIMER_Update(void)
{
return tmrSys;
}
/**************************************************************************
** 函数名:
** 输 入:
** 输 出:
** 备 注:
***************************************************************************/
uint32_t TIMER_IsOut(uint32_t cnt, uint32_t tmr)
{
uint32_t tmp = tmrSys;
tmp = cnt > tmp ? ( (uint32_t)(-1) - cnt + tmp ) : ( tmp-cnt );
if(tmp>=tmr)
return 1;
else
return 0;
}
/**************************************************************************
** 函数名:
** 输 入:
** 输 出:
** 备 注:
***************************************************************************/
uint32_t TIMER_IsOther(uint32_t cnt, uint32_t tmr)
{
uint32_t tmp = tmrSys;
uint32_t tmp1;
tmp = cnt > tmp ? ( (uint32_t)(-1) - cnt + tmp ) : ( tmp-cnt );
tmp1 = tmp>=tmr ? (tmp - tmr): (tmr-tmp);
return tmp1;
}
+316
View File
@@ -0,0 +1,316 @@
/**
******************************************************************************
* @file tim.c
* @author Jerry
* @version V2.1
* @date 19-April-2022
* @brief tim program body.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
uint8_t Screen_RevFlg;
uint8_t Screen_RevCount;
uint8_t Screen_RevHandlerFlg; //在主函数执行分析处理
uint8_t MODBUS_RevFlg;
uint8_t MODBUS_RevCount;
uint8_t MODBUS1_RevFlg;
uint8_t MODBUS1_RevCount;
/*三选一模块*/
#if BLE_Conn
uint8_t BLE_RevFlg;
uint8_t BLE_RevCount;
#endif
#if WIFI_Conn
uint8_t WIFI_RevFlg;
uint8_t WIFI_RevCount;
#endif
#if LTE_Conn
uint8_t LTE_RevFlg;
uint8_t LTE_RevCount;
#endif
/**RS485 网口3.4**/
//usart1 init
void uf_UART1_Init( u32 bound )
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* Enable the USART1 Pins Software Remapping */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
/* Configure USART1 Rx (PA.10) as input floating */
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //485通信主从机 优先级:3,0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
if(bmsMem.E2_485Addr == 1)
{
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); //设备做主机时关闭接收中断
}
else
{
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //设备做从机时打开接收中断
}
//USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
USART_Cmd(USART1, ENABLE);
}
//send multiple bytes
void USART1_SendMulByte(uint8_t *p, uint8_t size)
{
uint8_t i;
for(i=0;i<size;i++)
{
USART_SendData(USART1, *p);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
p++;
}
}
//usart1 interrupt
void USART1_IRQHandler(void)
{
uint8_t tmp = tmp;
if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
{
MODBUS_RevFlg = 1;
MODBUS_RevCount = 0;
MODBUS_IT_Receive();
}
}
/**屏幕**/
//usart2 init
void uf_UART2_Init( u32 bound )
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* Enable the USART1 Pins Software Remapping */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);
/* Configure USART1 Rx (PA.03) as input floating */
/* Configure USART1 Tx (PA.02) as alternate function push-pull */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //TTL通信屏幕 优先级:3,2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
//USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
USART_Cmd(USART2, ENABLE);
}
//usart2 interrupt
void USART2_IRQHandler(void)
{
uint8_t tmp = tmp;
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)
{
Screen_RevFlg = 1;
Screen_RevCount = 0;
Screen_IT_Receive();
}
}
/**RS485 网口1**/
//usart3 init
void uf_UART3_Init( u32 bound )
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* Enable the USART3 Pins Software Remapping */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART3, &USART_InitStructure);
/* Configure USART3 Rx (PB.11) as input floating */
/* Configure USART3 Tx (PB.10) as alternate function push-pull */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Enable the USART3 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //485通信上位机 优先级:3,1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //设备做从机时打开接收中断
//USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
USART_Cmd(USART3, ENABLE);
}
//send multiple bytes
void USART3_SendMulByte(uint8_t *p, uint8_t size)
{
uint8_t i;
for(i=0;i<size;i++)
{
USART_SendData(USART3, *p);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) == RESET);
p++;
}
}
//usart3 interrupt
void USART3_IRQHandler(void)
{
uint8_t tmp = tmp;
if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET)
{
MODBUS1_RevFlg = 1;
MODBUS1_RevCount = 0;
MODBUS1_IT_Receive();
}
}
/**蓝牙/WIFI/4G模块**/
//uart4 init
void uf_UART4_Init( u32 bound )
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* Enable the UART4 Pins Software Remapping */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(UART4, &USART_InitStructure);
/* Configure UART4 Rx (PC.11) as input floating */
/* Configure UART4 Tx (PC.10) as alternate function push-pull */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Enable the UART4 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //蓝牙通信 优先级:1,1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(UART4, USART_IT_RXNE, ENABLE); //打开接收中断
//USART_ITConfig(UART4, USART_IT_IDLE, ENABLE);
USART_Cmd(UART4, ENABLE);
}
//uart4 interrupt
void UART4_IRQHandler(void)
{
if(USART_GetITStatus(UART4,USART_IT_RXNE) != RESET)
{
/*三选一模块*/
#if BLE_Conn
BLE_RevFlg = 1;
BLE_RevCount = 0;
BLE_IT_Receive();
#endif
#if WIFI_Conn
WIFI_RevFlg = 1;
WIFI_RevCount = 0;
WIFI_IT_Receive();
#endif
#if LTE_Conn
LTE_RevFlg = 1;
LTE_RevCount = 0;
LTE_4G_IT_Receive();
#endif
}
}
+43
View File
@@ -0,0 +1,43 @@
/**
******************************************************************************
* @file wdg.c
* @author
* @version
* @date
* @brief
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
//初始化独立看门狗
//prer:分频数:0~7(只有低3位有效!)
//分频因子=4*2^prer.但最大值只能是256!
//rlr:重装载寄存器值:低11位有效.
//时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
void uf_IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作
IWDG_SetPrescaler(prer); //设置IWDG预分频值:设置IWDG预分频值为64
IWDG_SetReload(rlr); //设置IWDG重装载值
IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器
IWDG_Enable(); //使能IWDG
}
//喂独立看门狗
void IWDG_Feed(void)
{
IWDG_ReloadCounter();//reload
}
+784
View File
@@ -0,0 +1,784 @@
/**************************************************************************//**
* @file core_cm3.c
* @brief CMSIS Cortex-M3 Core Peripheral Access Layer Source File
* @version V1.30
* @date 30. October 2009
*
* @note
* Copyright (C) 2009 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*
******************************************************************************/
#include <stdint.h>
/* define compiler specific symbols */
#if defined ( __CC_ARM )
#define __ASM __asm /*!< asm keyword for ARM Compiler */
#define __INLINE __inline /*!< inline keyword for ARM Compiler */
#elif defined ( __ICCARM__ )
#define __ASM __asm /*!< asm keyword for IAR Compiler */
#define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */
#elif defined ( __GNUC__ )
#define __ASM __asm /*!< asm keyword for GNU Compiler */
#define __INLINE inline /*!< inline keyword for GNU Compiler */
#elif defined ( __TASKING__ )
#define __ASM __asm /*!< asm keyword for TASKING Compiler */
#define __INLINE inline /*!< inline keyword for TASKING Compiler */
#endif
/* ################### Compiler specific Intrinsics ########################### */
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
/* ARM armcc specific functions */
/**
* @brief Return the Process Stack Pointer
*
* @return ProcessStackPointer
*
* Return the actual process stack pointer
*/
__ASM uint32_t __get_PSP(void)
{
mrs r0, psp
bx lr
}
/**
* @brief Set the Process Stack Pointer
*
* @param topOfProcStack Process Stack Pointer
*
* Assign the value ProcessStackPointer to the MSP
* (process stack pointer) Cortex processor register
*/
__ASM void __set_PSP(uint32_t topOfProcStack)
{
msr psp, r0
bx lr
}
/**
* @brief Return the Main Stack Pointer
*
* @return Main Stack Pointer
*
* Return the current value of the MSP (main stack pointer)
* Cortex processor register
*/
__ASM uint32_t __get_MSP(void)
{
mrs r0, msp
bx lr
}
/**
* @brief Set the Main Stack Pointer
*
* @param topOfMainStack Main Stack Pointer
*
* Assign the value mainStackPointer to the MSP
* (main stack pointer) Cortex processor register
*/
__ASM void __set_MSP(uint32_t mainStackPointer)
{
msr msp, r0
bx lr
}
/**
* @brief Reverse byte order in unsigned short value
*
* @param value value to reverse
* @return reversed value
*
* Reverse byte order in unsigned short value
*/
__ASM uint32_t __REV16(uint16_t value)
{
rev16 r0, r0
bx lr
}
/**
* @brief Reverse byte order in signed short value with sign extension to integer
*
* @param value value to reverse
* @return reversed value
*
* Reverse byte order in signed short value with sign extension to integer
*/
__ASM int32_t __REVSH(int16_t value)
{
revsh r0, r0
bx lr
}
#if (__ARMCC_VERSION < 400000)
/**
* @brief Remove the exclusive lock created by ldrex
*
* Removes the exclusive lock which is created by ldrex.
*/
__ASM void __CLREX(void)
{
clrex
}
/**
* @brief Return the Base Priority value
*
* @return BasePriority
*
* Return the content of the base priority register
*/
__ASM uint32_t __get_BASEPRI(void)
{
mrs r0, basepri
bx lr
}
/**
* @brief Set the Base Priority value
*
* @param basePri BasePriority
*
* Set the base priority register
*/
__ASM void __set_BASEPRI(uint32_t basePri)
{
msr basepri, r0
bx lr
}
/**
* @brief Return the Priority Mask value
*
* @return PriMask
*
* Return state of the priority mask bit from the priority mask register
*/
__ASM uint32_t __get_PRIMASK(void)
{
mrs r0, primask
bx lr
}
/**
* @brief Set the Priority Mask value
*
* @param priMask PriMask
*
* Set the priority mask bit in the priority mask register
*/
__ASM void __set_PRIMASK(uint32_t priMask)
{
msr primask, r0
bx lr
}
/**
* @brief Return the Fault Mask value
*
* @return FaultMask
*
* Return the content of the fault mask register
*/
__ASM uint32_t __get_FAULTMASK(void)
{
mrs r0, faultmask
bx lr
}
/**
* @brief Set the Fault Mask value
*
* @param faultMask faultMask value
*
* Set the fault mask register
*/
__ASM void __set_FAULTMASK(uint32_t faultMask)
{
msr faultmask, r0
bx lr
}
/**
* @brief Return the Control Register value
*
* @return Control value
*
* Return the content of the control register
*/
__ASM uint32_t __get_CONTROL(void)
{
mrs r0, control
bx lr
}
/**
* @brief Set the Control Register value
*
* @param control Control value
*
* Set the control register
*/
__ASM void __set_CONTROL(uint32_t control)
{
msr control, r0
bx lr
}
#endif /* __ARMCC_VERSION */
#elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/
/* IAR iccarm specific functions */
#pragma diag_suppress=Pe940
/**
* @brief Return the Process Stack Pointer
*
* @return ProcessStackPointer
*
* Return the actual process stack pointer
*/
uint32_t __get_PSP(void)
{
__ASM("mrs r0, psp");
__ASM("bx lr");
}
/**
* @brief Set the Process Stack Pointer
*
* @param topOfProcStack Process Stack Pointer
*
* Assign the value ProcessStackPointer to the MSP
* (process stack pointer) Cortex processor register
*/
void __set_PSP(uint32_t topOfProcStack)
{
__ASM("msr psp, r0");
__ASM("bx lr");
}
/**
* @brief Return the Main Stack Pointer
*
* @return Main Stack Pointer
*
* Return the current value of the MSP (main stack pointer)
* Cortex processor register
*/
uint32_t __get_MSP(void)
{
__ASM("mrs r0, msp");
__ASM("bx lr");
}
/**
* @brief Set the Main Stack Pointer
*
* @param topOfMainStack Main Stack Pointer
*
* Assign the value mainStackPointer to the MSP
* (main stack pointer) Cortex processor register
*/
void __set_MSP(uint32_t topOfMainStack)
{
__ASM("msr msp, r0");
__ASM("bx lr");
}
/**
* @brief Reverse byte order in unsigned short value
*
* @param value value to reverse
* @return reversed value
*
* Reverse byte order in unsigned short value
*/
uint32_t __REV16(uint16_t value)
{
__ASM("rev16 r0, r0");
__ASM("bx lr");
}
/**
* @brief Reverse bit order of value
*
* @param value value to reverse
* @return reversed value
*
* Reverse bit order of value
*/
uint32_t __RBIT(uint32_t value)
{
__ASM("rbit r0, r0");
__ASM("bx lr");
}
/**
* @brief LDR Exclusive (8 bit)
*
* @param *addr address pointer
* @return value of (*address)
*
* Exclusive LDR command for 8 bit values)
*/
uint8_t __LDREXB(uint8_t *addr)
{
__ASM("ldrexb r0, [r0]");
__ASM("bx lr");
}
/**
* @brief LDR Exclusive (16 bit)
*
* @param *addr address pointer
* @return value of (*address)
*
* Exclusive LDR command for 16 bit values
*/
uint16_t __LDREXH(uint16_t *addr)
{
__ASM("ldrexh r0, [r0]");
__ASM("bx lr");
}
/**
* @brief LDR Exclusive (32 bit)
*
* @param *addr address pointer
* @return value of (*address)
*
* Exclusive LDR command for 32 bit values
*/
uint32_t __LDREXW(uint32_t *addr)
{
__ASM("ldrex r0, [r0]");
__ASM("bx lr");
}
/**
* @brief STR Exclusive (8 bit)
*
* @param value value to store
* @param *addr address pointer
* @return successful / failed
*
* Exclusive STR command for 8 bit values
*/
uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
__ASM("strexb r0, r0, [r1]");
__ASM("bx lr");
}
/**
* @brief STR Exclusive (16 bit)
*
* @param value value to store
* @param *addr address pointer
* @return successful / failed
*
* Exclusive STR command for 16 bit values
*/
uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
__ASM("strexh r0, r0, [r1]");
__ASM("bx lr");
}
/**
* @brief STR Exclusive (32 bit)
*
* @param value value to store
* @param *addr address pointer
* @return successful / failed
*
* Exclusive STR command for 32 bit values
*/
uint32_t __STREXW(uint32_t value, uint32_t *addr)
{
__ASM("strex r0, r0, [r1]");
__ASM("bx lr");
}
#pragma diag_default=Pe940
#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/
/* GNU gcc specific functions */
/**
* @brief Return the Process Stack Pointer
*
* @return ProcessStackPointer
*
* Return the actual process stack pointer
*/
uint32_t __get_PSP(void) __attribute__( ( naked ) );
uint32_t __get_PSP(void)
{
uint32_t result=0;
__ASM volatile ("MRS %0, psp\n\t"
"MOV r0, %0 \n\t"
"BX lr \n\t" : "=r" (result) );
return(result);
}
/**
* @brief Set the Process Stack Pointer
*
* @param topOfProcStack Process Stack Pointer
*
* Assign the value ProcessStackPointer to the MSP
* (process stack pointer) Cortex processor register
*/
void __set_PSP(uint32_t topOfProcStack) __attribute__( ( naked ) );
void __set_PSP(uint32_t topOfProcStack)
{
__ASM volatile ("MSR psp, %0\n\t"
"BX lr \n\t" : : "r" (topOfProcStack) );
}
/**
* @brief Return the Main Stack Pointer
*
* @return Main Stack Pointer
*
* Return the current value of the MSP (main stack pointer)
* Cortex processor register
*/
uint32_t __get_MSP(void) __attribute__( ( naked ) );
uint32_t __get_MSP(void)
{
uint32_t result=0;
__ASM volatile ("MRS %0, msp\n\t"
"MOV r0, %0 \n\t"
"BX lr \n\t" : "=r" (result) );
return(result);
}
/**
* @brief Set the Main Stack Pointer
*
* @param topOfMainStack Main Stack Pointer
*
* Assign the value mainStackPointer to the MSP
* (main stack pointer) Cortex processor register
*/
void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) );
void __set_MSP(uint32_t topOfMainStack)
{
__ASM volatile ("MSR msp, %0\n\t"
"BX lr \n\t" : : "r" (topOfMainStack) );
}
/**
* @brief Return the Base Priority value
*
* @return BasePriority
*
* Return the content of the base priority register
*/
uint32_t __get_BASEPRI(void)
{
uint32_t result=0;
__ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
return(result);
}
/**
* @brief Set the Base Priority value
*
* @param basePri BasePriority
*
* Set the base priority register
*/
void __set_BASEPRI(uint32_t value)
{
__ASM volatile ("MSR basepri, %0" : : "r" (value) );
}
/**
* @brief Return the Priority Mask value
*
* @return PriMask
*
* Return state of the priority mask bit from the priority mask register
*/
uint32_t __get_PRIMASK(void)
{
uint32_t result=0;
__ASM volatile ("MRS %0, primask" : "=r" (result) );
return(result);
}
/**
* @brief Set the Priority Mask value
*
* @param priMask PriMask
*
* Set the priority mask bit in the priority mask register
*/
void __set_PRIMASK(uint32_t priMask)
{
__ASM volatile ("MSR primask, %0" : : "r" (priMask) );
}
/**
* @brief Return the Fault Mask value
*
* @return FaultMask
*
* Return the content of the fault mask register
*/
uint32_t __get_FAULTMASK(void)
{
uint32_t result=0;
__ASM volatile ("MRS %0, faultmask" : "=r" (result) );
return(result);
}
/**
* @brief Set the Fault Mask value
*
* @param faultMask faultMask value
*
* Set the fault mask register
*/
void __set_FAULTMASK(uint32_t faultMask)
{
__ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );
}
/**
* @brief Return the Control Register value
*
* @return Control value
*
* Return the content of the control register
*/
uint32_t __get_CONTROL(void)
{
uint32_t result=0;
__ASM volatile ("MRS %0, control" : "=r" (result) );
return(result);
}
/**
* @brief Set the Control Register value
*
* @param control Control value
*
* Set the control register
*/
void __set_CONTROL(uint32_t control)
{
__ASM volatile ("MSR control, %0" : : "r" (control) );
}
/**
* @brief Reverse byte order in integer value
*
* @param value value to reverse
* @return reversed value
*
* Reverse byte order in integer value
*/
uint32_t __REV(uint32_t value)
{
uint32_t result=0;
__ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) );
return(result);
}
/**
* @brief Reverse byte order in unsigned short value
*
* @param value value to reverse
* @return reversed value
*
* Reverse byte order in unsigned short value
*/
uint32_t __REV16(uint16_t value)
{
uint32_t result=0;
__ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) );
return(result);
}
/**
* @brief Reverse byte order in signed short value with sign extension to integer
*
* @param value value to reverse
* @return reversed value
*
* Reverse byte order in signed short value with sign extension to integer
*/
int32_t __REVSH(int16_t value)
{
uint32_t result=0;
__ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) );
return(result);
}
/**
* @brief Reverse bit order of value
*
* @param value value to reverse
* @return reversed value
*
* Reverse bit order of value
*/
uint32_t __RBIT(uint32_t value)
{
uint32_t result=0;
__ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
return(result);
}
/**
* @brief LDR Exclusive (8 bit)
*
* @param *addr address pointer
* @return value of (*address)
*
* Exclusive LDR command for 8 bit value
*/
uint8_t __LDREXB(uint8_t *addr)
{
uint8_t result=0;
__ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) );
return(result);
}
/**
* @brief LDR Exclusive (16 bit)
*
* @param *addr address pointer
* @return value of (*address)
*
* Exclusive LDR command for 16 bit values
*/
uint16_t __LDREXH(uint16_t *addr)
{
uint16_t result=0;
__ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) );
return(result);
}
/**
* @brief LDR Exclusive (32 bit)
*
* @param *addr address pointer
* @return value of (*address)
*
* Exclusive LDR command for 32 bit values
*/
uint32_t __LDREXW(uint32_t *addr)
{
uint32_t result=0;
__ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) );
return(result);
}
/**
* @brief STR Exclusive (8 bit)
*
* @param value value to store
* @param *addr address pointer
* @return successful / failed
*
* Exclusive STR command for 8 bit values
*/
uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
uint32_t result=0;
__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
return(result);
}
/**
* @brief STR Exclusive (16 bit)
*
* @param value value to store
* @param *addr address pointer
* @return successful / failed
*
* Exclusive STR command for 16 bit values
*/
uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
uint32_t result=0;
__ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
return(result);
}
/**
* @brief STR Exclusive (32 bit)
*
* @param value value to store
* @param *addr address pointer
* @return successful / failed
*
* Exclusive STR command for 32 bit values
*/
uint32_t __STREXW(uint32_t value, uint32_t *addr)
{
uint32_t result=0;
__ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
return(result);
}
#elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/
/* TASKING carm specific functions */
/*
* The CMSIS functions have been implemented as intrinsics in the compiler.
* Please use "carm -?i" to get an up to date list of all instrinsics,
* Including the CMSIS ones.
*/
#endif
+1818
View File
File diff suppressed because it is too large Load Diff
+369
View File
@@ -0,0 +1,369 @@
;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name : startup_stm32f10x_cl.s
;* Author : MCD Application Team
;* Version : V3.5.1
;* Date : 08-September-2021
;* Description : STM32F10x Connectivity line devices vector table for MDK-ARM
;* toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Configure the clock system
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM3 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
;*******************************************************************************
;*
;* Copyright (c) 2011 STMicroelectronics.
;* All rights reserved.
;*
;* This software is licensed under terms that can be found in the LICENSE file
;* in the root directory of this software component.
;* If no LICENSE file comes with this software, it is provided AS-IS.
;
;*******************************************************************************
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_2_IRQHandler ; ADC1 and ADC2
DCD CAN1_TX_IRQHandler ; CAN1 TX
DCD CAN1_RX0_IRQHandler ; CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; TIM1 Break
DCD TIM1_UP_IRQHandler ; TIM1 Update
DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C1 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC alarm through EXTI line
DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
DCD TIM6_IRQHandler ; TIM6
DCD TIM7_IRQHandler ; TIM7
DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1
DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2
DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3
DCD DMA2_Channel4_IRQHandler ; DMA2 Channel4
DCD DMA2_Channel5_IRQHandler ; DMA2 Channel5
DCD ETH_IRQHandler ; Ethernet
DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line
DCD CAN2_TX_IRQHandler ; CAN2 TX
DCD CAN2_RX0_IRQHandler ; CAN2 RX0
DCD CAN2_RX1_IRQHandler ; CAN2 RX1
DCD CAN2_SCE_IRQHandler ; CAN2 SCE
DCD OTG_FS_IRQHandler ; USB OTG FS
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMPER_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_IRQHandler [WEAK]
EXPORT DMA1_Channel3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_IRQHandler [WEAK]
EXPORT DMA1_Channel5_IRQHandler [WEAK]
EXPORT DMA1_Channel6_IRQHandler [WEAK]
EXPORT DMA1_Channel7_IRQHandler [WEAK]
EXPORT ADC1_2_IRQHandler [WEAK]
EXPORT CAN1_TX_IRQHandler [WEAK]
EXPORT CAN1_RX0_IRQHandler [WEAK]
EXPORT CAN1_RX1_IRQHandler [WEAK]
EXPORT CAN1_SCE_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_IRQHandler [WEAK]
EXPORT TIM1_UP_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTCAlarm_IRQHandler [WEAK]
EXPORT OTG_FS_WKUP_IRQHandler [WEAK]
EXPORT TIM5_IRQHandler [WEAK]
EXPORT SPI3_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT UART5_IRQHandler [WEAK]
EXPORT TIM6_IRQHandler [WEAK]
EXPORT TIM7_IRQHandler [WEAK]
EXPORT DMA2_Channel1_IRQHandler [WEAK]
EXPORT DMA2_Channel2_IRQHandler [WEAK]
EXPORT DMA2_Channel3_IRQHandler [WEAK]
EXPORT DMA2_Channel4_IRQHandler [WEAK]
EXPORT DMA2_Channel5_IRQHandler [WEAK]
EXPORT ETH_IRQHandler [WEAK]
EXPORT ETH_WKUP_IRQHandler [WEAK]
EXPORT CAN2_TX_IRQHandler [WEAK]
EXPORT CAN2_RX0_IRQHandler [WEAK]
EXPORT CAN2_RX1_IRQHandler [WEAK]
EXPORT CAN2_SCE_IRQHandler [WEAK]
EXPORT OTG_FS_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
CAN1_TX_IRQHandler
CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
OTG_FS_WKUP_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_IRQHandler
TIM7_IRQHandler
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_IRQHandler
DMA2_Channel5_IRQHandler
ETH_IRQHandler
ETH_WKUP_IRQHandler
CAN2_TX_IRQHandler
CAN2_RX0_IRQHandler
CAN2_RX1_IRQHandler
CAN2_SCE_IRQHandler
OTG_FS_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
+359
View File
@@ -0,0 +1,359 @@
;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name : startup_stm32f10x_hd.s
;* Author : MCD Application Team
;* Version : V3.5.1
;* Date : 08-September-2021
;* Description : STM32F10x High Density Devices vector table for MDK-ARM
;* toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Configure the clock system and also configure the external
;* SRAM mounted on STM3210E-EVAL board to be used as data
;* memory (optional, to be enabled by user)
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM3 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
;*******************************************************************************
;*
;* Copyright (c) 2011 STMicroelectronics.
;* All rights reserved.
;*
;* This software is licensed under terms that can be found in the LICENSE file
;* in the root directory of this software component.
;* If no LICENSE file comes with this software, it is provided AS-IS.
;
;*******************************************************************************
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_2_IRQHandler ; ADC1 & ADC2
DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX
DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; TIM1 Break
DCD TIM1_UP_IRQHandler ; TIM1 Update
DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend
DCD TIM8_BRK_IRQHandler ; TIM8 Break
DCD TIM8_UP_IRQHandler ; TIM8 Update
DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
DCD ADC3_IRQHandler ; ADC3
DCD FSMC_IRQHandler ; FSMC
DCD SDIO_IRQHandler ; SDIO
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
DCD TIM6_IRQHandler ; TIM6
DCD TIM7_IRQHandler ; TIM7
DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1
DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2
DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3
DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMPER_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_IRQHandler [WEAK]
EXPORT DMA1_Channel3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_IRQHandler [WEAK]
EXPORT DMA1_Channel5_IRQHandler [WEAK]
EXPORT DMA1_Channel6_IRQHandler [WEAK]
EXPORT DMA1_Channel7_IRQHandler [WEAK]
EXPORT ADC1_2_IRQHandler [WEAK]
EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK]
EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK]
EXPORT CAN1_RX1_IRQHandler [WEAK]
EXPORT CAN1_SCE_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_IRQHandler [WEAK]
EXPORT TIM1_UP_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTCAlarm_IRQHandler [WEAK]
EXPORT USBWakeUp_IRQHandler [WEAK]
EXPORT TIM8_BRK_IRQHandler [WEAK]
EXPORT TIM8_UP_IRQHandler [WEAK]
EXPORT TIM8_TRG_COM_IRQHandler [WEAK]
EXPORT TIM8_CC_IRQHandler [WEAK]
EXPORT ADC3_IRQHandler [WEAK]
EXPORT FSMC_IRQHandler [WEAK]
EXPORT SDIO_IRQHandler [WEAK]
EXPORT TIM5_IRQHandler [WEAK]
EXPORT SPI3_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT UART5_IRQHandler [WEAK]
EXPORT TIM6_IRQHandler [WEAK]
EXPORT TIM7_IRQHandler [WEAK]
EXPORT DMA2_Channel1_IRQHandler [WEAK]
EXPORT DMA2_Channel2_IRQHandler [WEAK]
EXPORT DMA2_Channel3_IRQHandler [WEAK]
EXPORT DMA2_Channel4_5_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler
TIM8_BRK_IRQHandler
TIM8_UP_IRQHandler
TIM8_TRG_COM_IRQHandler
TIM8_CC_IRQHandler
ADC3_IRQHandler
FSMC_IRQHandler
SDIO_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_IRQHandler
TIM7_IRQHandler
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_5_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
+347
View File
@@ -0,0 +1,347 @@
;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name : startup_stm32f10x_hd_vl.s
;* Author : MCD Application Team
;* Version : V3.5.1
;* Date : 08-September-2021
;* Description : STM32F10x High Density Value Line Devices vector table
;* for MDK-ARM toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Configure the clock system and also configure the external
;* SRAM mounted on STM32100E-EVAL board to be used as data
;* memory (optional, to be enabled by user)
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM3 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
;*******************************************************************************
;*
;* Copyright (c) 2011 STMicroelectronics.
;* All rights reserved.
;*
;* This software is licensed under terms that can be found in the LICENSE file
;* in the root directory of this software component.
;* If no LICENSE file comes with this software, it is provided AS-IS.
;
;*******************************************************************************
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_IRQHandler ; ADC1
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15
DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16
DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD CEC_IRQHandler ; HDMI-CEC
DCD TIM12_IRQHandler ; TIM12
DCD TIM13_IRQHandler ; TIM13
DCD TIM14_IRQHandler ; TIM14
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun
DCD TIM7_IRQHandler ; TIM7
DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1
DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2
DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3
DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
DCD DMA2_Channel5_IRQHandler ; DMA2 Channel5
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMPER_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_IRQHandler [WEAK]
EXPORT DMA1_Channel3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_IRQHandler [WEAK]
EXPORT DMA1_Channel5_IRQHandler [WEAK]
EXPORT DMA1_Channel6_IRQHandler [WEAK]
EXPORT DMA1_Channel7_IRQHandler [WEAK]
EXPORT ADC1_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_TIM15_IRQHandler [WEAK]
EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTCAlarm_IRQHandler [WEAK]
EXPORT CEC_IRQHandler [WEAK]
EXPORT TIM12_IRQHandler [WEAK]
EXPORT TIM13_IRQHandler [WEAK]
EXPORT TIM14_IRQHandler [WEAK]
EXPORT TIM5_IRQHandler [WEAK]
EXPORT SPI3_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT UART5_IRQHandler [WEAK]
EXPORT TIM6_DAC_IRQHandler [WEAK]
EXPORT TIM7_IRQHandler [WEAK]
EXPORT DMA2_Channel1_IRQHandler [WEAK]
EXPORT DMA2_Channel2_IRQHandler [WEAK]
EXPORT DMA2_Channel3_IRQHandler [WEAK]
EXPORT DMA2_Channel4_5_IRQHandler [WEAK]
EXPORT DMA2_Channel5_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_TIM15_IRQHandler
TIM1_UP_TIM16_IRQHandler
TIM1_TRG_COM_TIM17_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
CEC_IRQHandler
TIM12_IRQHandler
TIM13_IRQHandler
TIM14_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_DAC_IRQHandler
TIM7_IRQHandler
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_5_IRQHandler
DMA2_Channel5_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
+298
View File
@@ -0,0 +1,298 @@
;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name : startup_stm32f10x_ld.s
;* Author : MCD Application Team
;* Version : V3.5.1
;* Date : 08-September-2021
;* Description : STM32F10x Low Density Devices vector table for MDK-ARM
;* toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Configure the clock system
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM3 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
;*******************************************************************************
;*
;* Copyright (c) 2011 STMicroelectronics.
;* All rights reserved.
;*
;* This software is licensed under terms that can be found in the LICENSE file
;* in the root directory of this software component.
;* If no LICENSE file comes with this software, it is provided AS-IS.
;
;*******************************************************************************
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_2_IRQHandler ; ADC1_2
DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX
DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; TIM1 Break
DCD TIM1_UP_IRQHandler ; TIM1 Update
DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD 0 ; Reserved
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SPI1_IRQHandler ; SPI1
DCD 0 ; Reserved
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD 0 ; Reserved
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler routine
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMPER_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_IRQHandler [WEAK]
EXPORT DMA1_Channel3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_IRQHandler [WEAK]
EXPORT DMA1_Channel5_IRQHandler [WEAK]
EXPORT DMA1_Channel6_IRQHandler [WEAK]
EXPORT DMA1_Channel7_IRQHandler [WEAK]
EXPORT ADC1_2_IRQHandler [WEAK]
EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK]
EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK]
EXPORT CAN1_RX1_IRQHandler [WEAK]
EXPORT CAN1_SCE_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_IRQHandler [WEAK]
EXPORT TIM1_UP_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTCAlarm_IRQHandler [WEAK]
EXPORT USBWakeUp_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
SPI1_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
+305
View File
@@ -0,0 +1,305 @@
;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name : startup_stm32f10x_ld_vl.s
;* Author : MCD Application Team
;* Version : V3.5.1
;* Date : 08-September-2021
;* Description : STM32F10x Low Density Value Line Devices vector table
;* for MDK-ARM toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Configure the clock system
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM3 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
;*******************************************************************************
;*
;* Copyright (c) 2011 STMicroelectronics.
;* All rights reserved.
;*
;* This software is licensed under terms that can be found in the LICENSE file
;* in the root directory of this software component.
;* If no LICENSE file comes with this software, it is provided AS-IS.
;
;*******************************************************************************
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_IRQHandler ; ADC1
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15
DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16
DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD 0 ; Reserved
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SPI1_IRQHandler ; SPI1
DCD 0 ; Reserved
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD 0 ; Reserved
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD CEC_IRQHandler ; HDMI-CEC
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun
DCD TIM7_IRQHandler ; TIM7
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMPER_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_IRQHandler [WEAK]
EXPORT DMA1_Channel3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_IRQHandler [WEAK]
EXPORT DMA1_Channel5_IRQHandler [WEAK]
EXPORT DMA1_Channel6_IRQHandler [WEAK]
EXPORT DMA1_Channel7_IRQHandler [WEAK]
EXPORT ADC1_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_TIM15_IRQHandler [WEAK]
EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTCAlarm_IRQHandler [WEAK]
EXPORT CEC_IRQHandler [WEAK]
EXPORT TIM6_DAC_IRQHandler [WEAK]
EXPORT TIM7_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_TIM15_IRQHandler
TIM1_UP_TIM16_IRQHandler
TIM1_TRG_COM_TIM17_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
SPI1_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
CEC_IRQHandler
TIM6_DAC_IRQHandler
TIM7_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
+308
View File
@@ -0,0 +1,308 @@
;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name : startup_stm32f10x_md.s
;* Author : MCD Application Team
;* Version : V3.5.1
;* Date : 08-September-2021
;* Description : STM32F10x Medium Density Devices vector table for MDK-ARM
;* toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Configure the clock system
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM3 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
;*******************************************************************************
;*
;* Copyright (c) 2011 STMicroelectronics.
;* All rights reserved.
;*
;* This software is licensed under terms that can be found in the LICENSE file
;* in the root directory of this software component.
;* If no LICENSE file comes with this software, it is provided AS-IS.
;
;*******************************************************************************
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_2_IRQHandler ; ADC1_2
DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX
DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; TIM1 Break
DCD TIM1_UP_IRQHandler ; TIM1 Update
DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMPER_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_IRQHandler [WEAK]
EXPORT DMA1_Channel3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_IRQHandler [WEAK]
EXPORT DMA1_Channel5_IRQHandler [WEAK]
EXPORT DMA1_Channel6_IRQHandler [WEAK]
EXPORT DMA1_Channel7_IRQHandler [WEAK]
EXPORT ADC1_2_IRQHandler [WEAK]
EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK]
EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK]
EXPORT CAN1_RX1_IRQHandler [WEAK]
EXPORT CAN1_SCE_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_IRQHandler [WEAK]
EXPORT TIM1_UP_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTCAlarm_IRQHandler [WEAK]
EXPORT USBWakeUp_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
+316
View File
@@ -0,0 +1,316 @@
;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name : startup_stm32f10x_md_vl.s
;* Author : MCD Application Team
;* Version : V3.5.1
;* Date : 08-September-2021
;* Description : STM32F10x Medium Density Value Line Devices vector table
;* for MDK-ARM toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Configure the clock system
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM3 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
;*******************************************************************************
;*
;* Copyright (c) 2011 STMicroelectronics.
;* All rights reserved.
;*
;* This software is licensed under terms that can be found in the LICENSE file
;* in the root directory of this software component.
;* If no LICENSE file comes with this software, it is provided AS-IS.
;
;*******************************************************************************
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_IRQHandler ; ADC1
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15
DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16
DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD CEC_IRQHandler ; HDMI-CEC
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun
DCD TIM7_IRQHandler ; TIM7
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMPER_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_IRQHandler [WEAK]
EXPORT DMA1_Channel3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_IRQHandler [WEAK]
EXPORT DMA1_Channel5_IRQHandler [WEAK]
EXPORT DMA1_Channel6_IRQHandler [WEAK]
EXPORT DMA1_Channel7_IRQHandler [WEAK]
EXPORT ADC1_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_TIM15_IRQHandler [WEAK]
EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTCAlarm_IRQHandler [WEAK]
EXPORT CEC_IRQHandler [WEAK]
EXPORT TIM6_DAC_IRQHandler [WEAK]
EXPORT TIM7_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_TIM15_IRQHandler
TIM1_UP_TIM16_IRQHandler
TIM1_TRG_COM_TIM17_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
CEC_IRQHandler
TIM6_DAC_IRQHandler
TIM7_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
+359
View File
@@ -0,0 +1,359 @@
;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name : startup_stm32f10x_xl.s
;* Author : MCD Application Team
;* Version : V3.5.1
;* Date : 08-September-2021
;* Description : STM32F10x XL-Density Devices vector table for MDK-ARM
;* toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Configure the clock system and also configure the external
;* SRAM mounted on STM3210E-EVAL board to be used as data
;* memory (optional, to be enabled by user)
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM3 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
;*******************************************************************************
;*
;* Copyright (c) 2011 STMicroelectronics.
;* All rights reserved.
;*
;* This software is licensed under terms that can be found in the LICENSE file
;* in the root directory of this software component.
;* If no LICENSE file comes with this software, it is provided AS-IS.
;
;*******************************************************************************
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_2_IRQHandler ; ADC1 & ADC2
DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX
DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_TIM9_IRQHandler ; TIM1 Break and TIM9
DCD TIM1_UP_TIM10_IRQHandler ; TIM1 Update and TIM10
DCD TIM1_TRG_COM_TIM11_IRQHandler ; TIM1 Trigger and Commutation and TIM11
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend
DCD TIM8_BRK_TIM12_IRQHandler ; TIM8 Break and TIM12
DCD TIM8_UP_TIM13_IRQHandler ; TIM8 Update and TIM13
DCD TIM8_TRG_COM_TIM14_IRQHandler ; TIM8 Trigger and Commutation and TIM14
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
DCD ADC3_IRQHandler ; ADC3
DCD FSMC_IRQHandler ; FSMC
DCD SDIO_IRQHandler ; SDIO
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
DCD TIM6_IRQHandler ; TIM6
DCD TIM7_IRQHandler ; TIM7
DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1
DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2
DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3
DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMPER_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_IRQHandler [WEAK]
EXPORT DMA1_Channel3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_IRQHandler [WEAK]
EXPORT DMA1_Channel5_IRQHandler [WEAK]
EXPORT DMA1_Channel6_IRQHandler [WEAK]
EXPORT DMA1_Channel7_IRQHandler [WEAK]
EXPORT ADC1_2_IRQHandler [WEAK]
EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK]
EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK]
EXPORT CAN1_RX1_IRQHandler [WEAK]
EXPORT CAN1_SCE_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_TIM9_IRQHandler [WEAK]
EXPORT TIM1_UP_TIM10_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_TIM11_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTCAlarm_IRQHandler [WEAK]
EXPORT USBWakeUp_IRQHandler [WEAK]
EXPORT TIM8_BRK_TIM12_IRQHandler [WEAK]
EXPORT TIM8_UP_TIM13_IRQHandler [WEAK]
EXPORT TIM8_TRG_COM_TIM14_IRQHandler [WEAK]
EXPORT TIM8_CC_IRQHandler [WEAK]
EXPORT ADC3_IRQHandler [WEAK]
EXPORT FSMC_IRQHandler [WEAK]
EXPORT SDIO_IRQHandler [WEAK]
EXPORT TIM5_IRQHandler [WEAK]
EXPORT SPI3_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT UART5_IRQHandler [WEAK]
EXPORT TIM6_IRQHandler [WEAK]
EXPORT TIM7_IRQHandler [WEAK]
EXPORT DMA2_Channel1_IRQHandler [WEAK]
EXPORT DMA2_Channel2_IRQHandler [WEAK]
EXPORT DMA2_Channel3_IRQHandler [WEAK]
EXPORT DMA2_Channel4_5_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_TIM9_IRQHandler
TIM1_UP_TIM10_IRQHandler
TIM1_TRG_COM_TIM11_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler
TIM8_BRK_TIM12_IRQHandler
TIM8_UP_TIM13_IRQHandler
TIM8_TRG_COM_TIM14_IRQHandler
TIM8_CC_IRQHandler
ADC3_IRQHandler
FSMC_IRQHandler
SDIO_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_IRQHandler
TIM7_IRQHandler
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_5_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
File diff suppressed because it is too large Load Diff
+246
View File
@@ -0,0 +1,246 @@
/**
******************************************************************************
* @file global.h
* @author Jerry Cai
* @version V2.1
* @date 19-April-2022
* @brief This file contains all the functions prototypes for the GPIO
* firmware library.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __AFE_SH3673520_H
#define __AFE_SH3673520_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
//#define CALICUR 1000
//#define CALICUR 30700 //16个4m欧电阻并联
//#define CALICUR 28000 //16个5m欧电阻并联
#define REG_ADDR_SCONF1 0x40
#define REG_ADDR_SCONF2 0x41
#define REG_ADDR_SCONF3 0x42
#define REG_ADDR_SCONF4 0x43
#define REG_ADDR_SCONF5 0x44
#define REG_ADDR_SCONF6 0x45
#define REG_ADDR_SCONF7 0x46
#define REG_ADDR_OWV_ALARMH 0x47
#define REG_ADDR_ALARML 0x48
#define REG_ADDR_OVT_OVH 0x49
#define REG_ADDR_OVL 0x4A
#define REG_ADDR_UVT_UVL 0x4B
#define REG_ADDR_UVL 0x4C
#define REG_ADDR_OCD1V_OCD1T 0x4D
#define REG_ADDR_OCD2V_OCD2T 0x4E
#define REG_ADDR_SCV_SCT 0x4F
#define REG_ADDR_OCCV_OCCT 0x50
#define REG_ADDR_OTC 0x51
#define REG_ADDR_OTD 0x52
#define REG_ADDR_UTC 0x53
#define REG_ADDR_UTD 0x54
#define REG_ADDR_BALANCEH 0x55
#define REG_ADDR_BALANCEM 0x56
#define REG_ADDR_BALANCEL 0x57
#define REG_ADDR_FLAG1 0x58
#define REG_ADDR_FLAG2 0x59
#define REG_ADDR_FLAG3 0x5A
#define REG_ADDR_BSTATUS1 0x5B
#define REG_ADDR_BSTATUS2 0x5C
#define REG_ADDR_TEMP1H 0x5D
#define REG_ADDR_TEMP1L 0x5E
#define REG_ADDR_TEMP2H 0x5F
#define REG_ADDR_TEMP2L 0x60
#define REG_ADDR_TEMP3H 0x61
#define REG_ADDR_TEMP3L 0x62
#define REG_ADDR_TEMP4H 0x63
#define REG_ADDR_TEMP4L 0x64
#define REG_ADDR_TEMPIH 0x65
#define REG_ADDR_TEMPIL 0x66
#define REG_ADDR_CURH 0x67
#define REG_ADDR_CURL 0x68
#define REG_ADDR_CELL1H 0x69
#define REG_ADDR_CELL1L 0x6A
#define REG_ADDR_CELL2H 0x6B
#define REG_ADDR_CELL2L 0x6C
#define REG_ADDR_CELL3H 0x6D
#define REG_ADDR_CELL3L 0x6E
#define REG_ADDR_CELL4H 0x6F
#define REG_ADDR_CELL4L 0x70
#define REG_ADDR_CELL5H 0x71
#define REG_ADDR_CELL5L 0x72
#define REG_ADDR_CELL6H 0x73
#define REG_ADDR_CELL6L 0x74
#define REG_ADDR_CELL7H 0x75
#define REG_ADDR_CELL7L 0x76
#define REG_ADDR_CELL8H 0x77
#define REG_ADDR_CELL8L 0x78
#define REG_ADDR_CELL9H 0x79
#define REG_ADDR_CELL9L 0x7A
#define REG_ADDR_CELL10H 0X7B
#define REG_ADDR_CELL10L 0X7C
#define REG_ADDR_CELL11H 0X7D
#define REG_ADDR_CELL11L 0X7E
#define REG_ADDR_CELL12H 0X7F
#define REG_ADDR_CELL12L 0X80
#define REG_ADDR_CELL13H 0X81
#define REG_ADDR_CELL13L 0X82
#define REG_ADDR_CELL14H 0X83
#define REG_ADDR_CELL14L 0X84
#define REG_ADDR_CELL15H 0X85
#define REG_ADDR_CELL15L 0X86
#define REG_ADDR_CELL16H 0X87
#define REG_ADDR_CELL16L 0X88
#define REG_ADDR_CELL17H 0X89
#define REG_ADDR_CELL17L 0X8A
#define REG_ADDR_CELL18H 0X8B
#define REG_ADDR_CELL18L 0X8C
#define REG_ADDR_CELL19H 0X8D
#define REG_ADDR_CELL19L 0X8E
#define REG_ADDR_CELL20H 0X8F
#define REG_ADDR_CELL20L 0X90
#define REG_ADDR_CADCDH 0x91
#define REG_ADDR_CADCDL 0x92
#define REG_ADDR_VTOPH 0x93
#define REG_ADDR_VTOPL 0x94
#define REG_ADDR_VCHGRH 0x95
#define REG_ADDR_VCHGRL 0x96
#define REG_ADDR_OWDH 0x97
#define REG_ADDR_OWDM 0x98
#define REG_ADDR_OWDL 0x99
//AFE RAM Register
typedef struct
{
uint8_t sconf1;
uint8_t sconf2;
uint8_t sconf3;
uint8_t sconf4;
uint8_t sconf5;
uint8_t sconf6;
uint8_t sconf7;
uint8_t owv_alarmh;
uint8_t alarml;
uint8_t ovt_ovh;
uint8_t ovl;
uint8_t uvt_uvh;
uint8_t uvl;
uint8_t ocd1v_ocd1t;
uint8_t ocd2v_ocd2t;
uint8_t scv_sct;
uint8_t occv_occt;
uint8_t otc;
uint8_t otd;
uint8_t utc;
uint8_t utd;
uint8_t balanceh;
uint8_t balancem;
uint8_t balancel;
uint8_t flag1;
uint8_t flag2;
uint8_t flag3;
uint8_t bstatus1;
uint8_t bstatus2;
uint8_t temp1h;
uint8_t temp1l;
uint8_t temp2h;
uint8_t temp2l;
uint8_t temp3h;
uint8_t temp3l;
uint8_t temp4h;
uint8_t temp4l;
uint8_t tempih;
uint8_t tempil;
uint8_t curh;
uint8_t curl;
uint8_t cell1h;
uint8_t cell1l;
uint8_t cell2h;
uint8_t cell2l;
uint8_t cell3h;
uint8_t cell3l;
uint8_t cell4h;
uint8_t cell4l;
uint8_t cell5h;
uint8_t cell5l;
uint8_t cell6h;
uint8_t cell6l;
uint8_t cell7h;
uint8_t cell7l;
uint8_t cell8h;
uint8_t cell8l;
uint8_t cell9h;
uint8_t cell9l;
uint8_t cell10h;
uint8_t cell10l;
uint8_t cell11h;
uint8_t cell11l;
uint8_t cell12h;
uint8_t cell12l;
uint8_t cell13h;
uint8_t cell13l;
uint8_t cell14h;
uint8_t cell14l;
uint8_t cell15h;
uint8_t cell15l;
uint8_t cell16h;
uint8_t cell16l;
uint8_t cell17h;
uint8_t cell17l;
uint8_t cell18h;
uint8_t cell18l;
uint8_t cell19h;
uint8_t cell19l;
uint8_t cell20h;
uint8_t cell20l;
uint8_t cadcdh;
uint8_t cadcdl;
uint8_t vtoph;
uint8_t vtopl;
uint8_t vchgrh;
uint8_t vchgrl;
uint8_t owdh;
uint8_t owdm;
uint8_t owdl;
} AFE_RAM;
//AFE FLG Register
typedef struct
{
uint16_t temp1;
uint16_t temp2;
uint16_t temp3;
uint16_t temp4;
} AFE_FLG;
extern AFE_RAM afeRam;
extern AFE_FLG afeFlg;
extern void AFE_VoltageProcess(void);
extern void AFE_CurrentProcess(void);
extern void AFE_TemperaProcess(void);
extern void AFE_ProtectProcess(void);
extern uint8_t MEMORY_UpdateAFE(void);
extern void InitGasGauge(void);
#ifdef __cplusplus
}
#endif
#endif
+656
View File
@@ -0,0 +1,656 @@
/********************************************************************************
Copyright (C), Sinowealth Electronic. Ltd.
Author: Sino
Version: V0.0
Date: 2014/05/30
History:
V0.0 2014/05/30 Preliminary
********************************************************************************/
#include "stm32f10x.h"
#include "global.h"
#include "string.h"
#include "rtc.h"
uint8_t oldsoc;
uint8_t newsoc;
uint8_t fullToZeroStudyFlag; //满充开始学习标记
uint8_t zeroToFullStudyFlag; //满放开始学习标记
uint32_t packcheck_OV; //单体过压校准SOC的总压判断值
uint32_t packcheck_UV; //单体欠压校准SOC的总压判断值
uint16_t ncc_Ah; //额定容量,用于计算传给逆变器的并机总容量 单位1Ah
uint16_t fcc_Ah; //满充容量,用于在上位机修改容量和SOC后,计算此时的剩余容量 单位1Ah
uint16_t rcc_Ah; //剩余容量,用于计入累计容量,然后计算循环次数
uint16_t oldrcc_Ah; //旧现有容量,用于比较计入累计容量
uint16_t cumuliCapacity; //累积容量,单位0.1Ah
uint8_t FullCharge_count; //满充减容量的延迟计数
uint8_t FullCharge_count2; //满充减容量的延迟计数2
uint8_t Cali_Soc_Flag; //15%校准执行标志
uint16_t CaliSocMoniCount; //15%校准等待时间
uint16_t oldcyc;
uint8_t ClearEE[4] = {0xff,0xff,0xff,0xff};
uint8_t tmpRdFCC[8]; //用于读出总容量值
uint8_t tmpWrFCC[8]; //用于写入总容量值
uint32_t RdFCC;
uint32_t fcc; //满充容量,单位mAS
uint8_t fcc_CaliStartFlag; //当开始充电时,如果此时SOC=0/1%,开始计时
uint8_t fcc_fullFlag; //达到任一满充条件的标志,是最终执行满充容量校准的条件之一
/*******************************************************************************
Function:InitGasGauge()
Description: Calculate the remaining capacity according to pack voltage
Input: NULL
Output: NULL
Others:
*******************************************************************************/
void InitGasGauge(void)
{
uint8_t tmpRd[2],tmpWr[2];
uint16_t capacity,cyctime;
//上电读EEPROM 额定容量值
EEPROM_RdMulByte(EE_NCC,tmpRd);
capacity = tmpRd[0]<<8 | tmpRd[1];
if(capacity>0 && capacity<=1000) //如果之前写过容量值,就按照之前的值显示,范围1~1000,否则显示100Ah
{
bmsMem.ncc = 3600 * 1000 * capacity;
ncc_Ah = capacity;
}
else
{
bmsMem.ncc = 3600 * 1000 * 100; //系统额定容量默认100AH = 100,000mAH = 360,000,000mAS
ncc_Ah = 100;
}
//上电读EEPROM 满充容量值
//前4位是正值,后四位是反值,用来校验数值正确
EEPROM_RdMulByte(EE_FCC,tmpRdFCC);
if( ((tmpRdFCC[0]^0xff) == tmpRdFCC[4]) && ((tmpRdFCC[1]^0xff) == tmpRdFCC[5]) && ((tmpRdFCC[2]^0xff) == tmpRdFCC[6]) && ((tmpRdFCC[3]^0xff) == tmpRdFCC[7]) )
{
RdFCC = tmpRdFCC[0]<<24 | tmpRdFCC[1]<<16 | tmpRdFCC[2]<<8 | tmpRdFCC[3];
if((RdFCC>0) && (RdFCC <= 0xFFE00000)) //不出错的正数范围为1~4,292,870,144,大约1192Ah
{
fcc = RdFCC;
fcc_Ah = RdFCC / 3600000;
}
else
{
fcc = bmsMem.ncc;
fcc_Ah = bmsMem.ncc / 3600000;
}
}
else
{
fcc = bmsMem.ncc;
fcc_Ah = bmsMem.ncc / 3600000;
}
//上电读EEPROM 循环次数
EEPROM_RdMulByte(EE_CYCLE,tmpRd);
cyctime = tmpRd[0]<<8 | tmpRd[1];
if(cyctime > paraMem.sohcali_stopTime+10) //初次读取
{
oldcyc = 0;
bmsMem.cycleCount = 0;
}
else
{
oldcyc = cyctime;
bmsMem.cycleCount = cyctime;
}
//上电读EEPROM 累积容量值 //计算时,使用额定容量而不是满充容量
EEPROM_RdMulByte(EE_CUMULI,tmpRd);
capacity = tmpRd[0]<<8 | tmpRd[1];
if((int)capacity>=0 && capacity<=10*ncc_Ah) //剩余容量范围0~10000*0.1Ah,超出则显示0
{
cumuliCapacity = capacity;
//获得进行循环次数计算的单位容量(此处不可为0)
if(paraMem.sohcali_transCent != 0)
{
capacity = 10*ncc_Ah * paraMem.sohcali_transCent/100;
}
else
{
capacity = 10*ncc_Ah * 90/100; //默认90%
}
//计算循环次数
if(cumuliCapacity >= capacity) //当累积容量超出总容量的90%,增加循环次数
{
bmsMem.cycleCount += cumuliCapacity / capacity;
cumuliCapacity = cumuliCapacity % capacity;
//保存参与过循环次数计算后的累积容量
tmpWr[0] = (cumuliCapacity >> 8) & 0xff;
tmpWr[1] = (cumuliCapacity >> 0) & 0xff;
EEPROM_WrMulByte(EE_CUMULI,tmpWr);
delay_ms(5);
}
}
else
{
cumuliCapacity = 0;
}
//上电读EEPROM soc值
EEPROM_RdMulByte(EE_SOC,&tmpRd[0]);
//正常
if(((int)tmpRd[0]>=0) && (tmpRd[0]<=100)) //在比较操作中使用类型转换不会改变变量本身的类型
{
oldsoc = tmpRd[0];
bmsMem.soc = tmpRd[0];
bmsMem.rcc = fcc/100 * bmsMem.soc;
rcc_Ah = fcc_Ah * bmsMem.soc /100;
oldrcc_Ah = rcc_Ah;
}
//首次上电根据电压校准soc
else
{
OCV_CaliSOC_DataWr();
bmsMem.soc = OCV_CaliSoc_dp();
bmsMem.rcc = fcc/100 * bmsMem.soc;
rcc_Ah = fcc_Ah * bmsMem.soc /100;
oldrcc_Ah = rcc_Ah;
}
}
//Manage the capacity of the pack
//interval 1s
void GaugeManage(void)
{
uint8_t tempWr[2];
uint16_t capacity;
/*参与判断的总压限值*/
//模块过压值
packcheck_OV = cell_OV * bmsMem.ucCellNum -8000;
//模块欠压值
packcheck_UV = cell_UV * bmsMem.ucCellNum +5000;
/*计算剩余容量*/
//电流积分法:微小电流认为是干扰,不参与计算
if( (bmsMem.packCurrent <= (-100)) || (bmsMem.packCurrent >= 100) )
{
bmsMem.rcc += bmsMem.packCurrent;
}
if(bmsMem.rcc > 0xFFE00000)//4.21添加,防止过放数据出错 //因改为无符号,需清零的负数范围设-1~-2,097,151,电流值在2000A范围内皆可接受,不出错的正数范围为0~4,292,870,144,大约1192Ah
{
bmsMem.rcc = 0;
}
if((paraMem.cali_min_disable & 0x8000) != 0) //不允许做满充容量校准
{
//在校准容量判断前,保证参数正确
if(fcc_CaliStartFlag != 0)
{
fcc_CaliStartFlag = 0;
EEPROM_WrMulByte(EE_FCC_TIME,ClearEE);
delay_ms(5);
}
if(fcc != bmsMem.ncc) //校准总容量=额定容量
{
//赋值满充容量=额定容量
fcc = bmsMem.ncc;
fcc_Ah = ncc_Ah;
tmpWrFCC[0] = (fcc>>24) & 0xff;
tmpWrFCC[1] = (fcc>>16) & 0xff;
tmpWrFCC[2] = (fcc>> 8) & 0xff;
tmpWrFCC[3] = (fcc>> 0) & 0xff;
tmpWrFCC[4] = tmpWrFCC[0] ^ 0xff;
tmpWrFCC[5] = tmpWrFCC[1] ^ 0xff;
tmpWrFCC[6] = tmpWrFCC[2] ^ 0xff;
tmpWrFCC[7] = tmpWrFCC[3] ^ 0xff;
EEPROM_WrMulByte(EE_FCC,tmpWrFCC);
delay_ms(20);
//赋值剩余容量=新的满充容量*SOC
bmsMem.rcc = fcc/100 * bmsMem.soc;
rcc_Ah = fcc_Ah * bmsMem.soc / 100;
oldrcc_Ah = rcc_Ah;
}
}
/*计算实时SOC=剩余容量/满充容量*/
if(bmsMem.rcc > fcc/100 * 99) //>99%
{
//若SOC已经是100%,不会下调
if(bmsMem.soc >= 100)
{
bmsMem.soc = 100;
}
//若SOC此前<=99,锁定99%
else
{
bmsMem.soc = 99;
}
}
else //0%~99%
{
//如果剩余容量的小数部分至少有0.1Ah,soc+1
if( (bmsMem.rcc%(fcc/100)) /360000 != 0) //取精度0.1%作为判断标准 360000mAS = 0.1*1000*3600 = 0.1Ah
{
bmsMem.soc = bmsMem.rcc/(fcc/100)+1;
}
else
{
bmsMem.soc = bmsMem.rcc/(fcc/100);
}
}
/*若满足特殊条件,直接改动SOC值,注意剩余容量保持不变*/
//read bSTATUS1 ov bit 满充校准
//满充条件1:单体过压
if( ((paraMem.soc100_methods & 0x01) != 0) && ((bmsMem.bStatus1 & 0x0001) != 0) && (bmsMem.packVoltage > packcheck_OV)) //发生过压保护(会关MOS)//带总压判断(根据串数变化)
{
bmsMem.soc = 100;
fcc_fullFlag = 1;
//如果不在等待校准满充容量,同时更新rcc=fcc
if(fcc_CaliStartFlag == 0)
{
bmsMem.rcc = fcc;
}
}
//满充条件2:总体过压
else if( ((paraMem.soc100_methods & 0x02) != 0) && ((bmsMem.bStatus1 & 0x0100) != 0)) //发生总体过压保护(会关MOS)
{
bmsMem.soc = 100;
fcc_fullFlag = 1;
//如果不在等待校准满充容量,同时更新rcc=fcc
if(fcc_CaliStartFlag == 0)
{
bmsMem.rcc = fcc;
//不计入循环次数
rcc_Ah = bmsMem.rcc/3600/1000;
oldrcc_Ah = rcc_Ah;
}
}
//满充条件3:逆变器限压57.6V+2A小电流
else if( ((paraMem.soc100_methods & 0x04) != 0) && (bmsMem.packVoltage >= bmsMem.inverter_chgVolLimit*100) && (bmsMem.packCurrent >= 100) && (bmsMem.packCurrent <= 2000)) //电压大于逆变器充电限压值,电流小于2A(逆变器会逐渐停止充电,但BMS不关闭MOS)
{
bmsMem.soc = 100;
fcc_fullFlag = 1;
//如果不在等待校准满充容量,同时更新rcc=fcc
if(fcc_CaliStartFlag == 0)
{
bmsMem.rcc = fcc;
//不计入循环次数
rcc_Ah = bmsMem.rcc/3600/1000;
oldrcc_Ah = rcc_Ah;
}
}
//满充条件4:满充电压56V+5A截止电流
else if( ((paraMem.soc100_methods & 0x08) != 0) && ((bmsMem.bStatus1 & 0x0800) != 0)) //发生满充停止充电(会关MOS)
{
bmsMem.soc = 100;
fcc_fullFlag = 1;
//如果不在等待校准满充容量,同时更新rcc=fcc
if(fcc_CaliStartFlag == 0)
{
bmsMem.rcc = fcc;
//不计入循环次数
rcc_Ah = bmsMem.rcc/3600/1000;
oldrcc_Ah = rcc_Ah;
}
}
else
{
fcc_fullFlag = 0;
}
//read bFLAG1 ov bit 满放校准
if((bmsMem.bStatus1 & 0x0002) !=0) //发生单体欠压保护
{
if(bmsMem.packVoltage < packcheck_UV) //总压判断(根据串数变化)
{
bmsMem.soc = 0;
bmsMem.rcc = 0;
}
}
else if((bmsMem.bStatus1 & 0x0200) !=0) //发生总体欠压保护
{
bmsMem.soc = 0;
bmsMem.rcc = 0;
}
else
{
if(bDSGING) //还正在放电但rcc已经为0,会上调一点容量,直到满足满放条件
{
if(bmsMem.soc == 0) //若SOC原是0%,放电不破坏该值
{
bmsMem.rcc = 0;
}
else if((bmsMem.rcc <= 360000) || (bmsMem.rcc > 0xFFE00000)) //因改为无符号,需清零的负数范围设-1~-2,097,151,电流值在2000A范围内皆可接受,不出错的正数范围为0~4,292,870,144,大约1192Ah
{
bmsMem.soc = 1;
bmsMem.rcc = 360000 * 5; //增加0.5Ah用于继续下降 //在0.1Ah~0.5Ah之间维持(soc=1%)
}
}
}
//15%校准:当总电压小于等于50V时,若SOC大于15%则校准到15% //4.28增加电流条件放电15A以下
if((bmsMem.packVoltage <= (50000/16*bmsMem.ucCellNum)) && (bmsMem.soc > 15) && (bmsMem.packCurrent > (-15000)) && (bmsMem.packCurrent < 100))
{
Cali_Soc_Flag = 1;
}
else
{
Cali_Soc_Flag = 0;
}
if((paraMem.cali_min_disable & 0x8000) == 0) //允许做满充容量校准
{
Cali_FCC_Moni(); //电流和SOC满足条件后执行
}
else //不允许
{
//在以上所有执行完后,有问题再纠正下
if(bmsMem.soc == 100) //SOC已经到了100%,此时rcc最高不超过fcc
{
if(bmsMem.rcc > fcc)
{
bmsMem.rcc = fcc;
}
}
else //SOC低于100%,此时rcc最高不超过fcc*99%
{
if(bmsMem.rcc > fcc/100 * 99)
{
if(bCHGING) //正在充电
{
bmsMem.rcc = fcc - (fcc/1000*15);
}
else
{
bmsMem.rcc = fcc/100 * 99;
}
}
}
}
bmsMem.can_soc = bmsMem.soc; //sum of all packs
bmsMem.can_soh = bmsMem.soh; //sum of all packs
/*数据存入EEPROM*/
//SOC write to eeprom
if(bmsMem.soc != oldsoc)
{
oldsoc = bmsMem.soc;
tempWr[0] = bmsMem.soc;
EEPROM_WrMulByte(EE_SOC,&tempWr[0]);
delay_ms(5);
}
//累积容量 write to eeprom
rcc_Ah = bmsMem.rcc/3600/1000;
if(rcc_Ah > oldrcc_Ah) //当容量上涨了1Ah
{
cumuliCapacity += 10*(rcc_Ah - oldrcc_Ah); //将增加部分放入累积容量中
oldrcc_Ah = rcc_Ah;
//获得进行循环次数计算的单位容量(此处不可为0)
if(paraMem.sohcali_transCent != 0)
{
capacity = 10*ncc_Ah * paraMem.sohcali_transCent/100;
}
else
{
capacity = 10*ncc_Ah * 90/100; //默认90%
}
//计算循环次数
if(cumuliCapacity >= capacity) //当累积容量超出总容量的90%,增加循环次数
{
bmsMem.cycleCount += cumuliCapacity / capacity;
cumuliCapacity = cumuliCapacity % capacity;
}
//保存当前(或参与过循环次数计算后的)累积容量
tempWr[0] = (cumuliCapacity >> 8) & 0xff;
tempWr[1] = (cumuliCapacity >> 0) & 0xff;
EEPROM_WrMulByte(EE_CUMULI,tempWr);
delay_ms(5);
}
else
{
oldrcc_Ah = rcc_Ah; //要同步增减
}
//循环次数 write to eeprom
if(bmsMem.cycleCount != oldcyc)
{
oldcyc = bmsMem.cycleCount;
tempWr[0] = (bmsMem.cycleCount >> 8) & 0xff;
tempWr[1] = (bmsMem.cycleCount >> 0) & 0xff;
EEPROM_WrMulByte(EE_CYCLE,tempWr);
delay_ms(5);
if(cumuliCapClear_flag == 1)
{
cumuliCapClear_flag = 0;
//保存累积容量为0
cumuliCapacity = 0;
tempWr[0] = (cumuliCapacity >> 8) & 0xff;
tempWr[1] = (cumuliCapacity >> 0) & 0xff;
EEPROM_WrMulByte(EE_CUMULI,tempWr);
delay_ms(5);
}
}
/*通过循环次数计算SOH*/
if(bmsMem.cycleCount <= paraMem.sohcali_stopTime)
{
if(bmsMem.cycleCount <= paraMem.sohcali_startTime)
{
bmsMem.soh = 100; //维持100%
}
else
{
uint16_t cent = (paraMem.sohcali_stopTime-1 - paraMem.sohcali_startTime) / (99-paraMem.sohcali_minSOH); //每1%对应的大概次数
bmsMem.soh = 99 - (bmsMem.cycleCount - paraMem.sohcali_startTime) / cent; //从99%开始下降
}
}
else //超过就维持最大次数
{
bmsMem.cycleCount = paraMem.sohcali_stopTime;
bmsMem.soh = paraMem.sohcali_minSOH;
}
//Wh版屏幕需要
bmsMem.can_cumuliCap = cumuliCapacity/10; //sum of all packs
bmsMem.can_cycleCnt = bmsMem.cycleCount; //sum of all packs
//过压报警的显示判断:在接近满电时,发生[过压保护],则不会因此亮灯屏幕也不显示过压
#if Key_PressLong
if((ON_confirm_flg != 0) && (RST_confirm_flg != 1) && (OFF_confirm_flg != 1))
#endif
{
if(((bmsMem.bStatus1 & 0x0001) != 0) || ((bmsMem.bStatus1 & 0x0100) != 0)) //单体过压+总体过压
{
if(bmsMem.soc<99) //在正常工作时,发生[过压保护],正常显示
{
bAlarmFlag = 1;
if(sleep_flag == 0) LED_ALARM_On();
else LED_ALARM_Off();
}
else
{
//若出现其他报警,就不恢复原状(-单体过压-总体过压+急停)
if( ((bmsMem.bStatus1 & 0x067e) == 0) && ((bmsMem.bStatus2 & 0x00ff) == 0) && ((bmsMem.bStatus3 & 0x0008) == 0) && ((bmsMem.temperaStatus & 0x0f7f) == 0) )
{
bAlarmFlag = 0;
bAlarmFlagOld = 0;
LED_ALARM_Off();
}
}
}
}
//led指示
#if Key_PressLong
if((ON_confirm_flg != 0) && (RST_confirm_flg != 1) && (OFF_confirm_flg != 1))
#endif
{
if(sleep_flag == 0)
{
if(bmsMem.soc<5)
{
LED1_Off();
LED2_Off();
LED3_Off();
LED4_Off();
}
else if(bmsMem.soc>=5 && bmsMem.soc<30)
{
LED1_On();
LED2_Off();
LED3_Off();
LED4_Off();
}
else if(bmsMem.soc>=30 && bmsMem.soc<60)
{
LED1_On();
LED2_On();
LED3_Off();
LED4_Off();
}
else if(bmsMem.soc>=60 && bmsMem.soc<90)
{
LED1_On();
LED2_On();
LED3_On();
LED4_Off();
}
else
{
LED1_On();
LED2_On();
LED3_On();
LED4_On();
}
}
else //休眠模式下灯全灭
{
LED1_Off();
LED2_Off();
LED3_Off();
LED4_Off();
}
}
}
#define CALI_SOC_CNT 12000 //2*60*100个10ms=2分钟
void Cali_SOC_Moni(void)
{
if(Cali_Soc_Flag == 1)
{
CaliSocMoniCount--;
if(CaliSocMoniCount == 0)
{
CaliSocMoniCount = CALI_SOC_CNT;
if(bmsMem.soc>15)
{
bmsMem.soc = 15;
bmsMem.rcc = fcc/100 * bmsMem.soc;
}
}
}
else
{
CaliSocMoniCount = CALI_SOC_CNT;
}
}
//校准满充容量的执行过程
//若刚开始充电时,SOC=0/1%,则允许校准满充容量,同步计时12h超过则不再校准
//若12h内,满足了满充判定的任一条件而使SOC=100%,在基本停止充电(电流<2A)后执行容量校准:赋值[满充容量]=此时的剩余容量并保存。
//若12h外,满足了满充判定的任一条件而使SOC=100%,不会变动满充容量。
//剩余容量可以一直增长,若超过了原来的满充容量,SOC保持100%不再增长。
void Cali_FCC_Moni(void)
{
//没有在计时
if(fcc_CaliStartFlag == 0)
{
if((bmsMem.packCurrent >= 2000) && (bmsMem.soc <= 1)) //充电(大于2A)时,若此时SOC处于低点,进行校准总容量的倒计时
{
fcc_CaliStartFlag = 1;
//更新起始点,如果晶振正常就把标志和起始点都写入EEPROM
if(LSEErrFlag!=1)
{
uint8_t time[4];
fcc_Calitimecount=RTC_GetCounter();
//写入起始时间
time[0] = fcc_Calitimecount>>24 & 0xff;
time[1] = fcc_Calitimecount>>16 & 0xff;
time[2] = fcc_Calitimecount>>8 & 0xff;
time[3] = fcc_Calitimecount>>0 & 0xff;
EEPROM_WrMulByte(EE_FCC_TIME,time);
delay_ms(5);
}
else
{
fcc_Cali_Moni_Count = FCCCALI_MON_CNT;
}
}
}
//此前已经启动计时
else
{
if((bmsMem.packCurrent < 2000) && (fcc_fullFlag == 1)) //不在充电时,若已满足满充条件,说明此时的剩余容量是当前的满充容量值
{
//赋值满充容量=剩余容量
fcc = bmsMem.rcc;
fcc_Ah = bmsMem.rcc / 3600000;
tmpWrFCC[0] = (fcc>>24) & 0xff;
tmpWrFCC[1] = (fcc>>16) & 0xff;
tmpWrFCC[2] = (fcc>> 8) & 0xff;
tmpWrFCC[3] = (fcc>> 0) & 0xff;
tmpWrFCC[4] = tmpWrFCC[0] ^ 0xff;
tmpWrFCC[5] = tmpWrFCC[1] ^ 0xff;
tmpWrFCC[6] = tmpWrFCC[2] ^ 0xff;
tmpWrFCC[7] = tmpWrFCC[3] ^ 0xff;
EEPROM_WrMulByte(EE_FCC,tmpWrFCC);
delay_ms(20);
fcc_CaliStartFlag = 0; //清零
if(LSEErrFlag == 0)
{
EEPROM_WrMulByte(EE_FCC_TIME,ClearEE);
delay_ms(5);
}
}
}
}
+3646
View File
File diff suppressed because it is too large Load Diff
+120
View File
@@ -0,0 +1,120 @@
/**
******************************************************************************
* @file LBS_Transmit.c
* @author
* @version
* @date
* @brief
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
#include <math.h>
#include <stdint.h>
// PI定义
#define M_PI 3.1415926535897932384626433832795
// 常量定义
#define EARTH_RADIUS 6378245.0 // 地球长半径
#define EE 0.00669342162296594323 // 偏心率平方
/**
* @brief 检查坐标是否在中国大陆以外
* @return 1:境外, 0:境内
*/
static int is_out_of_china(double lon, double lat)
{
if (lon < 72.004 || lon > 137.8347)
{
return 1;
}
if (lat < 0.8293 || lat > 55.8271)
{
return 1;
}
return 0;
}
/**
* @brief 纬度转换辅助函数
*/
static double transform_lat(double x, double y)
{
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(fabs(x));
ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0;
ret += (20.0 * sin(y * M_PI) + 40.0 * sin(y / 3.0 * M_PI)) * 2.0 / 3.0;
ret += (160.0 * sin(y / 12.0 * M_PI) + 320 * sin(y * M_PI / 30.0)) * 2.0 / 3.0;
return ret;
}
/**
* @brief 经度转换辅助函数
*/
static double transform_lon(double x, double y)
{
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(fabs(x));
ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0;
ret += (20.0 * sin(x * M_PI) + 40.0 * sin(x / 3.0 * M_PI)) * 2.0 / 3.0;
ret += (150.0 * sin(x / 12.0 * M_PI) + 300.0 * sin(x / 30.0 * M_PI)) * 2.0 / 3.0;
return ret;
}
/**
* @brief GCJ-02转WGS84坐标系
* @param gcj_lon GCJ-02经度
* @param gcj_lat GCJ-02纬度
* @param wgs_lon WGS84经度输出指针
* @param wgs_lat WGS84纬度输出指针
* @note 迭代7次,精度约0.1-0.5米
*/
void gcj02_to_wgs84(double gcj_lon, double gcj_lat, double *wgs_lon, double *wgs_lat)
{
//如果坐标不在中国大陆,直接返回原坐标
if(is_out_of_china(gcj_lon, gcj_lat))
{
*wgs_lon = gcj_lon;
*wgs_lat = gcj_lat;
return;
}
//使用迭代法进行转换(7次迭代足够精确)
double d_lon = 0.0, d_lat = 0.0;
double tmp_lon = gcj_lon, tmp_lat = gcj_lat;
for(int i = 0; i < 7; i++)
{
//计算当前WGS84坐标转GCJ02的偏移
double delta_lat = transform_lat(tmp_lon - 105.0, tmp_lat - 35.0);
double delta_lon = transform_lon(tmp_lon - 105.0, tmp_lat - 35.0);
double rad_lat = tmp_lat * M_PI / 180.0;
double magic = sin(rad_lat);
magic = 1 - EE * magic * magic;
double sqrt_magic = sqrt(magic);
delta_lat = (delta_lat * 180.0) / ((EARTH_RADIUS * (1 - EE)) / (magic * sqrt_magic) * M_PI);
delta_lon = (delta_lon * 180.0) / (EARTH_RADIUS / sqrt_magic * cos(rad_lat) * M_PI);
// 计算与目标GCJ02坐标的差值
d_lat = gcj_lat - (tmp_lat + delta_lat);
d_lon = gcj_lon - (tmp_lon + delta_lon);
// 更新WGS84坐标估计
tmp_lat += d_lat;
tmp_lon += d_lon;
}
*wgs_lon = tmp_lon;
*wgs_lat = tmp_lat;
}
+1407
View File
File diff suppressed because it is too large Load Diff
+172
View File
@@ -0,0 +1,172 @@
/**
******************************************************************************
* @file tim.c
* @author Jerry
* @version V2.1
* @date 19-April-2022
* @brief tim program body.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
#define SHORT_CIRCUIT_THRESHOLD 70
#define OPEN_CIRCUIT_THRESHOLD 33000
uint8_t ucTempeMiddle;
/*温度电阻对照表*/
//4根温度线——深圳诺睿斯:MF52D103F3950FCL500XH
//单位10欧
//-55 - +125
uint16_t const NTC_103AT[181]=
{
58354, 55464, 52696, 50048, 47515,
45097, 42789, 40589, 38492, 36496, 34597, 32791, 31075, 29444, 27896,
26427, 25034, 23713, 22460, 21273, 20148, 19083, 18075, 17120, 16216,
15361, 14551, 13785, 13061, 12376, 11728, 11114, 10535, 9986, 9468,
8977, 8513, 8075, 7660, 7267, 6896, 6545, 6212, 5898, 5601,
5319, 5053, 4801, 4562, 4336, 4122, 3920, 3728, 3546, 3374,
3211, 3057, 2910, 2771, 2639, 2515, 2396, 2284, 2177, 2076,
1978, 1889, 1802, 1720, 1642, 1568, 1497, 1430, 1366, 1306,
1248, 1193, 1141, 1092, 1044, 1000, 957, 916, 877, 840,
805, 771, 739, 709, 679, 652, 625, 600, 576, 552,
530, 509, 489, 470, 452, 434, 417, 401, 386, 371,
358, 344, 331, 318, 306, 295, 284, 274, 264, 254,
245, 236, 228, 220, 212, 205, 198, 191, 184, 178,
172, 166, 160, 155, 150, 145, 140, 135, 131, 126,
122, 118, 115, 111, 107, 104, 101, 97, 94, 91,
89, 86, 83, 81, 78, 76, 74, 71, 69, 67,
65, 63, 61, 60, 58, 56, 55, 53, 52, 50,
49, 47, 46, 45, 43, 42, 41, 40, 39, 38,
37, 36, 35, 34, 33, 32
};
//板贴热敏电阻——南京时恒:CMFA 103F3950
//单位10欧
//-40 - +125
uint16_t const NTC_103AT_CMFA[166]=
{
34527, 32279, 30192, 28254, 26454, 24781, 23225, 21777, 20429, 19173,
18003, 16912, 15894, 14944, 14057, 13228, 12452, 11726, 11048, 10413,
9818, 9261, 8740, 8251, 7792, 7362, 6958, 6579, 6223, 5889,
5574, 5278, 5000, 4738, 4491, 4259, 4040, 3833, 3638, 3454,
3281, 3117, 2963, 2817, 2680, 2549, 2426, 2309, 2199, 2094,
1995, 1902, 1813, 1729, 1649, 1574, 1502, 1434, 1369, 1308,
1250, 1195, 1142, 1092, 1045, 1000, 957, 916, 877, 840,
804, 771, 739, 708, 679, 652, 625, 600, 576, 553,
531, 510, 490, 471, 452, 435, 418, 402, 387, 372,
358, 345, 332, 320, 308, 297, 286, 276, 266, 256,
247, 238, 230, 222, 214, 207, 200, 193, 186, 180,
174, 168, 162, 157, 152, 147, 142, 137, 133, 129,
124, 120, 117, 113, 109, 106, 103, 100, 96, 94,
91, 88, 85, 83, 80, 78, 76, 73, 71, 69,
67, 65, 63, 61, 60, 58, 56, 55, 53, 52,
50, 49, 48, 46, 45, 44, 43, 42, 41, 40,
39, 38, 37, 36, 35, 34
};
//根据NTC阻值计算温度值:-55~125
//返回的温度值需要-2731
uint16_t TEMP_Cal(uint16_t ntcR)
{
uint8_t i;
uint16_t tempcalcu, temperature;
tempcalcu = ntcR ;
if(tempcalcu >= NTC_103AT[0])
{
temperature = 2731-550; //温度值小于-55度时 =-55度
}
else if(tempcalcu <= NTC_103AT[180])
{
temperature = 2731+1250; //温度值大于125度时 =125度
}
else
{
i = ucTempeMiddle;
if(tempcalcu > NTC_103AT[i])
{
for(i=ucTempeMiddle - 1; i>0; i--)
{
if(tempcalcu <= NTC_103AT[i]) //NTC103AT[i+1]<resis<NTC103AT[i]
{
break;
}
}
}
else
{
for(i=ucTempeMiddle+1; i<180; i++)
{
if(tempcalcu > NTC_103AT[i]) //NTC103AT[i-1]<resis<NTC103AT[i]
{
break;
}
}
i--;
}
ucTempeMiddle = i;
temperature = (uint16_t)(ucTempeMiddle-55)*10 + (NTC_103AT[i]-tempcalcu)*10 / (NTC_103AT[i]-NTC_103AT[i+1])+2731;
}
return temperature;
}
//根据NTC_CMFA阻值计算温度值-40~125
//返回的温度值需要-2731
uint16_t TEMP_Cal_CMFA(uint16_t ntcR)
{
uint8_t i;
uint16_t tempcalcu, temperature;
tempcalcu = ntcR ;
if(tempcalcu >= NTC_103AT_CMFA[0])
{
temperature = 2731-400; //温度值小于-40度时 =-40度
}
else if(tempcalcu <= NTC_103AT_CMFA[165])
{
temperature = 2731+1250; //温度值大于125度时 =125度
}
else
{
i = ucTempeMiddle;
if(tempcalcu > NTC_103AT_CMFA[i])
{
for(i=ucTempeMiddle - 1; i>0; i--)
{
if(tempcalcu <= NTC_103AT_CMFA[i]) //NTC103AT[i+1]<resis<NTC103AT[i]
{
break;
}
}
}
else
{
for(i=ucTempeMiddle+1; i<165; i++)
{
if(tempcalcu > NTC_103AT_CMFA[i]) //NTC103AT[i-1]<resis<NTC103AT[i]
{
break;
}
}
i--;
}
ucTempeMiddle = i;
temperature = (uint16_t)(ucTempeMiddle-40)*10 + (NTC_103AT_CMFA[i]-tempcalcu)*10 / (NTC_103AT_CMFA[i]-NTC_103AT_CMFA[i+1])+2731;
}
return temperature;
}
+273
View File
@@ -0,0 +1,273 @@
/**
******************************************************************************
* @file OCV.c
* @author
* @version
* @date
* @brief
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
uint8_t OCV_soc; //通过OCV曲线获得的soc值
uint8_t OCV_status; //定时校准的当前状态,0:刚开机要获取存储时间 1:符合条件正在计时 2:不在静置 3:不允许OCV校准
uint8_t OCV_Wait_flag; //允许OCV校准走倒计时的标志
uint8_t OCV_CaliSOC_flag; //允许执行OCV校准获取当前电压对应soc的标志
uint16_t OCV_WrTime_count; //在非待机状态下,每过30min记录一次,防止关机时未回到待机状态导致不可用
OCV_Data ocv_data[15]; //OCV曲线数组
uint16_t ocv_Media_dp[15]; //根据写入数据获得中间值
//根据paraMem值,填充ocv_data[]和ocv_Media_dp[]
void OCV_CaliSOC_DataWr(void)
{
uint8_t i;
//填充SOC,共15个点
ocv_data[0].soc = 0;
ocv_data[1].soc = 5;
ocv_data[2].soc = 10;
ocv_data[3].soc = 15;
ocv_data[4].soc = 20;
ocv_data[5].soc = 30;
ocv_data[6].soc = 40;
ocv_data[7].soc = 50;
ocv_data[8].soc = 60;
ocv_data[9].soc = 70;
ocv_data[10].soc = 80;
ocv_data[11].soc = 85;
ocv_data[12].soc = 90;
ocv_data[13].soc = 95;
ocv_data[14].soc = 100;
//填充电压,共15个点
for(i=0;i<15;i++)
{
//ocv_data[i].ocv_cp = paraMem.ocv_cpBuf[i] * bmsMem.ucCellNum;
ocv_data[i].ocv_dp = paraMem.ocv_dpBuf[i] * bmsMem.ucCellNum;
}
//赋值中间量,共14个点
for(i=0;i<=13;i++)
{
ocv_Media_dp[i] = (ocv_data[i].ocv_dp + ocv_data[i+1].ocv_dp) / 2;
}
//50%-90%之间不考虑
ocv_Media_dp[7] = ocv_data[7].ocv_dp; //低于50%对应基准值,校准50%
ocv_Media_dp[11] = ocv_data[12].ocv_dp; //高于90%对应基准值,校准90%
}
//计算OCV表格的dp里,当前总电压对应的SOC
uint8_t OCV_CaliSoc_dp(void)
{
uint16_t caliSoc = 0;
//对总电压求出对应SOC
if(bmsMem.packVoltage >= ocv_Media_dp[13]) //超过最大值认为是满电
{
caliSoc = 100;
}
else if((bmsMem.packVoltage < ocv_Media_dp[13]) && (bmsMem.packVoltage >= ocv_Media_dp[12]))
{
caliSoc = 95;
}
else if((bmsMem.packVoltage < ocv_Media_dp[12]) && (bmsMem.packVoltage >= ocv_Media_dp[11]))
{
caliSoc = 90;
}
else if((bmsMem.packVoltage < ocv_Media_dp[11]) && (bmsMem.packVoltage > ocv_Media_dp[7]))
{
//当电压在>50%、<90%的电压值内时,若实时SOC不在范围内,则校准到50%/90%,否则不校准
if(bmsMem.soc > 90)
{
caliSoc = 90;
}
else if(bmsMem.soc < 50)
{
caliSoc = 50;
}
else
{
caliSoc = bmsMem.soc; //等于当前值,使不会校准
}
}
else if((bmsMem.packVoltage < ocv_Media_dp[7]) && (bmsMem.packVoltage >= ocv_Media_dp[6]))
{
caliSoc = 50;
}
else if((bmsMem.packVoltage < ocv_Media_dp[6]) && (bmsMem.packVoltage >= ocv_Media_dp[5]))
{
caliSoc = 40;
}
else if((bmsMem.packVoltage < ocv_Media_dp[5]) && (bmsMem.packVoltage >= ocv_Media_dp[4]))
{
caliSoc = 30;
}
else if((bmsMem.packVoltage < ocv_Media_dp[4]) && (bmsMem.packVoltage >= ocv_Media_dp[3]))
{
caliSoc = 20;
}
else if((bmsMem.packVoltage < ocv_Media_dp[3]) && (bmsMem.packVoltage >= ocv_Media_dp[2]))
{
caliSoc = 15;
}
else if((bmsMem.packVoltage < ocv_Media_dp[2]) && (bmsMem.packVoltage >= ocv_Media_dp[1]))
{
caliSoc = 10;
}
else if((bmsMem.packVoltage < ocv_Media_dp[1]) && (bmsMem.packVoltage >= ocv_Media_dp[0]))
{
caliSoc = 5;
}
else if(bmsMem.packVoltage <= ocv_Media_dp[0]) //小于最小值认为是空电
{
caliSoc = 0;
}
return caliSoc;
}
//在RTC有效+允许执行校准倒计时+满足静置时间时,获取开路电压法对应soc
//在电芯温度合适+原SOC不靠谱时,将该soc写入
//执行校准后,刷新计时起点,重新等待30min后再次执行校准
void OCV_CaliSOC(void)
{
uint8_t tempEE[4]; //用于保存计时起点
if((LSEErrFlag == 0) && ((paraMem.ocv_min_disable & 0x8000) == 0)) //RTC有效,且允许开路电压校准SOC
{
//静置状态,对应OCV_status为1
if((bmsMem.packCurrent > (-500)) && (bmsMem.packCurrent < 500))
{
//刚开机,读取存在EEPROM的时间
if(OCV_status == 0)
{
OCV_status = 1;
OCV_Wait_flag = 1; //允许在rtc函数中进行时间判断
EEPROM_RdMulByte(EE_TIME_OCV, tempEE);
ocvtimecount = tempEE[0]<<24 | tempEE[1]<<16 | tempEE[2]<<8 | tempEE[3];
if(ocvtimecount > timecount) //存的数据异常
{
//更新计时起点
ocvtimecount = RTC_GetCounter();
//保存到EEPROM
tempEE[0] = (ocvtimecount >> 24) & 0xff;
tempEE[1] = (ocvtimecount >> 16) & 0xff;
tempEE[2] = (ocvtimecount >> 8) & 0xff;
tempEE[3] = (ocvtimecount >> 0) & 0xff;
EEPROM_WrMulByte(EE_TIME_OCV, tempEE);
delay_ms(10);
}
}
//从其他状态回来/从不允许改为允许,更新当前时间为计时起点
else if(OCV_status != 1)
{
OCV_status = 1;
OCV_Wait_flag = 1; //允许在rtc函数中进行时间判断
//更新计时起点
ocvtimecount = RTC_GetCounter();
//保存到EEPROM
tempEE[0] = (ocvtimecount >> 24) & 0xff;
tempEE[1] = (ocvtimecount >> 16) & 0xff;
tempEE[2] = (ocvtimecount >> 8) & 0xff;
tempEE[3] = (ocvtimecount >> 0) & 0xff;
EEPROM_WrMulByte(EE_TIME_OCV, tempEE);
delay_ms(10);
}
//当倒计时结束,校准SOC并更新计时起点
if((OCV_Wait_flag == 1) && (OCV_CaliSOC_flag == 1))
{
//准备下一次计时
OCV_CaliSOC_flag = 0;
ocvtimecount = RTC_GetCounter();
//保存到EEPROM
tempEE[0] = (ocvtimecount >> 24) & 0xff;
tempEE[1] = (ocvtimecount >> 16) & 0xff;
tempEE[2] = (ocvtimecount >> 8) & 0xff;
tempEE[3] = (ocvtimecount >> 0) & 0xff;
EEPROM_WrMulByte(EE_TIME_OCV, tempEE);
delay_ms(10);
//更新OCV中值表
OCV_CaliSOC_DataWr();
//获取校准SOC
OCV_soc = OCV_CaliSoc_dp();
if((OCV_soc == 0) && ((bmsMem.packVoltage == 0) || (bmsMem.packVoltage > ocv_data[0].ocv_dp))) //电压异常改0% or 电压正常但计算得0% = 不执行
{
return;
}
else if(OCV_soc < bmsMem.soc-paraMem.ocv_soc_Range) //只减不增
{
//若温度和原值差距过大则不替换
if((TemperatureAverage > 250+2731-paraMem.ocv_T_Range*10) && (TemperatureAverage < 250+2731+paraMem.ocv_T_Range*10))
{
bmsMem.soc = OCV_soc;
bmsMem.rcc = fcc/100 * bmsMem.soc;
rcc_Ah = fcc_Ah * bmsMem.soc /100;
oldrcc_Ah = rcc_Ah;
}
}
}
OCV_WrTime_count = 0;
}
//不在静置状态,对应OCV_status为2
else
{
OCV_status = 2;
//清除标志位
OCV_Wait_flag = 0;
OCV_CaliSOC_flag = 0;
//非静置状态,每隔30min记录一次计时起点,防止突然断电,导致倒计时偏差过大
//此值在带电流重启后立刻静置的条件下启用
OCV_WrTime_count++;
if(OCV_WrTime_count > 60*30) //等30min
{
OCV_WrTime_count = 0;
ocvtimecount = RTC_GetCounter();
//保存到EEPROM
tempEE[0] = (ocvtimecount >> 24) & 0xff;
tempEE[1] = (ocvtimecount >> 16) & 0xff;
tempEE[2] = (ocvtimecount >> 8) & 0xff;
tempEE[3] = (ocvtimecount >> 0) & 0xff;
EEPROM_WrMulByte(EE_TIME_OCV, tempEE);
delay_ms(10);
}
}
}
//关闭开路电压法,对应OCV_status为3
else
{
OCV_status = 3;
//清除倒计时和标志位
ocvtimecount = 0;
OCV_Wait_flag = 0;
OCV_CaliSOC_flag = 0;
}
}
+698
View File
@@ -0,0 +1,698 @@
/**
******************************************************************************
* @file OTA.c
* @author
* @version
* @date
* @brief
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
#include "string.h"
#include <stdio.h>
#if LTE_Conn
//【OTA数据范围】
#define DATA_BUF_LEN 256 //每包长度
#define PAGE_LEN 120*(1024/DATA_BUF_LEN) //序号范围
#define SIZE_LEN 120*1024 //总字节长度限制 120K以内
//【Flash存储】
#define INFO_LEN 12 //存储信息限制,信息总长包括反向存储
#define DATA_LEN 2048 //存储数据限制,每扇2K=256Byte*8
#define USER_FW_INFO 0X08020000 //新程序信息地址
#define USER_FW_MIDD 0X08021800 //新程序数据地址
//【云平台通信】
uint8_t LTE_OTA_Flag; //4G升级标志 1:收到升级相关报文
uint8_t LTE_OTA_fineFlag; //4G升级完成上报标志(上线后先上报升级完成) 0xAA:升级成功 0xBB:维持原程序
uint8_t ota_code; //回复标志 0:成功 1:内容有缺 6:升级失败仍运行原程序
uint16_t OTA_ErrCnt; //OTA过程的错误计数
//【流程】
//0xA8.回复OTA升级信息帧
//0xA9.回复OTA升级数据帧
//0xAA.转存完成,设备上线后主动上报OTA升级完成
#define ota_check_sub 0xA7
#define ota_info_pub 0xA8
#define ota_data_pub 0xA9
//【步骤】
//0xA8_201~205[回复OTA升级信息帧] 201:主题长度 202:主题内容 203:属性长度 204:属性内容 205:确认上传
//0xA9_206~210[回复OTA升级数据帧] 206:主题长度 207:主题内容 208:属性长度 209:属性内容 210:确认上传
//0xAA_211~215[主动上报OTA升级成功] 211:主题长度 212:主题内容 213:属性长度 214:属性内容 215:确认上传
#define ota_check_sub_step1 201
#define ota_check_sub_step2 202
#define ota_check_sub_step3 203
#define ota_info_pub_step1 211
#define ota_info_pub_step2 212
#define ota_info_pub_step3 213
#define ota_info_pub_step4 214
#define ota_info_pub_step5 215
#define ota_data_pub_step1 216
#define ota_data_pub_step2 217
#define ota_data_pub_step3 218
#define ota_data_pub_step4 219
#define ota_data_pub_step5 220
uint32_t firmware_size; //总包的大小
uint16_t firmware_crc; //总包的CRC校验码
uint16_t rev_page; //OTA升级一共多少分包
uint16_t rev_index; //当前包序号 0~rev_page-1,用于计算存入的地址
uint16_t rev_crc; //当前包数据的CRC校验码
uint16_t ota_data_crc; //数据帧的CRC校验码
uint8_t ota_wr_info[INFO_LEN]; //存放信息让底层能判断读出
uint8_t ota_wr_data[DATA_LEN]; //保存2K数据后再下载
uint8_t OTAfine_WrFlg; //更新OTA升级成功/失败标志的标志 0xAA:更新到0 0xBB:更新到0xBB
uint8_t otaSub_reply_count;
uint8_t otaInfo_reply_count;
uint8_t otaData_reply_count;
uint8_t ota_rx_Buf[2048];
//下发[OTA升级信息]报文的处理
void LTE_OTA_Info(void)
{
//进入升级模式
LTE_OTA_Flag = 1;
//准备订阅主题和发送回复
LTE_status = ota_check_sub;
LTE_step = ota_check_sub_step1;
//收到并存储信息
//{"page":100,"size":65535,"method":"crc16"}
if(strstr(LTE_Rx_Buf, "\"page\"") && strstr(LTE_Rx_Buf, "\"size\"") && strstr(LTE_Rx_Buf, "\"check\""))
{
char str[6]; //字符串 0~102400
uint8_t len = 0; //字符串长度
uint32_t temp; //过程量
uint8_t tmpWr[12];
ota_code = 0;
//Bin文件最大120KB,对应Page最大PAGE_LEN
len = GetStr("\"page\":", ',', ',', LTE_Rx_Buf, str);
sscanf(str, "%u", &temp);
if((temp > 0) && (temp <= PAGE_LEN) && (len > 0))
{
rev_page = temp;
}
else
{
ota_code = 2; //内容超出范围
return;
}
//Bin文件最大120KB,对应size最大120*1024
len = GetStr("\"size\":", ',', ',', LTE_Rx_Buf, str);
sscanf(str, "%u", &temp);
if((temp > 0) && (temp <= SIZE_LEN) && (len > 0))
{
firmware_size = temp;
}
else
{
ota_code = 2; //内容超出范围
return;
}
//整体CRC码
len = GetStr("\"check\":\"", '\"', '\"', LTE_Rx_Buf, str);
if(len == 4)
{
sscanf(str, "%4hx", &firmware_crc);
}
else
{
ota_code = 2; //内容超出范围
return;
}
//序号清零,等待升级
rev_index = 0;
//赋值
tmpWr[0] = (firmware_size>> 0) & 0xFF;
tmpWr[1] = (firmware_size>> 8) & 0xFF;
tmpWr[2] = (firmware_size>>16) & 0xFF;
tmpWr[3] = (firmware_size>>24) & 0xFF;
tmpWr[4] = (firmware_crc >> 0) & 0xFF;
tmpWr[5] = (firmware_crc >> 8) & 0xFF;
tmpWr[6] = tmpWr[0] ^ 0xff;
tmpWr[7] = tmpWr[1] ^ 0xff;
tmpWr[8] = tmpWr[2] ^ 0xff;
tmpWr[9] = tmpWr[3] ^ 0xff;
tmpWr[10] = tmpWr[4] ^ 0xff;
tmpWr[11] = tmpWr[5] ^ 0xff;
//把OTA信息存储
FLASH_WrData(USER_FW_INFO, (uint16_t *)&tmpWr[0], INFO_LEN/2); //12/2=6
}
else
{
ota_code = 1; //内容有缺
}
}
//下发[OTA升级数据]报文的处理
void LTE_OTA_Data(void)
{
LTE_status = ota_data_pub;
LTE_step = ota_data_pub_step1;
//收到并存储数据
//{"index":0,"sign":"Hex","data":"HEX..."}
if(strstr(LTE_Rx_Buf, "\"index\"") && strstr(LTE_Rx_Buf, "\"data\"") && strstr(LTE_Rx_Buf, "\"check\""))
{
char str[6] = {0}; //字符串 0~102400
uint16_t len = 0; //字符串长度
uint32_t temp = 0; //过程量
char data_str[DATA_BUF_LEN*2+4]; //字符串
uint16_t dataLen = 0; //数据长度需要单独拿出参与最后一包的判断
uint8_t dataIdx; //当前包对应2K数组中的位置 0~7
ota_code = 0;
//Bin文件最大120KB,对应index最大PAGE_LEN
len = GetStr("\"index\":", ',', ',', LTE_Rx_Buf, str);
sscanf(str, "%u", &temp);
if(len > 0)
{
if(temp == 0)
{
rev_index = temp;
}
else if((temp > 0) && (temp <= PAGE_LEN))
{
if(temp == rev_index+1)
{
rev_index = temp;
}
else
{
ota_code = 3; //内容不连续
return;
}
}
else
{
ota_code = 2; //内容超出范围
return;
}
}
else
{
ota_code = 1; //内容有缺
}
//该包的CRC码
len = GetStr("\"check\":\"", '\"', '\"', LTE_Rx_Buf, str);
if(len == 4)
{
sscanf(str, "%4hx", &rev_crc);
}
else if(len > 0)
{
if(rev_index != 0) rev_index--; //该包接收错误,应回退等待下一次发当前包
ota_code = 2; //内容超出范围
return;
}
else
{
ota_code = 1; //内容有缺
}
//该包的数据字符串放入str数组
char* dataStart = strstr(LTE_Rx_Buf, "\"data\":\""); dataStart += strlen("\"data\":\"");
char* dataEnd = strchr(dataStart, '\"');
dataLen = dataEnd - dataStart;
strncpy(data_str, dataStart, dataLen);
data_str[dataLen] = '\0';
dataIdx = rev_index%8; //2K数组中的位置0~7 (dataIdx=7)或(rev_index == rev_page-1)时执行写入Flash
if((rev_index < rev_page-1) && (dataLen == DATA_BUF_LEN*2)) //正常包
{
uint16_t i;
//转换到ota_wr_data数组
for(i=0;i<dataLen/2;i++)
{
//每2个字符转换成1个字节
sscanf(&data_str[i*2], "%2hhx", &ota_wr_data[i+dataIdx*256]); //8*256=2048
}
}
else if((rev_index == rev_page-1) && (dataLen > 0)) //最后一包
{
uint16_t i;
//清空ota_wr_data的该包对应位置及以后的位置
for(i=dataIdx;i<8;i++)
{
memset(&ota_wr_data[i*256], 0, DATA_BUF_LEN);
}
//将最后一包也转换到ota_wr_data数组
for(i=0;i<dataLen/2;i++)
{
//每2个字符转换成1个字节
sscanf(&data_str[i*2], "%2hhx", &ota_wr_data[i+dataIdx*256]); //8*256=2048
}
}
else if(dataLen > 0)
{
if(rev_index != 0) rev_index--; //该包接收错误,应回退等待下一次发当前包
ota_code = 2; //内容超出范围
return;
}
else
{
ota_code = 1; //内容有缺
}
//数据格式都正确,进行校验和写入
//CRC校验码
ota_data_crc = CRC16_FirmtoEE(&ota_wr_data[dataIdx*256], dataLen/2);
if(rev_crc == ota_data_crc)
{
if(rev_index == 0) //对第1包进行合法范围判断
{
if((ota_wr_data[6] > 0x01) || (ota_wr_data[7] != 0x08)) //Flash 128KB 0x08000000~0x0801FFFF
{
if(rev_index != 0) rev_index--; //该包接收错误,应回退等待下一次发当前包
ota_code = 5; //内容不是正规升级文件
return;
}
}
//执行写入Flash
else if((dataIdx == 7) || (rev_index == rev_page-1))
{
FLASH_WrData(rev_index/8 * DATA_LEN + USER_FW_MIDD, (uint16_t *)&ota_wr_data[0], DATA_LEN/2); //2048/2=1024
delay_ms(2);
}
}
else
{
if(rev_index != 0) rev_index--; //该包接收错误,应回退等待下一次发当前包
ota_code = 4; //CRC校验错误
return;
}
}
else
{
ota_code = 1; //内容有缺
}
}
//处理数据,接收报文识别后执行
void LTE_OTA_IT_Update(void)
{
if(LTE_status != 0) //收到后,执行回复,才判断OK,>,ERROR
{
/*收到OK或>或ERROR,认为回复完整,开始分析*/
if((LTE_Rx_BufIndex >= 2) && (strstr(LTE_Rx_Buf, "OK")))
{
//0xA7.检查订阅主题
if(LTE_status == ota_check_sub)
{
//1.检查订阅
if(strstr(LTE_Rx_Buf, "AT+CMQTTSUB?") && (LTE_step == ota_check_sub_step1))
{
if(strstr(LTE_Rx_Buf, "/ota/device/firmware/101") == 0) //缺少了OTA数据帧的主题
{
LTE_status = ota_check_sub;
LTE_step = ota_check_sub_step2; //无订阅,跳转:订阅OTA数据帧的主题
}
else
{
LTE_status = ota_info_pub;
LTE_step = ota_info_pub_step1; //有订阅,跳转:发送回复
}
}
//3.订阅OTA数据帧的主题
else if(LTE_step == ota_check_sub_step3)
{
otaSub_reply_count = 0;
LTE_status = ota_info_pub;
LTE_step = ota_info_pub_step1; //订阅成功,进行信息帧的回复
}
}
//0xA8.回复OTA升级信息帧
if(LTE_status == ota_info_pub)
{
//2.
if(LTE_step == ota_info_pub_step2)
{
LTE_status = ota_info_pub;
LTE_step = ota_info_pub_step3; //主题接收OK,准备下一步
}
//4.
else if(LTE_step == ota_info_pub_step4)
{
LTE_status = ota_info_pub;
LTE_step = ota_info_pub_step5; //内容接收OK,准备下一步
}
//5.
else if(strstr(LTE_Rx_Buf, "AT+CMQTTPUB") && (LTE_step == ota_info_pub_step5))
{
otaInfo_reply_count = 0;
if(ota_code == 0)
{
//等待数据内容,期间不主动发数据
LTE_status = 0;
LTE_step = 0;
return;
}
else
{
//退出升级流程,正常上报
LTE_OTA_Flag = 0;
LTE_status = ask_lbs;
LTE_step = ask_lbs_step1; //跳转:正常流程第一步
}
}
}
//0xA9.回复OTA升级数据帧
else if(LTE_status == ota_data_pub)
{
//2.
if(LTE_step == ota_data_pub_step2)
{
LTE_status = ota_data_pub;
LTE_step = ota_data_pub_step3; //主题接收OK,准备下一步
}
//4.
else if(LTE_step == ota_data_pub_step4)
{
LTE_status = ota_data_pub;
LTE_step = ota_data_pub_step5; //内容接收OK,准备下一步
}
//5.
else if(strstr(LTE_Rx_Buf, "AT+CMQTTPUB") && (LTE_step == ota_data_pub_step5))
{
otaData_reply_count = 0;
//未收到全部数据时
if(rev_index < rev_page-1)
{
//等待数据内容,期间不主动发数据
LTE_status = 0;
LTE_step = 0;
return;
}
else
{
//更新EE_OTA完成标志,先更新失败标志,若底层完成,会改为成功标志
LTE_OTA_fineFlag = 0xBB;
OTAfine_WrFlg = 0xBB;
}
}
}
}
else if((LTE_Rx_BufIndex >= 1) && (strstr(LTE_Rx_Buf, ">")))
{
//0xA7.检查订阅
if(LTE_status == ota_check_sub)
{
//1.订阅OTA数据帧的主题
if(strstr(LTE_Rx_Buf, "AT+CMQTTSUB=0,39,1") && (LTE_step == ota_check_sub_step2))
{
LTE_status = ota_check_sub;
LTE_step = ota_check_sub_step3; //准备下一步
}
}
//0xA8.回复OTA升级数据帧
else if(LTE_status == ota_info_pub)
{
//1.
if(strstr(LTE_Rx_Buf, "AT+CMQTTTOPIC") && (LTE_step == ota_info_pub_step1))
{
LTE_status = ota_info_pub;
LTE_step = ota_info_pub_step2; //准备下一步
}
//3.
else if(strstr(LTE_Rx_Buf, "AT+CMQTTPAYLOAD") && (LTE_step == ota_info_pub_step3))
{
LTE_status = ota_info_pub;
LTE_step = ota_info_pub_step4; //准备下一步
}
}
//0xA9.回复OTA升级信息帧
else if(LTE_status == ota_data_pub)
{
//1.
if(strstr(LTE_Rx_Buf, "AT+CMQTTTOPIC") && (LTE_step == ota_data_pub_step1))
{
LTE_status = ota_data_pub;
LTE_step = ota_data_pub_step2; //准备下一步
}
//3.
else if(strstr(LTE_Rx_Buf, "AT+CMQTTPAYLOAD") && (LTE_step == ota_data_pub_step3))
{
LTE_status = ota_data_pub;
LTE_step = ota_data_pub_step4; //准备下一步
}
}
}
else if((LTE_Rx_BufIndex >= 5) && (strstr(LTE_Rx_Buf, "ERROR")))
{
LTE_ResendDelay = ResendTime;
OTA_ErrCnt++;
if(OTA_ErrCnt > ERR_timeEnd2) //1min
{
OTA_ErrCnt = 0;
//退出升级流程,在正常流程中检查问题
LTE_OTA_Flag = 0;
CRESET_flag = 1; //重启
CRESET_step = 0;
}
}
}
}
//收到下发报文后,在主循环进行处理
void LTE_OTA_IQ_Update(void)
{
if((LTE_status == 0) && (LTE_step == 0)) //OTA升级,重点是接收下发报文
{
/*监控下发报文*/
if(strstr(LTE_Rx_Buf, "+CMQTTRXSTART") && strstr(LTE_Rx_Buf, "+CMQTTRXEND")) //有头有尾
{
//OTA信息帧
if(strstr(LTE_Rx_Buf, "/ota/device/upgrade/101"))
{
LTE_OTA_Info();
}
//OTA数据帧
else if(strstr(LTE_Rx_Buf, "/ota/device/firmware/101"))
{
LTE_OTA_Data();
if(ota_code != 0)
{
uint16_t i;
for(i=0;i<2048;i++)
{
ota_rx_Buf[i] = LTE_Rx_Buf[i];
}
}
}
}
}
//更新升级标志归0
if(OTAfine_WrFlg == 0xAA)
{
EEPROM_WrMulByte(EE_OTA_FINE,&LTE_OTA_fineFlag);
delay_ms(5);
OTAfine_WrFlg = 0;
}
//更新升级标志为0xBB,IAP标志为0xBB (不需要兼容旧IAP,不用考虑擦除跳转标志)
else if(OTAfine_WrFlg == 0xBB)
{
EEPROM_WrMulByte(EE_OTA_FINE,&LTE_OTA_fineFlag);
delay_ms(5);
OTAfine_WrFlg = 0;
IAP_Run = 0xBB; //表示存在下一版程序
EEPROM_WrMulByte(EE_IAP_NEW1,&IAP_Run);
delay_ms(10);
EEPROM_WrMulByte(EE_IAP_NEW2,&IAP_Run);
delay_ms(10);
//执行软件重启
NVIC_SystemReset();
}
}
//该函数用于发送报文
void LTE_OTA_IQ_Transmit(void)
{
if(LTE_status != 0)
{
if((LTE_Rx_BufIndex == 0) && (LTE_WaitRxFlg == 1)) //有发送指令却没有回复 //只执行1次
{
LTE_WaitRxFlg = 0;
LTE_WaitRxDelay = WaitRxTime;
return;
}
LTE_Rx_BufIndex = 0;
memset(LTE_Rx_Buf, 0, LTE_RX_BUF_LEN); //填入前先清空
memset(LTE_Tx_Buf, 0, LTE_TX_BUF_LEN);
}
//定期查询订阅并重新订阅主题
if(LTE_status == ota_check_sub)
{
otaSub_reply_count++;
//尝试1次重新回复
if(otaSub_reply_count == 10)
{
LTE_step = ota_check_sub_step1;
}
//仍然失败退出回复
else if(otaSub_reply_count >= 20)
{
LTE_OTA_Flag = 0;
LTE_status = ask_lbs;
LTE_step = ask_lbs_step1; //回复OTA升级信息一直失败,跳转:正常流程第一步
otaSub_reply_count = 0;
}
switch(LTE_step) //ota_info_pub_step1~ota_info_pub_step5
{
case ota_check_sub_step1:
LTE_Send("AT+CMQTTSUB?\r\n"); //查询订阅
break;
case ota_check_sub_step2:
LTE_Send("AT+CMQTTSUB=0,39,1\r\n"); //订阅主题长度 "/ota/device/firmware/101/030200001/post"=39Byte //订阅OTA升级数据
break;
case ota_check_sub_step3:
LTE_Send("/ota/device/firmware/101/%s/post", BMS_SN); //订阅的主题 (只有这个不用换新行)
break;
default:
break;
}
}
//0xA8.回复OTA升级信息帧
else if(LTE_status == ota_info_pub)
{
otaInfo_reply_count++;
//尝试1次重新回复
if(otaInfo_reply_count == 10)
{
LTE_step = ota_info_pub_step1;
}
//仍然失败退出回复
else if(otaInfo_reply_count >= 20)
{
LTE_OTA_Flag = 0;
LTE_status = ask_lbs;
LTE_step = ask_lbs_step1; //回复OTA升级信息一直失败,跳转:正常流程第一步
otaInfo_reply_count = 0;
}
switch(LTE_step) //ota_info_pub_step1~ota_info_pub_step5
{
case ota_info_pub_step1:
LTE_Send("AT+CMQTTTOPIC=0,39\r\n"); //上报主题长度 24+9+6=39Byte
break;
case ota_info_pub_step2:
LTE_Send("/ota/device/upgrade/101/%s/reply", BMS_SN); //上报的主题 (只有这个不用换新行)
break;
case ota_info_pub_step3:
LTE_Send("AT+CMQTTPAYLOAD=0,%hu\r\n", 11+uint_str_len(ota_code)); //上报内容长度 = 数据长度+固定字符长度+回车
break;
case ota_info_pub_step4:
LTE_Send("{\"code\":%hu}\r\n", ota_code);
break;
case ota_info_pub_step5:
LTE_Send("AT+CMQTTPUB=0,1,30\r\n"); //至少上报1次+30s内等待服务器回复
break;
default:
break;
}
}
//0xA9.回复OTA升级数据帧
else if(LTE_status == ota_data_pub)
{
otaData_reply_count++;
//尝试1次重新回复(数据帧比较特殊,如果后续序号不对就失败了,故增加次数)
if(otaData_reply_count == 20)
{
LTE_step = ota_data_pub_step1;
}
//仍然失败退出回复
else if(otaData_reply_count >= 30)
{
LTE_status = 0;
LTE_step = 0;
otaData_reply_count = 0;
}
switch(LTE_step) //ota_data_pub_step1~ota_data_pub_step5
{
case ota_data_pub_step1:
LTE_Send("AT+CMQTTTOPIC=0,40\r\n"); //上报主题长度 25+9+6=40Byte
break;
case ota_data_pub_step2:
LTE_Send("/ota/device/firmware/101/%s/reply", BMS_SN); //上报的主题 (只有这个不用换新行)
break;
case ota_data_pub_step3:
LTE_Send("AT+CMQTTPAYLOAD=0,%hu\r\n", 11+uint_str_len(ota_code)); //上报内容长度 = 数据长度+固定字符长度+回车
break;
case ota_data_pub_step4:
LTE_Send("{\"code\":%hu}\r\n", ota_code);
break;
case ota_data_pub_step5:
LTE_Send("AT+CMQTTPUB=0,1,30\r\n"); //至少上报1次+30s内等待服务器回复
break;
default:
break;
}
}
}
#endif
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+4109
View File
File diff suppressed because it is too large Load Diff
+253
View File
@@ -0,0 +1,253 @@
/**
******************************************************************************
* @file tim.c
* @author Jerry
* @version V2.1
* @date 19-April-2022
* @brief tim program body.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
#include "string.h"
#include "rtc.h"
#include "soe.h"
_soe_obj soe;
uint8_t rdd[64];
/*******************************************************************************
Function:
Description: 发生SOE事件时,将事件写入EEPROM
Input:
Output:
Others:
*******************************************************************************/
void SOE_BkData(uint8_t type)
{
uint8_t wrBuf[64];
uint8_t extBuf[6];
uint8_t adrh,adrl;
uint16_t ee_vol,ee_fcc,ee_rcc;
int16_t ee_cur;
uint8_t afe_mode;
uint16_t ext_addr;
uint8_t i;
uint16_t ee_cellVol[20]; //用于转换存储单芯电压
ee_vol = (uint16_t)(bmsMem.packVoltage/10); //电压保存 单位0.01V
ee_cur = (int16_t) (bmsMem.packCurrent/100); //电流保存 单位0.1A
ee_fcc = (uint16_t)(fcc/3600/100); //满充容量 单位0.1Ah //5.16增加满充容量自适应逻辑后修改
ee_rcc = (uint16_t)(bmsMem.rcc/3600/100); //剩余容量 单位0.1Ah
/*记录序号,便于上位机排序和查看*/
wrBuf[0] = (soe.index >> 24) & 0xff ;
wrBuf[1] = (soe.index >> 16) & 0xff ;
wrBuf[2] = (soe.index >> 8) & 0xff ;
wrBuf[3] = (soe.index >> 0) & 0xff ;
/*记录时间*/
wrBuf[4] = calendar.w_year ;
wrBuf[5] = calendar.w_month ;
wrBuf[6] = calendar.w_date ;
wrBuf[7] = calendar.hour ;
wrBuf[8] = calendar.min ;
wrBuf[9] = calendar.sec ;
/*记录BMS参数*/
wrBuf[10] = bmsMem.bStatus1 & 0xff;
wrBuf[11] = bmsMem.bStatus2 & 0xff;
wrBuf[12] = bmsMem.bStatus3 & 0xff;
wrBuf[13] = bmsMem.temperaStatus & 0xff;
wrBuf[14] = bmsMem.balanceStatus & 0xff;
//wrBuf[15] = bmsMem.packStatus & 0xff;
wrBuf[15] = ((bmsMem.bStatus1>>4) & 0xf0) | ((bmsMem.temperaStatus>>8) & 0x0f); //占用原packStatus位置,保存新增保护
wrBuf[16] = (ee_vol >> 8) & 0xff;
wrBuf[17] = (ee_vol >> 0) & 0xff;
wrBuf[18] = (ee_cur >> 8) & 0xff;
wrBuf[19] = (ee_cur >> 0) & 0xff;
wrBuf[20] = (ee_fcc >> 8) & 0xff;
wrBuf[21] = (ee_fcc >> 0) & 0xff;
wrBuf[22] = (ee_rcc >> 8) & 0xff;
wrBuf[23] = (ee_rcc >> 0) & 0xff;
wrBuf[24] = (bmsMem.cycleCount >> 8) & 0xff;
wrBuf[25] = (bmsMem.cycleCount >> 0) & 0xff;
wrBuf[26] = bmsMem.soh & 0xff;
//afe_T1~T3
wrBuf[27] = (bmsMem.afe_T1>>8) & 0x0f;
wrBuf[28] = (bmsMem.afe_T1>>0) & 0xff;
wrBuf[29] = (bmsMem.afe_T2>>4) & 0xff;
wrBuf[30] = ((bmsMem.afe_T2<<4) & 0xf0) | ((bmsMem.afe_T3>>8) & 0x0f);
wrBuf[31] = (bmsMem.afe_T3>>0) & 0xff;
//mcu_T1~T4
wrBuf[32] = (bmsMem.mcu_T1>>4) & 0xff;
wrBuf[33] = ((bmsMem.mcu_T1<<4) & 0xf0) | ((bmsMem.mcu_T2>>8) & 0x0f);
wrBuf[34] = (bmsMem.mcu_T2>>0) & 0xff;
wrBuf[35] = (bmsMem.mcu_T3>>4) & 0xff;
wrBuf[36] = ((bmsMem.mcu_T3<<4) & 0xf0) | ((bmsMem.mcu_T4>>8) & 0x0f);
wrBuf[37] = (bmsMem.mcu_T4>>0) & 0xff;
afe_mode = (paraMem.sc_mode >> 8) & 0xFF;
for(i=0;i<20;i++)
{
if(i < 16)
{
if(bmsMem.vCell[i] > 5119)
{
ee_cellVol[i] = 0;
}
else if(bmsMem.vCell[i] > 4095)
{
ee_cellVol[i] = 4095;
}
else
{
ee_cellVol[i] = bmsMem.vCell[i];
}
}
else
{
if(afe_mode == 1)
{
if(bmsMem.vCell2[i-16] > 5119)
{
ee_cellVol[i] = 0;
}
else if(bmsMem.vCell2[i-16] > 4095)
{
ee_cellVol[i] = 4095;
}
else
{
ee_cellVol[i] = bmsMem.vCell2[i-16];
}
}
else
{
ee_cellVol[i] = 0;
}
}
}
wrBuf[38] = (ee_cellVol[0]>>4) & 0xff;
wrBuf[39] = ((ee_cellVol[0]<<4) & 0xf0) | ((ee_cellVol[1]>>8) & 0x0f);
wrBuf[40] = (ee_cellVol[1]>>0) & 0xff;
wrBuf[41] = (ee_cellVol[2]>>4) & 0xff;
wrBuf[42] = ((ee_cellVol[2]<<4) & 0xf0) | ((ee_cellVol[3]>>8) & 0x0f);
wrBuf[43] = (ee_cellVol[3]>>0) & 0xff;
wrBuf[44] = (ee_cellVol[4]>>4) & 0xff;
wrBuf[45] = ((ee_cellVol[4]<<4) & 0xf0) | ((ee_cellVol[5]>>8) & 0x0f);
wrBuf[46] = (ee_cellVol[5]>>0) & 0xff;
wrBuf[47] = (ee_cellVol[6]>>4) & 0xff;
wrBuf[48] = ((ee_cellVol[6]<<4) & 0xf0) | ((ee_cellVol[7]>>8) & 0x0f);
wrBuf[49] = (ee_cellVol[7]>>0) & 0xff;
wrBuf[50] = (ee_cellVol[8]>>4) & 0xff;
wrBuf[51] = ((ee_cellVol[8]<<4) & 0xf0) | ((ee_cellVol[9]>>8) & 0x0f);
wrBuf[52] = (ee_cellVol[9]>>0) & 0xff;
wrBuf[53] = (ee_cellVol[10]>>4) & 0xff;
wrBuf[54] = ((ee_cellVol[10]<<4) & 0xf0) | ((ee_cellVol[11]>>8) & 0x0f);
wrBuf[55] = (ee_cellVol[11]>>0) & 0xff;
wrBuf[56] = (ee_cellVol[12]>>4) & 0xff;
wrBuf[57] = ((ee_cellVol[12]<<4) & 0xf0) | ((ee_cellVol[13]>>8) & 0x0f);
wrBuf[58] = (ee_cellVol[13]>>0) & 0xff;
wrBuf[59] = (ee_cellVol[14]>>4) & 0xff;
wrBuf[60] = ((ee_cellVol[14]<<4) & 0xf0) | ((ee_cellVol[15]>>8) & 0x0f);
wrBuf[61] = (ee_cellVol[15]>>0) & 0xff;
wrBuf[62] = type;
if(afe_mode == 1) //SH36735XX, 20 cells
{
wrBuf[63] = 0xA6; //new format flag
//pack cell17~20 into extBuf[0~5]
extBuf[0] = (ee_cellVol[16]>>4) & 0xff;
extBuf[1] = ((ee_cellVol[16]<<4) & 0xf0) | ((ee_cellVol[17]>>8) & 0x0f);
extBuf[2] = (ee_cellVol[17]>>0) & 0xff;
extBuf[3] = (ee_cellVol[18]>>4) & 0xff;
extBuf[4] = ((ee_cellVol[18]<<4) & 0xf0) | ((ee_cellVol[19]>>8) & 0x0f);
extBuf[5] = (ee_cellVol[19]>>0) & 0xff;
}
else
{
wrBuf[63] = 0xA5; //old format flag
}
/*写入前检查是否合法*/
//当前地址=0或0XFFFF或不为64倍数,初始化地址和记录序号
if((soe.pc < 0x1000) || (soe.pc > 0x2940) || (soe.pc == 0xffff) || (soe.pc%64 !=0))
{
soe.pc = RECORD_START_ADDR;
soe.index = 0;
soe.num = 0;
}
/*记录写入EEPROM*/
adrh = (soe.pc>>8) & 0xff;
adrl = soe.pc & 0xff;
EEPROM_WrMulByte(EE_SOE,wrBuf);
delay_ms(10);
EEPROM_RdMulByte(EE_SOE,rdd);
//write extend cell17~20 for SH36735XX
if(afe_mode == 1)
{
ext_addr = 0x2900 + (soe.pc - 0x1000) * 6 / 64;
adrh = (ext_addr>>8) & 0xff;
adrl = ext_addr & 0xff;
EEPROM_WrMulByte(EE_SOE_EXT,extBuf);
delay_ms(10);
EEPROM_RdMulByte(EE_SOE_EXT,rdd);
}
/*清除记录写入标记*/
soe.bkType = 0;
/*暂定400条记录*/
soe.index+=1;
soe.pc +=0x40;
soe.num +=1;
// if(soe.pc == 0x7400) //0x1000-0x7400共400条
// if(soe.pc == 0x1C80) //0x1000-0x1C80共50条
if(soe.pc == 0x2900) //0x1000-0x2900共100条
{
soe.pc = RECORD_START_ADDR;
}
if(soe.num >= 100)
{
soe.num = 100;
}
wrBuf[0] = (soe.index >> 24) & 0xff ;
wrBuf[1] = (soe.index >> 16) & 0xff ;
wrBuf[2] = (soe.index >> 8) & 0xff ;
wrBuf[3] = (soe.index >> 0) & 0xff ;
wrBuf[4] = (soe.pc >>8)&0XFF ;
wrBuf[5] = soe.pc & 0xff ;
wrBuf[6] = (soe.num >>8)&0XFF ;
wrBuf[7] = soe.num & 0xff ;
EEPROM_WrMulByte(EE_SOE_INF,wrBuf);
delay_ms(10);
EEPROM_RdMulByte(EE_SOE_INF,rdd);
scr_RdRecord_Flg = 1;
//SCR_DispProcotol();
}
+3129
View File
File diff suppressed because it is too large Load Diff
+2647
View File
File diff suppressed because it is too large Load Diff
+1004
View File
File diff suppressed because it is too large Load Diff
+32
View File
@@ -0,0 +1,32 @@
#ifndef __SOE_H
#define __SOE_H
#include "stm32f10x.h"
#define BKTYPE_STARTUP 0X01 //开机
#define BKTYPE_TIME 0X02 //定时
#define BKTYPE_CHARGING 0X03 //充电
#define BKTYPE_DISCHARGING 0X04 //放电
#define BKTYPE_ALARM 0X05 //报警、急停
#define RECORD_START_ADDR 0X1000
//记录结构体
typedef struct
{
uint32_t index; //当前记录序号
uint16_t pc; //待写入地址
uint16_t num; //记录总数
// uint16_t timEn;
// uint16_t tim;
uint8_t bkType; //记录类型,目前只用于报警
uint8_t rsvd[3];
uint8_t bsNew[6]; //对应状态
uint8_t bsOld[6];
uint8_t bk[12];
}_soe_obj;
extern _soe_obj soe;
extern void SOE_BkData(uint8_t type);
#endif
BIN
View File
Binary file not shown.
File diff suppressed because it is too large Load Diff
+50
View File
@@ -0,0 +1,50 @@
<html>
<body>
<pre>
<h1>礦ision Build Log</h1>
<h2>Tool Versions:</h2>
IDE-Version: μVision V5.25.0.0
Copyright (C) 2017 ARM Ltd and ARM Germany GmbH. All rights reserved.
License Information: 4 3, 2, LIC=ZB4EI-T663M-30XNC-7JX79-N00Q7-1ZNRI
Tool Versions:
Toolchain: MDK-ARM Plus Version: 5.25.0.0
Toolchain Path: E:\keil_v5_old\ARM\ARMCC\Bin
C Compiler: Armcc.exe V5.06 update 6 (build 750)
Assembler: Armasm.exe V5.06 update 6 (build 750)
Linker/Locator: ArmLink.exe V5.06 update 6 (build 750)
Library Manager: ArmAr.exe V5.06 update 6 (build 750)
Hex Converter: FromElf.exe V5.06 update 6 (build 750)
CPU DLL: SARMCM3.DLL V5.25.0.0
Dialog DLL: DCM.DLL V1.17.0.0
Target DLL: Segger\JL2CM3.dll V2.99.28.0
Dialog DLL: TCM.DLL V1.34.0.0
<h2>Project:</h2>
C:\Users\yue\Desktop\20串200A项目\3、测试代码\BMS_STM32_[V4.0.0.0](串数写入优化)(充放电高温看状态)(屏幕遮挡历史优化)(屏幕剩余时间优化)(200A参数)+[20020SF]+[V1.0.0]\USER\BT_BMS_V3.0.uvprojx
Project File Date: 08/25/2026
<h2>Output:</h2>
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'E:\keil_v5_old\ARM\ARMCC\Bin'
Build target 'Target 1'
compiling flash.c...
linking...
Program Size: Code=89934 RO-data=6498 RW-data=1596 ZI-data=7548
"..\OBJ\BT_BMS_V3.0" - 0 Error(s), 0 Warning(s).
<h2>Software Packages used:</h2>
Package Vendor: Keil
http://www.keil.com/pack/Keil.STM32F1xx_DFP.2.3.0.pack
Keil.STM32F1xx_DFP.2.3.0
STMicroelectronics STM32F1 Series Device Support, Drivers and Examples
<h2>Collection of Component include folders:</h2>
.\RTE\_Target_1
E:\keil_v5_old\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\Include
<h2>Collection of Component Files used:</h2>
Build Time Elapsed: 00:00:06
</pre>
</body>
</html>
+4883
View File
File diff suppressed because it is too large Load Diff
+62
View File
@@ -0,0 +1,62 @@
--cpu Cortex-M3
"..\obj\core_cm3.o"
"..\obj\startup_stm32f10x_hd.o"
"..\obj\main.o"
"..\obj\global.o"
"..\obj\stm32f10x_it.o"
"..\obj\system_stm32f10x.o"
"..\obj\gpio.o"
"..\obj\tim.o"
"..\obj\uart.o"
"..\obj\i2c.o"
"..\obj\spi.o"
"..\obj\flash.o"
"..\obj\rtc.o"
"..\obj\systick.o"
"..\obj\can.o"
"..\obj\adc.o"
"..\obj\pwm.o"
"..\obj\wdg.o"
"..\obj\afe_sh3673520.o"
"..\obj\rs485_modbus.o"
"..\obj\rs485_modbus_inverter.o"
"..\obj\ntc.o"
"..\obj\screen.o"
"..\obj\gasgauge.o"
"..\obj\soe.o"
"..\obj\ocv.o"
"..\obj\status.o"
"..\obj\mbo26a.o"
"..\obj\yibang.o"
"..\obj\h7690c.o"
"..\obj\lbs_transmit.o"
"..\obj\ota.o"
"..\obj\misc.o"
"..\obj\stm32f10x_adc.o"
"..\obj\stm32f10x_bkp.o"
"..\obj\stm32f10x_can.o"
"..\obj\stm32f10x_cec.o"
"..\obj\stm32f10x_crc.o"
"..\obj\stm32f10x_dac.o"
"..\obj\stm32f10x_dbgmcu.o"
"..\obj\stm32f10x_dma.o"
"..\obj\stm32f10x_exti.o"
"..\obj\stm32f10x_flash.o"
"..\obj\stm32f10x_fsmc.o"
"..\obj\stm32f10x_gpio.o"
"..\obj\stm32f10x_i2c.o"
"..\obj\stm32f10x_iwdg.o"
"..\obj\stm32f10x_pwr.o"
"..\obj\stm32f10x_rcc.o"
"..\obj\stm32f10x_rtc.o"
"..\obj\stm32f10x_sdio.o"
"..\obj\stm32f10x_spi.o"
"..\obj\stm32f10x_tim.o"
"..\obj\stm32f10x_usart.o"
"..\obj\stm32f10x_wwdg.o"
"..\obj\protocolswitch_p1.o"
"..\obj\protocolswitch_p2.o"
--strict --scatter "..\OBJ\BT_BMS_V3.sct"
--summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols
--info sizes --info totals --info unused --info veneers
--list ".\Listings\BT_BMS_V3.map" -o ..\OBJ\BT_BMS_V3.0
+15
View File
@@ -0,0 +1,15 @@
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00040000 { ; load region size_region
ER_IROM1 0x08000000 0x00040000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x0000C000 { ; RW data
.ANY (+RW +ZI)
}
}
+15
View File
@@ -0,0 +1,15 @@
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08001800 0x00040000 { ; load region size_region
ER_IROM1 0x08001800 0x00040000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x0000C000 { ; RW data
.ANY (+RW +ZI)
}
}
+2
View File
@@ -0,0 +1,2 @@
[EXTDLL]
Count=0
BIN
View File
Binary file not shown.
+32
View File
@@ -0,0 +1,32 @@
..\obj\adc.o: ..\BSP\adc.c
..\obj\adc.o: ..\USER\stm32f10x.h
..\obj\adc.o: ..\CORE\core_cm3.h
..\obj\adc.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\adc.o: ..\USER\system_stm32f10x.h
..\obj\adc.o: ..\USER\stm32f10x_conf.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\adc.o: ..\USER\stm32f10x.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\adc.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\adc.o: ..\USER\global.h
..\obj\adc.o: ..\MOUDLE\AFE_SH3673520.h
BIN
View File
Binary file not shown.
Binary file not shown.
+34
View File
@@ -0,0 +1,34 @@
..\obj\afe_sh367309.o: ..\MOUDLE\AFE_SH367309.c
..\obj\afe_sh367309.o: ..\USER\stm32f10x.h
..\obj\afe_sh367309.o: ..\CORE\core_cm3.h
..\obj\afe_sh367309.o: C:\Users\Public\keil_C51\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\afe_sh367309.o: ..\USER\system_stm32f10x.h
..\obj\afe_sh367309.o: ..\USER\stm32f10x_conf.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\afe_sh367309.o: ..\USER\stm32f10x.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\afe_sh367309.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\afe_sh367309.o: ..\USER\global.h
..\obj\afe_sh367309.o: C:\Users\Public\keil_C51\ARM\ARMCC\Bin\..\include\string.h
..\obj\afe_sh367309.o: ..\MOUDLE\AFE_SH367309.h
..\obj\afe_sh367309.o: ..\MOUDLE\soe.h
Binary file not shown.
+34
View File
@@ -0,0 +1,34 @@
..\obj\afe_sh3673510.o: ..\MOUDLE\AFE_SH3673510.c
..\obj\afe_sh3673510.o: ..\USER\stm32f10x.h
..\obj\afe_sh3673510.o: ..\CORE\core_cm3.h
..\obj\afe_sh3673510.o: C:\Users\Public\keil_C51\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\afe_sh3673510.o: ..\USER\system_stm32f10x.h
..\obj\afe_sh3673510.o: ..\USER\stm32f10x_conf.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\afe_sh3673510.o: ..\USER\stm32f10x.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\afe_sh3673510.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\afe_sh3673510.o: ..\USER\global.h
..\obj\afe_sh3673510.o: C:\Users\Public\keil_C51\ARM\ARMCC\Bin\..\include\string.h
..\obj\afe_sh3673510.o: ..\MOUDLE\AFE_SH3673510.h
..\obj\afe_sh3673510.o: ..\MOUDLE\soe.h
Binary file not shown.
+34
View File
@@ -0,0 +1,34 @@
..\obj\afe_sh3673520.o: ..\MOUDLE\AFE_SH3673520.c
..\obj\afe_sh3673520.o: ..\USER\stm32f10x.h
..\obj\afe_sh3673520.o: ..\CORE\core_cm3.h
..\obj\afe_sh3673520.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\afe_sh3673520.o: ..\USER\system_stm32f10x.h
..\obj\afe_sh3673520.o: ..\USER\stm32f10x_conf.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\afe_sh3673520.o: ..\USER\stm32f10x.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\afe_sh3673520.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\afe_sh3673520.o: ..\USER\global.h
..\obj\afe_sh3673520.o: ..\MOUDLE\AFE_SH3673520.h
..\obj\afe_sh3673520.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\string.h
..\obj\afe_sh3673520.o: ..\MOUDLE\soe.h
Binary file not shown.
BIN
View File
Binary file not shown.
+32
View File
@@ -0,0 +1,32 @@
..\obj\can.o: ..\BSP\can.c
..\obj\can.o: ..\USER\stm32f10x.h
..\obj\can.o: ..\CORE\core_cm3.h
..\obj\can.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\can.o: ..\USER\system_stm32f10x.h
..\obj\can.o: ..\USER\stm32f10x_conf.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\can.o: ..\USER\stm32f10x.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\can.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\can.o: ..\USER\global.h
..\obj\can.o: ..\MOUDLE\AFE_SH3673520.h
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+2
View File
@@ -0,0 +1,2 @@
..\obj\core_cm3.o: ..\CORE\core_cm3.c
..\obj\core_cm3.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+33
View File
@@ -0,0 +1,33 @@
..\obj\flash.o: ..\BSP\flash.c
..\obj\flash.o: ..\USER\stm32f10x.h
..\obj\flash.o: ..\CORE\core_cm3.h
..\obj\flash.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\flash.o: ..\USER\system_stm32f10x.h
..\obj\flash.o: ..\USER\stm32f10x_conf.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\flash.o: ..\USER\stm32f10x.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\flash.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\flash.o: ..\USER\global.h
..\obj\flash.o: ..\MOUDLE\AFE_SH3673520.h
..\obj\flash.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\string.h
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+34
View File
@@ -0,0 +1,34 @@
..\obj\gasgauge.o: ..\MOUDLE\GasGauge.c
..\obj\gasgauge.o: ..\USER\stm32f10x.h
..\obj\gasgauge.o: ..\CORE\core_cm3.h
..\obj\gasgauge.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\gasgauge.o: ..\USER\system_stm32f10x.h
..\obj\gasgauge.o: ..\USER\stm32f10x_conf.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\gasgauge.o: ..\USER\stm32f10x.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\gasgauge.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\gasgauge.o: ..\USER\global.h
..\obj\gasgauge.o: ..\MOUDLE\AFE_SH3673520.h
..\obj\gasgauge.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\string.h
..\obj\gasgauge.o: ..\BSP\rtc.h
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+34
View File
@@ -0,0 +1,34 @@
..\obj\global.o: global.c
..\obj\global.o: stm32f10x.h
..\obj\global.o: ..\CORE\core_cm3.h
..\obj\global.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\global.o: system_stm32f10x.h
..\obj\global.o: stm32f10x_conf.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\global.o: ..\USER\stm32f10x.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\global.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\global.o: global.h
..\obj\global.o: ..\MOUDLE\AFE_SH3673520.h
..\obj\global.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\string.h
..\obj\global.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdio.h
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+32
View File
@@ -0,0 +1,32 @@
..\obj\gpio.o: ..\BSP\gpio.c
..\obj\gpio.o: ..\USER\stm32f10x.h
..\obj\gpio.o: ..\CORE\core_cm3.h
..\obj\gpio.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\gpio.o: ..\USER\system_stm32f10x.h
..\obj\gpio.o: ..\USER\stm32f10x_conf.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\gpio.o: ..\USER\stm32f10x.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\gpio.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\gpio.o: ..\USER\global.h
..\obj\gpio.o: ..\MOUDLE\AFE_SH3673520.h
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+37
View File
@@ -0,0 +1,37 @@
..\obj\h7690c.o: ..\MOUDLE\H7690C.c
..\obj\h7690c.o: ..\USER\stm32f10x.h
..\obj\h7690c.o: ..\CORE\core_cm3.h
..\obj\h7690c.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\h7690c.o: ..\USER\system_stm32f10x.h
..\obj\h7690c.o: ..\USER\stm32f10x_conf.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\h7690c.o: ..\USER\stm32f10x.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\h7690c.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\h7690c.o: ..\USER\global.h
..\obj\h7690c.o: ..\MOUDLE\AFE_SH3673520.h
..\obj\h7690c.o: ..\BSP\rtc.h
..\obj\h7690c.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\string.h
..\obj\h7690c.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdarg.h
..\obj\h7690c.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdio.h
..\obj\h7690c.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdlib.h
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+35
View File
@@ -0,0 +1,35 @@
..\obj\i2c.o: ..\BSP\i2c.c
..\obj\i2c.o: ..\USER\stm32f10x.h
..\obj\i2c.o: ..\CORE\core_cm3.h
..\obj\i2c.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\i2c.o: ..\USER\system_stm32f10x.h
..\obj\i2c.o: ..\USER\stm32f10x_conf.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\i2c.o: ..\USER\stm32f10x.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\i2c.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\i2c.o: ..\USER\global.h
..\obj\i2c.o: ..\MOUDLE\AFE_SH3673520.h
..\obj\i2c.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\string.h
..\obj\i2c.o: ..\BSP\sys.h
..\obj\i2c.o: ..\MOUDLE\soe.h
BIN
View File
Binary file not shown.
Binary file not shown.
+33
View File
@@ -0,0 +1,33 @@
..\obj\lbs_transmit.o: ..\MOUDLE\LBS_Transmit.c
..\obj\lbs_transmit.o: ..\USER\stm32f10x.h
..\obj\lbs_transmit.o: ..\CORE\core_cm3.h
..\obj\lbs_transmit.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\lbs_transmit.o: ..\USER\system_stm32f10x.h
..\obj\lbs_transmit.o: ..\USER\stm32f10x_conf.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\lbs_transmit.o: ..\USER\stm32f10x.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\lbs_transmit.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\lbs_transmit.o: ..\USER\global.h
..\obj\lbs_transmit.o: ..\MOUDLE\AFE_SH3673520.h
..\obj\lbs_transmit.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\math.h
Binary file not shown.
BIN
View File
Binary file not shown.
+34
View File
@@ -0,0 +1,34 @@
..\obj\main.o: main.c
..\obj\main.o: stm32f10x.h
..\obj\main.o: ..\CORE\core_cm3.h
..\obj\main.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\main.o: system_stm32f10x.h
..\obj\main.o: stm32f10x_conf.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\main.o: ..\USER\stm32f10x.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\main.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\main.o: global.h
..\obj\main.o: ..\MOUDLE\AFE_SH3673520.h
..\obj\main.o: ..\BSP\rtc.h
..\obj\main.o: ..\MOUDLE\soe.h
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+35
View File
@@ -0,0 +1,35 @@
..\obj\mbo26a.o: ..\MOUDLE\MBO26A.c
..\obj\mbo26a.o: ..\USER\stm32f10x.h
..\obj\mbo26a.o: ..\CORE\core_cm3.h
..\obj\mbo26a.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\mbo26a.o: ..\USER\system_stm32f10x.h
..\obj\mbo26a.o: ..\USER\stm32f10x_conf.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\mbo26a.o: ..\USER\stm32f10x.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\mbo26a.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\mbo26a.o: ..\USER\global.h
..\obj\mbo26a.o: ..\MOUDLE\AFE_SH3673520.h
..\obj\mbo26a.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\string.h
..\obj\mbo26a.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdarg.h
..\obj\mbo26a.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdio.h
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+31
View File
@@ -0,0 +1,31 @@
..\obj\misc.o: ..\STM32F10x_FWLIB\src\misc.c
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\misc.o: ..\USER\stm32f10x.h
..\obj\misc.o: ..\CORE\core_cm3.h
..\obj\misc.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\misc.o: ..\USER\system_stm32f10x.h
..\obj\misc.o: ..\USER\stm32f10x_conf.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\misc.o: ..\USER\stm32f10x.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\misc.o: ..\STM32F10x_FWLIB\inc\misc.h
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+32
View File
@@ -0,0 +1,32 @@
..\obj\ntc.o: ..\MOUDLE\NTC.c
..\obj\ntc.o: ..\USER\stm32f10x.h
..\obj\ntc.o: ..\CORE\core_cm3.h
..\obj\ntc.o: E:\keil_v5_old\ARM\ARMCC\Bin\..\include\stdint.h
..\obj\ntc.o: ..\USER\system_stm32f10x.h
..\obj\ntc.o: ..\USER\stm32f10x_conf.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_adc.h
..\obj\ntc.o: ..\USER\stm32f10x.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_bkp.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_can.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_cec.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_crc.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dac.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dbgmcu.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_dma.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_exti.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_flash.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_fsmc.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_gpio.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_i2c.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_iwdg.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_pwr.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rcc.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_rtc.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_sdio.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_spi.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_tim.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_usart.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\stm32f10x_wwdg.h
..\obj\ntc.o: ..\STM32F10x_FWLIB\inc\misc.h
..\obj\ntc.o: ..\USER\global.h
..\obj\ntc.o: ..\MOUDLE\AFE_SH3673520.h
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More