BMS STM32 V4.0.0.0
This commit is contained in:
Vendored
+5
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"cl.keil-assistant"
|
||||
]
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
+1053
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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_CH1(PA8)的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模式1:CNT<CCR时输出高电平
|
||||
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能通道输出
|
||||
TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比0(CCR值)
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
File diff suppressed because it is too large
Load Diff
+172
@@ -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
@@ -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
@@ -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,<E_OTA_fineFlag);
|
||||
delay_ms(5);
|
||||
|
||||
OTAfine_WrFlg = 0;
|
||||
}
|
||||
//更新升级标志为0xBB,IAP标志为0xBB (不需要兼容旧IAP,不用考虑擦除跳转标志)
|
||||
else if(OTAfine_WrFlg == 0xBB)
|
||||
{
|
||||
EEPROM_WrMulByte(EE_OTA_FINE,<E_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
File diff suppressed because it is too large
Load Diff
+253
@@ -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
File diff suppressed because it is too large
Load Diff
+2647
File diff suppressed because it is too large
Load Diff
+1004
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
[EXTDLL]
|
||||
Count=0
|
||||
BIN
Binary file not shown.
@@ -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
|
||||
Binary file not shown.
@@ -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.
@@ -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.
@@ -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
Binary file not shown.
@@ -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
|
||||
Binary file not shown.
@@ -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
|
||||
Binary file not shown.
Binary file not shown.
+33
@@ -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
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
Binary file not shown.
Binary file not shown.
+32
@@ -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
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
Binary file not shown.
BIN
Binary file not shown.
@@ -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
|
||||
Binary file not shown.
@@ -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.
Binary file not shown.
+34
@@ -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
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
Binary file not shown.
Binary file not shown.
+31
@@ -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
Binary file not shown.
BIN
Binary file not shown.
@@ -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
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user