資源簡介
主控板CPU:STM32F105;GPRS模組:SIM7600CE;大概思路:主控板上電后,檢測到APP有升級需求后SIM7600CE連接網絡,通過FTP方式下載最新的app固件,燒寫成功后重啟進入APP(當中包括校驗等操作)。工程是實際項目在用的工程,雖然不是最終版本,但方案基本一致,因IAP程序不涉及項目業務邏輯,自己之前寫的時候也遇到一些坑,現在分享出來,讓大家少走些彎路。

代碼片段和文件信息
#include?“STM_FlashOp.h“
#include?“iap.h“
#include?“function.h“
#include?
#include?“Modem.h“
#include?“dma.h“
#include?“tim.h“
#include?“usart.h“
#define USE_DEBUG_MSG (1)
#ifdef?USE_DEBUG_MSG
#define?DEBUG(format?...) \
do?{ \
printf(“[DEBUG]?%s:?“format?__func__?##__VA_ARGS__); \
}?while?(0)
#else
#define?DEBUG(format?...)
#endif
FwUpdateMsg_t FwUpdateMsg?FwUpdateMsgBak;
updateStep_t?updateStep?=?CHECK_UPDATE_FLAG;
uint32_t?NewAppSize;
uint16_t?u16gIapBuf[HALF_WORD_PROG_SIZE];???//1024
uint8_t?u8gIapBuf[MCU_PAGE_SIZE];
typedef?void?(*pFunction)(void); //定義函數指針
static?pFunction?Jump_To_Application;
static?uint32_t??JumpAddress; //跳轉地址
void?JumpToapp(void)
{
if?(memcmp(FwUpdateMsgBak.u16buf?FwUpdateMsg.u16buf?sizeof(FwUpdateMsg.u16buf))?!=?0)
{
/*?更新記錄文件?*/
STMFLASH_Write(DATA_START_ADDR?FwUpdateMsg.u16buf?sizeof(FwUpdateMsg.u16buf));
}
DEBUG(“跳轉APP程序!\n“);
if?(((*(volatile?uint32_t*)APP_START_ADDR)?&?0x2FFE0000)?==?0x20000000)//檢查棧頂地址是否合法
{
/*?關掉IAP已使用的外設?*/
StopTimer(&htim3);
uartStop(&huart3);
HAL_DeInit();
__disable_irq();//關閉總中斷
/*?設置APP復位向量地址?*/
JumpAddress?=?*(volatile?uint32_t*)?(APP_START_ADDR?+?4);
Jump_To_Application?=?(pFunction)?JumpAddress;
/*?Initialize?user?application‘s?Stack?Pointer?*/
__set_MSP(*(__IO?uint32_t*)?APP_START_ADDR);
/*?跳轉到APP?*/
Jump_To_Application();
}
}
//appxaddr:應用程序的起始地址
//appbuf:應用程序CODE.
//appsize:應用程序大小(字節).
bool?IapWrAppBin(uint32_t?appxaddr?uint8_t?*appbuf?uint32_t?appsize)
{
uint16_t?t?=?0;
uint16_t?i?=?0;
uint16_t?temp?=?0;
uint32_t?fwaddr?=?appxaddr;//當前寫入的地址
uint8_t?*dfu?=?appbuf;
bool?ret?=?false;
__disable_irq();
for?(t?=?0;?t? {
//STM32是小端模式 ????
temp?=?(uint16_t)dfu[1]?<8;
temp?+=?(uint16_t)dfu[0]; ??
dfu?+=?2;//偏移2個字節
u16gIapBuf[i++]?=?temp; ????
if?(i?==?HALF_WORD_PROG_SIZE)
{
i?=?0;
ret?=?STMFLASH_Write(fwaddr?u16gIapBuf?HALF_WORD_PROG_SIZE);
if?(!ret)
{
__enable_irq();
return?false;
}
fwaddr?+=?MCU_PAGE_SIZE;//偏移2048??16=2*8.所以要乘以2.
}
}
if?(i)
{
ret?=?STMFLASH_Write(fwaddr?u16gIapBuf?i);//將最后的一些內容字節寫進去.??
if?(!ret)
{
__enable_irq();
return?false;
}
}
__enable_irq();
return?true;
}
//校驗文件有效性
uint32_t?IapVerifyAppBin(uint32_t?RdStartAddr?uint32_t?AppSize)
{
uint32_t?RdAddr?=?RdStartAddr;
uint32_t?CurProgSize?=?0;
uint32_t?RemainSize?=?AppSize; //剩余字節數
uint16_t?i?=?0;
uint32_t?Crc32Val?=?0;
uint16_t?RdCnt?=?0;
__disable_irq();
CRC32Init(&Crc32Val);
RdCnt?=?AppSize?/?MCU_PAGE_SIZE;
if?(AppSize?%?MCU_PAGE_SIZE)
{
RdCnt++;
}
while?(RdCnt--)
{
memset(u16gIapBuf?0?MCU_PAGE_SIZE);
memset(u8gIapBuf?0?MCU_PAGE_SIZE);
STMFLASH_Read(RdAddr?u16gIapBuf?HALF_WORD_PROG_SIZE); //每次固定讀取2048個字節(最后一次存在多讀的情況)
RdAddr?+=?MCU_PAGE_SIZ
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????6780??2019-07-16?17:57??bootloader(gprs)\IAP\iap.c
?????文件???????1962??2019-06-24?16:10??bootloader(gprs)\IAP\iap.h
?????文件???????3068??2019-06-05?15:12??bootloader(gprs)\Inc\dma.h
?????文件???????3077??2019-06-05?15:37??bootloader(gprs)\Inc\gpio.h
?????文件???????4925??2019-06-05?15:12??bootloader(gprs)\Inc\main.h
?????文件??????14689??2019-06-05?15:12??bootloader(gprs)\Inc\stm32f1xx_hal_conf.h
?????文件???????3590??2019-06-05?15:12??bootloader(gprs)\Inc\stm32f1xx_it.h
?????文件???????3326??2019-06-14?17:49??bootloader(gprs)\Inc\tim.h
?????文件???????3959??2019-06-17?11:45??bootloader(gprs)\Inc\usart.h
?????文件?????103909??2019-02-11?15:23??bootloader(gprs)\Lib\Core\core_cm3.h
?????文件???????3620??2019-02-11?15:23??bootloader(gprs)\Lib\Core\core_cmFunc.h
?????文件???????3636??2019-02-11?15:23??bootloader(gprs)\Lib\Core\core_cmInstr.h
?????文件???????3662??2019-02-11?15:23??bootloader(gprs)\Lib\Core\core_cmSimd.h
?????文件??????16638??2019-03-27?13:03??bootloader(gprs)\Lib\Core\startup_stm32f105xc.s
?????文件????1261502??2019-03-01?13:22??bootloader(gprs)\Lib\Core\stm32f105xc.h
?????文件???????8788??2019-02-11?15:23??bootloader(gprs)\Lib\Core\stm32f1xx.h
?????文件???????3337??2019-02-11?15:23??bootloader(gprs)\Lib\Core\system_stm32f1xx.h
?????文件???????6888??2019-04-19?18:05??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\Legacy\stm32f1xx_hal_can_ex_legacy.h
?????文件??????38350??2019-04-19?18:05??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\Legacy\stm32f1xx_hal_can_legacy.h
?????文件?????181878??2019-04-19?18:05??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h
?????文件??????12775??2019-04-19?18:05??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal.h
?????文件??????51553??2019-04-19?18:05??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_adc.h
?????文件??????48641??2019-04-19?18:05??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_adc_ex.h
?????文件??????40139??2019-04-19?18:05??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_can.h
?????文件???????6888??2019-02-11?15:23??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_can_ex.h
?????文件??????21255??2019-04-19?18:05??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_cec.h
?????文件??????15430??2019-04-19?18:05??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_conf_template.h
?????文件??????18812??2019-04-19?18:05??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_cortex.h
?????文件???????6110??2019-04-19?18:05??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_crc.h
?????文件??????10657??2019-04-19?18:05??bootloader(gprs)\Lib\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_dac.h
............此處省略156個文件信息
- 上一篇:圖書管理系統答辯PPT
- 下一篇:紅外脈搏測量硬件原理圖
評論
共有 條評論