初始版本
This commit is contained in:
@@ -0,0 +1,315 @@
|
||||
#include "sysctrl.h"
|
||||
#include "gpio.h"
|
||||
#include "flash.h"
|
||||
#include "bsp.h"
|
||||
#include "lpuart.h"
|
||||
#include "bt.h"
|
||||
#include "wdt.h"
|
||||
|
||||
extern void DebugUartIRQ(uint8_t Data);
|
||||
extern void BleIRQHandler(uint8_t rData);
|
||||
extern void SysTick_CallBack(void);
|
||||
extern void KeyIRQHandler(void);
|
||||
|
||||
static __IO uint32_t SysTickCnt = 0;
|
||||
static __IO bool LpUart0_Tx_Flag;
|
||||
|
||||
#define WAKEUP_TIME_ARR 1000
|
||||
#define USE_RCL_TRIM 0
|
||||
#define DBG_LOG(...)
|
||||
|
||||
#if (SYSCLK == SYSCLK_RCH)
|
||||
|
||||
static void SystemClkInit(en_sysctrl_rch_freq_t enRchFreq)
|
||||
{
|
||||
///< RCH时钟不同频率的切换,需要先将时钟切换到RCL
|
||||
Sysctrl_SetRCLTrim(SysctrlRclFreq32768);
|
||||
Sysctrl_SetRCLStableTime(SysctrlRclStableCycle64);
|
||||
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
|
||||
Sysctrl_SysClkSwitch(SysctrlClkRCL);
|
||||
|
||||
///< 加载目标频率的RCH的TRIM值
|
||||
Sysctrl_SetRCHTrim(enRchFreq);
|
||||
///< 使能RCH
|
||||
Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
|
||||
///< 时钟切换到RCH
|
||||
Sysctrl_SysClkSwitch(SysctrlClkRCH);
|
||||
|
||||
///< HCLK不超过24M:此处设置FLASH读等待周期为0 cycle
|
||||
Flash_WaitCycle(FlashWaitCycle0);
|
||||
}
|
||||
|
||||
#elif (SYSCLK == SYSCLK_XTH)
|
||||
|
||||
static void SystemClkInit(en_sysctrl_xth_freq_t enXthFreq)
|
||||
{
|
||||
///<======================== 切换至XTH32MHz ==============================
|
||||
///< 当使用的时钟源HCLK大于24M:设置FLASH 读等待周期为1 cycle(默认值也为1 cycle)
|
||||
if(SysctrlXthFreq24_32MHz == enXthFreq)
|
||||
{
|
||||
Flash_WaitCycle(FlashWaitCycle1);
|
||||
}
|
||||
|
||||
///< 切换时钟前(根据外部高速晶振)设置XTH频率范围,配置晶振参数,使能目标时钟,此处为SYSTEM_XTH = 32MHz
|
||||
Sysctrl_SetXTHFreq(enXthFreq);
|
||||
Sysctrl_XTHDriverCfg(SysctrlXtalDriver3);
|
||||
Sysctrl_SetXTHStableTime(SysctrlXthStableCycle16384);
|
||||
Sysctrl_ClkSourceEnable(SysctrlClkXTH, TRUE);
|
||||
delay1ms(10);
|
||||
Sysctrl_SysClkSwitch(SysctrlClkXTH);
|
||||
|
||||
if(SysctrlXthFreq24_32MHz != enXthFreq)
|
||||
{
|
||||
Flash_WaitCycle(FlashWaitCycle0);
|
||||
}
|
||||
//M0P_SYSCTRL->SYSCTRL0_f.WAKEUP_BYRCH = 0; //唤醒保持原时钟
|
||||
}
|
||||
|
||||
#elif (SYSCLK == SYSCLK_PLL)
|
||||
///<请注意根据外部晶振配置宏——[SYSTEM_XTH],如果使用PLL,XTH必须小于24MHz
|
||||
static void SystemClkInit(void)
|
||||
{
|
||||
stc_sysctrl_pll_cfg_t stcPLLCfg;
|
||||
|
||||
///< 切换时钟前(根据外部高速晶振)设置XTH频率范围,配置晶振参数,使能目标时钟,此处为SYSTEM_XTH = 32MHz
|
||||
// Sysctrl_SetXTHFreq(SysctrlXthFreq4_8MHz);
|
||||
// Sysctrl_XTHDriverCfg(SysctrlXtalDriver3);
|
||||
// Sysctrl_SetXTHStableTime(SysctrlXthStableCycle16384);
|
||||
// Sysctrl_ClkSourceEnable(SysctrlClkXTH, TRUE);
|
||||
Sysctrl_SetRCHTrim(SysctrlRchFreq8MHz);
|
||||
Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
|
||||
|
||||
delay1ms(10);
|
||||
|
||||
stcPLLCfg.enInFreq = SysctrlPllInFreq6_12MHz; //XTH 8MHz
|
||||
stcPLLCfg.enOutFreq = SysctrlPllOutFreq36_48MHz; //PLL 输出
|
||||
stcPLLCfg.enPllClkSrc = SysctrlPllRch; //输入时钟源选择RCH
|
||||
stcPLLCfg.enPllMul = SysctrlPllMul6; //8MHz x 6 = 48MHz
|
||||
Sysctrl_SetPLLFreq(&stcPLLCfg);
|
||||
|
||||
///< 当使用的时钟源HCLK大于24M:设置FLASH 读等待周期为1 cycle(默认值也为1 cycle)
|
||||
Flash_WaitCycle(FlashWaitCycle1);
|
||||
|
||||
///< 使能PLL
|
||||
Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE);
|
||||
///< 时钟切换到PLL
|
||||
Sysctrl_SysClkSwitch(SysctrlClkPLL);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
static void SystemRCLInit(void)
|
||||
{
|
||||
Sysctrl_SetRCLTrim(SysctrlRclFreq38400); ///< 配置RCL时钟为32kHz
|
||||
Sysctrl_SetRCLStableTime(SysctrlRclStableCycle256);
|
||||
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE); ///< 使能RCL时钟
|
||||
}
|
||||
|
||||
static void LPUartInit(void)
|
||||
{
|
||||
stc_gpio_cfg_t stcGpioCfg;
|
||||
stc_lpuart_cfg_t stcCfg;
|
||||
DDL_ZERO_STRUCT(stcGpioCfg);
|
||||
|
||||
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
|
||||
|
||||
///<TX
|
||||
stcGpioCfg.enDir = GpioDirOut;
|
||||
Gpio_Init(LPUART_TX_PORT, LPUART_TX_PIN, &stcGpioCfg);
|
||||
Gpio_SetAfMode(LPUART_TX_PORT, LPUART_TX_PIN, LPUART_TX_AF); //配置PA00为LPUART1_TX
|
||||
|
||||
//<RX
|
||||
stcGpioCfg.enDir = GpioDirIn;
|
||||
Gpio_Init(LPUART_RX_PORT, LPUART_RX_PIN,&stcGpioCfg);
|
||||
Gpio_SetAfMode(LPUART_RX_PORT, LPUART_RX_PIN, LPUART_RX_AF); //配置PA01为LPUART1_RX
|
||||
|
||||
DDL_ZERO_STRUCT(stcCfg);
|
||||
Sysctrl_SetPeripheralGate(LPUART_PERIPHERAL_CLK,TRUE);
|
||||
|
||||
///<LPUART 初始化
|
||||
stcCfg.enStopBit = LPUart1bit; ///<1停止位
|
||||
stcCfg.enMmdorCk = LPUartEven; ///<偶校验
|
||||
stcCfg.stcBaud.enSclkSel = LPUartMskRcl; ///<传输时钟源
|
||||
stcCfg.stcBaud.u32Sclk = 38400; ///<PCLK获取
|
||||
stcCfg.stcBaud.enSclkDiv = LPUartMsk4Or8Div; ///<采样分频
|
||||
stcCfg.stcBaud.u32Baud = 9600; ///<波特率
|
||||
stcCfg.enRunMode = LPUartMskMode1; ///<工作模式
|
||||
LPUart_Init(LPUART, &stcCfg);
|
||||
|
||||
///<LPUART 中断使能
|
||||
LPUart_ClrStatus(LPUART,LPUartRC); ///<清接收中断请求
|
||||
LPUart_ClrStatus(LPUART,LPUartTC); ///<清发送中断请求
|
||||
LPUart_EnableIrq(LPUART,LPUartTxIrq); ///<使能发送中断
|
||||
LPUart_EnableIrq(LPUART,LPUartRxIrq); ///<使能接收中断
|
||||
EnableNvic(LPUART_IRQN,IrqLevel3,TRUE); ///<系统中断使能
|
||||
}
|
||||
|
||||
void DBGUartSend(uint8_t *sData, int sLen)
|
||||
{
|
||||
uint16_t dlyCnt = 0xffff;
|
||||
|
||||
RS485_CTRL_TX();
|
||||
delay_ms(1);
|
||||
for(int i = 0; i < sLen; i++) {
|
||||
LpUart0_Tx_Flag = false;
|
||||
dlyCnt = 0xffff;
|
||||
LPUart_SendDataIt(LPUART, sData[i]);
|
||||
while(dlyCnt > 0) {
|
||||
dlyCnt--;
|
||||
if(LpUart0_Tx_Flag)
|
||||
break;
|
||||
}
|
||||
}
|
||||
RS485_CTRL_RX();
|
||||
}
|
||||
|
||||
#if(LP_UART_CH == 0)
|
||||
void LpUart0_IRQHandler(void)
|
||||
{
|
||||
if(LPUart_GetStatus(LPUART, LPUartTC)) {
|
||||
LPUart_ClrStatus(LPUART, LPUartTC); ///<清发送中断请求
|
||||
LpUart0_Tx_Flag = true;
|
||||
}
|
||||
|
||||
if(LPUart_GetStatus(LPUART, LPUartRC)) { ///接收数据
|
||||
LPUart_ClrStatus(LPUART, LPUartRC); ///<清接收中断请求
|
||||
uint8_t u8RxData = LPUart_ReceiveData(LPUART); ///读取数据
|
||||
DebugUartIRQ(u8RxData);
|
||||
}
|
||||
}
|
||||
#else
|
||||
void LpUart1_IRQHandler(void)
|
||||
{
|
||||
if(LPUart_GetStatus(LPUART, LPUartTC)) {
|
||||
LPUart_ClrStatus(LPUART, LPUartTC); ///<清发送中断请求
|
||||
LpUart0_Tx_Flag = true;
|
||||
}
|
||||
|
||||
if(LPUart_GetStatus(LPUART, LPUartRC)) { ///接收数据
|
||||
LPUart_ClrStatus(LPUART, LPUartRC); ///<清接收中断请求
|
||||
uint8_t u8RxData = LPUart_ReceiveData(LPUART); ///读取数据
|
||||
DebugUartIRQ(u8RxData);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void GPIOInit(void)
|
||||
{
|
||||
stc_gpio_cfg_t GpioInitStruct;
|
||||
|
||||
DDL_ZERO_STRUCT(GpioInitStruct);
|
||||
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
|
||||
|
||||
GpioInitStruct.enDir = GpioDirOut; ///< 端口方向配置->输入
|
||||
GpioInitStruct.enDrv = GpioDrvH; ///< 端口驱动能力配置->高驱动能力
|
||||
GpioInitStruct.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||||
GpioInitStruct.enPd = GpioPdDisable;
|
||||
GpioInitStruct.enOD = GpioOdDisable; ///< 端口开漏输出配置->开漏输出关闭
|
||||
GpioInitStruct.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||||
GpioInitStruct.bOutputVal = false;
|
||||
|
||||
Gpio_Init(RS485_CTRL_PORT, RS485_CTRL_PIN, &GpioInitStruct);
|
||||
RS485_CTRL_RX();
|
||||
}
|
||||
|
||||
static void WdtInit(void)
|
||||
{
|
||||
#if (USE_WDT == 1)
|
||||
///< 开启WDT外设时钟
|
||||
Sysctrl_SetPeripheralGate(SysctrlPeripheralWdt,TRUE);
|
||||
///< WDT 初始化
|
||||
Wdt_Init(WdtResetEn, WdtT52s4);
|
||||
Wdt_Start();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void FlashWrite(uint32_t *wData, uint8_t wLen)
|
||||
{
|
||||
while(Ok != Flash_SectorErase(BOOT_PARA_ADDRESS));
|
||||
for(int i = 0; i < wLen / 4; i++) {
|
||||
Flash_WriteWord(BOOT_PARA_ADDRESS + i * 4, wData[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void FlashRead(uint32_t *rData, uint8_t rLen)
|
||||
{
|
||||
uint32_t u32Addr = BOOT_PARA_ADDRESS;
|
||||
for(int i = 0; i < rLen / 4; i++) {
|
||||
rData[i] = *((volatile uint32_t*)(u32Addr + i * 4));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void FeedDog(void)
|
||||
{
|
||||
#if (USE_WDT == 1)
|
||||
Wdt_Feed();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
uint32_t GetSysTick(void)
|
||||
{
|
||||
return SysTickCnt;
|
||||
}
|
||||
|
||||
void Delay(uint8_t time)
|
||||
{
|
||||
while(time > 0) {
|
||||
time --;
|
||||
}
|
||||
}
|
||||
|
||||
void delay_ms(uint32_t mS)
|
||||
{
|
||||
volatile uint32_t cTick, mTick;
|
||||
|
||||
cTick = GetSysTick();
|
||||
while(1){
|
||||
mTick = GetSysTick();
|
||||
if(mTick - cTick >= mS)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SystemReset(void)
|
||||
{
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
void BspInit(void)
|
||||
{
|
||||
//SystemClkInit(SysctrlXthFreq4_8MHz);
|
||||
SystemClkInit(SysctrlRchFreq16MHz);
|
||||
SystemCoreClockUpdate();
|
||||
SysTick_Config(SystemCoreClock/1000);
|
||||
SystemRCLInit();
|
||||
GPIOInit();
|
||||
LPUartInit();
|
||||
while(Ok != Flash_Init(4, TRUE));
|
||||
WdtInit();
|
||||
}
|
||||
|
||||
void SysTick_IRQHandler(void)
|
||||
{
|
||||
SysTickCnt++;
|
||||
SysTick_CallBack();
|
||||
}
|
||||
|
||||
|
||||
void ReadBootPara(BootPara rData)
|
||||
{
|
||||
FlashRead((uint32_t *)rData, sizeof(BootPara_t));
|
||||
}
|
||||
|
||||
void WriteBootPara(BootPara wData)
|
||||
{
|
||||
FlashWrite((uint32_t *)wData, sizeof(BootPara_t));
|
||||
}
|
||||
|
||||
void EraseFlash(void)
|
||||
{
|
||||
for(int Addr = APP_ADDRESS; Addr < FLASH_SIZE; Addr += FLASH_SECTOR_SIZE) {
|
||||
Flash_SectorErase(Addr);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,324 @@
|
||||
|
||||
/******************************************************************************
|
||||
* Include files
|
||||
******************************************************************************/
|
||||
#include <stdlib.h>
|
||||
#include "main.h"
|
||||
//#include "lis2hh12_app.h"
|
||||
#include "flash.h"
|
||||
|
||||
//设备唯一编码,固定在0x00002800位置
|
||||
const uint8_t DevMac[6] __attribute__((section(".ARM.__at_0x00002800"))) = {DEVICE_TYPE & 0xFF, (DEVICE_TYPE >> 8) & 0xFF, COMM_WAY, (ADD_NUMBER >> 16) & 0xFF, (ADD_NUMBER >> 8) & 0xFF, ADD_NUMBER & 0xFF};
|
||||
//const uint8_t DevMac[6] __attribute__((at(DEV_MAC_ADDRESS)))= {0x19, 0x00, 0x02, 0x00, 0x00, 0x01};
|
||||
uint32_t pdwCrc32Tbl[256];
|
||||
|
||||
void InitCrc32Table(uint32_t* Crc32Tbl)
|
||||
{
|
||||
for (int wCnt = 0; wCnt!= 256; wCnt++){
|
||||
uint32_t dwCrc = wCnt;
|
||||
for (int ucCnt = 0; ucCnt != 8; ucCnt++){
|
||||
if (dwCrc & 1){
|
||||
dwCrc = (dwCrc >> 1) ^ 0xEDB88320;
|
||||
}
|
||||
else{
|
||||
dwCrc >>= 1;
|
||||
}
|
||||
}
|
||||
Crc32Tbl[wCnt] = dwCrc;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t GetCrc32(int dwLen)
|
||||
{
|
||||
uint32_t Data;
|
||||
uint32_t dwCrc32Data = 0xFFFFFFFF;
|
||||
for (int dwCnt = 0; dwCnt!= dwLen; ++dwCnt){
|
||||
Data = *((volatile uint8_t*)(APP_ADDRESS + dwCnt));
|
||||
uint32_t dwTbl = (dwCrc32Data ^ Data) & 0xFF;
|
||||
dwCrc32Data = ((dwCrc32Data >> 8) & 0xFFFFFF) ^ pdwCrc32Tbl[dwTbl];
|
||||
}
|
||||
return ~dwCrc32Data;
|
||||
}
|
||||
|
||||
uint16_t CRC_Modbus(uint16_t wBase, __IO uint8_t *para, uint16_t length)
|
||||
{
|
||||
uint16_t crc = 0xffff;
|
||||
|
||||
uint16_t index,i;
|
||||
|
||||
for(index = 0 ; index < length;index++) {
|
||||
crc ^= para[index];
|
||||
for(i = 0; i < 8; i++) {
|
||||
if(crc & 1) {
|
||||
crc >>= 1;
|
||||
crc ^= wBase;
|
||||
}
|
||||
else
|
||||
crc >>= 1;
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
uint32_t JumpAddress;
|
||||
func_ptr_t JumpToApplication;
|
||||
BootLoader_t BL;
|
||||
|
||||
static void BootLoader1mSRoutine(void)
|
||||
{
|
||||
if(BL.BootLoader1mSDlyCnt)
|
||||
BL.BootLoader1mSDlyCnt--;
|
||||
|
||||
if(BL.UartRevTimeOutCnt > 0)
|
||||
BL.UartRevTimeOutCnt--;
|
||||
|
||||
BL.FeedDogDlyCnt++;
|
||||
}
|
||||
|
||||
void FeedDogHandler(void)
|
||||
{
|
||||
if(BL.FeedDogDlyCnt >= 200) {
|
||||
FeedDog();
|
||||
BL.FeedDogDlyCnt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void AppWriteFlash(uint32_t AddrOffset, uint8_t *wData, int wLen)
|
||||
{
|
||||
for(int i = 0; i < wLen; i++) {
|
||||
Flash_WriteByte(APP_ADDRESS + AddrOffset + i, wData[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static bool JumpToApp(uint32_t AppAddr)
|
||||
{
|
||||
uint32_t u32StackTop = *((__IO uint32_t *)AppAddr);
|
||||
|
||||
if ((u32StackTop > SRAM_BASE) && (u32StackTop <= (SRAM_BASE + RAM_SIZE))) {
|
||||
JumpAddress = *(__IO uint32_t *)(AppAddr + 4);
|
||||
JumpToApplication = (func_ptr_t)JumpAddress;
|
||||
__set_MSP(*(__IO uint32_t *)AppAddr);
|
||||
JumpToApplication();
|
||||
}
|
||||
return Error;
|
||||
}
|
||||
|
||||
void SendGetCmd(uint8_t Cmd, uint16_t PayLoad)
|
||||
{
|
||||
uint8_t sData[20], sLen;
|
||||
uint16_t crc16;
|
||||
|
||||
FrameH Frame = (FrameH)sData;
|
||||
|
||||
Frame->Header = 0x7d;
|
||||
memcpy(Frame->DevMac, DevMac, 6);
|
||||
Frame->Cmd = Cmd & 0x7F;
|
||||
|
||||
if(Frame->Cmd == UPDATE_CMD_SLAVE_RES) {
|
||||
Frame->PayloadLen = 1;
|
||||
sData[sizeof(FrameHeader_t)] = PayLoad;
|
||||
}
|
||||
else if(Frame->Cmd == UPDATE_CMD_SLAVE_REQ_DATA) {
|
||||
Frame->PayloadLen = 4;
|
||||
GDReq GDData = (GDReq)&sData[sizeof(FrameHeader_t)];
|
||||
GDData->PackageIndex = PayLoad;
|
||||
GDData->PackageNum = BL.AppPackageCnt;
|
||||
}
|
||||
sLen = sizeof(FrameHeader_t) + Frame->PayloadLen;
|
||||
crc16 = CRC_Modbus(CRC16_BASE, sData, sLen);
|
||||
sData[sLen++] = crc16;
|
||||
sData[sLen++] = (crc16 >> 8) & 0x00ff;
|
||||
|
||||
DBGUartSend(sData, sLen);
|
||||
}
|
||||
|
||||
bool AnalyzeData(uint8_t *rData, uint16_t rLen)
|
||||
{
|
||||
uint16_t crc16, check;
|
||||
|
||||
check = CRC_Modbus(CRC16_BASE, rData, rLen - 2);
|
||||
crc16 = (rData[rLen - 1] << 8) | rData[rLen - 2];
|
||||
|
||||
if(check != crc16) {
|
||||
return false;
|
||||
}
|
||||
|
||||
FrameH Frame = (FrameH)rData;
|
||||
int ret = memcmp(Frame->DevMac, DevMac, 6);
|
||||
if(ret != 0)
|
||||
return false;
|
||||
|
||||
if(Frame->Cmd == UPDATE_CMD_MASTER_REQ) {
|
||||
UDReq UpData = (UDReq)&rData[sizeof(FrameHeader_t)];
|
||||
BL.Para.AppFlag = 0;
|
||||
BL.Para.UpdateFlag = APP_UPDATE_FLAG;
|
||||
BL.Para.Crc32Check = UpData->AppCrc32;
|
||||
BL.Para.PackageCnt = UpData->PackageNum;
|
||||
BL.Para.AppSize = UpData->AppSize;
|
||||
WriteBootPara(&BL.Para);
|
||||
BL.BootLoader1mSDlyCnt = 20;
|
||||
BL.Status = BL_RESET;
|
||||
SendGetCmd(UPDATE_CMD_SLAVE_RES, 1);
|
||||
}
|
||||
else if(Frame->Cmd == UPDATE_CMD_MASTRE_RES_DATA) {
|
||||
if(BL.UpDateFlag == false)
|
||||
return false;
|
||||
DownRes DownData = (DownRes)&rData[sizeof(FrameHeader_t)];
|
||||
if(BL.AppPackageIdx != DownData->PackageIndex) {
|
||||
return false;
|
||||
}
|
||||
AppWriteFlash(BL.AppPackageIdx * 200, &BL.RxBuff[sizeof(FrameHeader_t) + sizeof(DownResponse_t)], DownData->DataLen);
|
||||
BL.AppPackageIdx++;
|
||||
BL.RevErrCnt = 0;
|
||||
if(BL.AppPackageIdx < BL.AppPackageCnt) {
|
||||
BL.Status = BL_GET_DATA;
|
||||
BL.BootLoader1mSDlyCnt = 5;
|
||||
}
|
||||
else {
|
||||
uint32_t crc32 = GetCrc32(BL.Para.AppSize);
|
||||
if(crc32 == BL.Para.Crc32Check) {
|
||||
BL.Status = BL_START_APP;
|
||||
BL.Para.AppFlag = 0; //升级成功首次启动时,把APP启动标志清除,由APP置位,下次启动便按标志启动
|
||||
BL.Para.UpdateFlag = 0;
|
||||
WriteBootPara(&BL.Para);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void BootLoaderLoopHandler(void)
|
||||
{
|
||||
if(BL.RxFlag) {
|
||||
BL.RxFlag = false;
|
||||
AnalyzeData(BL.RxBuff, BL.RxLen);
|
||||
}
|
||||
|
||||
switch(BL.Status) {
|
||||
case BL_IDLE:
|
||||
break;
|
||||
|
||||
case BL_RESET:
|
||||
if(BL.BootLoader1mSDlyCnt > 0) {
|
||||
break;
|
||||
}
|
||||
SystemReset();
|
||||
break;
|
||||
|
||||
case BL_START_APP:
|
||||
JumpToApp(APP_ADDRESS);
|
||||
break;
|
||||
|
||||
case BL_ERASE_FLASH:
|
||||
FeedDog();
|
||||
EraseFlash();
|
||||
FeedDog();
|
||||
BL.Status = BL_GET_DATA;
|
||||
BL.BootLoader1mSDlyCnt = 200;
|
||||
BL.AppPackageCnt = BL.Para.PackageCnt;
|
||||
BL.RevErrCnt = 0;
|
||||
BL.UpDateFlag = true;
|
||||
break;
|
||||
|
||||
case BL_GET_DATA:
|
||||
if(BL.BootLoader1mSDlyCnt > 0)
|
||||
break;
|
||||
SendGetCmd(UPDATE_CMD_MASTRE_RES_DATA, BL.AppPackageIdx);
|
||||
BL.Status = BL_WAIT_REV;
|
||||
BL.BootLoader1mSDlyCnt = 500;
|
||||
break;
|
||||
|
||||
case BL_WAIT_REV:
|
||||
if(BL.BootLoader1mSDlyCnt == 0) {
|
||||
BL.Status = BL_GET_DATA_TIMEOUT;
|
||||
}
|
||||
break;
|
||||
|
||||
case BL_GET_DATA_TIMEOUT:
|
||||
BL.RevErrCnt++;
|
||||
if(BL.RevErrCnt < 3) {
|
||||
BL.Status = BL_GET_DATA;
|
||||
}
|
||||
else {
|
||||
BL.Status = BL_IDLE;
|
||||
BL.Para.AppFlag = 0;
|
||||
BL.RevErrCnt = 0;
|
||||
BL.Para.UpdateFlag = 0;
|
||||
WriteBootPara(&BL.Para);
|
||||
BL.UpDateFlag = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int32_t main(void)
|
||||
{
|
||||
BspInit();
|
||||
InitCrc32Table(pdwCrc32Tbl);
|
||||
|
||||
ReadBootPara(&BL.Para);
|
||||
if(BL.Para.AppFlag == APP_START_FLAG) {
|
||||
BL.Status = BL_START_APP;
|
||||
}
|
||||
else if(BL.Para.UpdateFlag == APP_UPDATE_FLAG) {
|
||||
BL.Status = BL_ERASE_FLASH;
|
||||
}
|
||||
while (1) {
|
||||
FeedDogHandler();
|
||||
BootLoaderLoopHandler();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* 中断服务函数
|
||||
******************************************************************************/
|
||||
void SysTick_CallBack(void)
|
||||
{
|
||||
BootLoader1mSRoutine();
|
||||
}
|
||||
|
||||
void DebugUartIRQ(uint8_t RxData)
|
||||
{
|
||||
static uint16_t rLen = 0;
|
||||
static uint8_t rBuff[300];
|
||||
static bool Header = false;
|
||||
static uint16_t PayLen = 0;
|
||||
|
||||
if(BL.UartRevTimeOutCnt == 0) {
|
||||
Header = false;
|
||||
rLen = 0;
|
||||
PayLen = 0;
|
||||
}
|
||||
BL.UartRevTimeOutCnt = 3;
|
||||
|
||||
if(Header == false && (RxData == 0x7d)) {
|
||||
Header = true;
|
||||
rLen = 0;
|
||||
PayLen = 0;
|
||||
rBuff[rLen++] = RxData;
|
||||
}
|
||||
else {
|
||||
rBuff[rLen++] = RxData;
|
||||
if(rLen == 9) {
|
||||
PayLen = RxData;
|
||||
if(PayLen > 256) {
|
||||
Header = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if(rLen == sizeof(FrameHeader_t) + PayLen + 2) {
|
||||
BL.RxLen = rLen;
|
||||
memcpy(BL.RxBuff, rBuff, BL.RxLen);
|
||||
BL.RxFlag = true;
|
||||
Header = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void KeyIRQHandler(void)
|
||||
//{
|
||||
//
|
||||
//}
|
||||
Reference in New Issue
Block a user