资源简介
主控板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 < appsize; t+=2)
{
//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
- 下一篇:红外脉搏测量硬件原理图
相关资源
- 《emwin实战指南(基于STM32-ISO开发板)
- Beginning STM32: Developing with FreeRTOS libo
- stm32f103c8t6_sch.Lib
- ALIENTEK战舰STM32F1 V3开发板原理图.rar
- STM32F103RC+ADC+DMA多通道采样LCD显示
- I2C读写AT24C02 基于STM32F103 cube116540
- 基于stm32f103ve的程序——跑马灯实验
- 基于STM32RCT6的步进电机驱动程序
- stm32f407上的两个can发送和接收例程
- STM32 led 时钟
- STM32 2.4G通信例程
- 直流无刷电机方波驱动 stm32 例程代码
- STM32中文资料
- STM32蓝牙和串口程序
- STM32f103超声波模块例程
- stm32f103c8t6 4 oled.rar
- stm32f030 IAP Demo(原创)
- STM32基于rt_thread操作系统的SDHC卡文件
- NRF24L01实现51与STM32双向通讯
- STM32F103 串口程序(完整版)
- stm32 ds18b20 温度传感器 测试通过
- GPRS(MC35型号)的发送短信程序
- stm32官方例程
- STM32F103定时器中断程序
- [免费]基于stm32f103ze 的OLED驱动代码
- STM32F103RBT6驱动UC1698控制芯片的160160黑
- STM32F103 DS18B20 V3.5.0固件库驱动程序工
- STM32定时器使用入门。看了这个程序会
- SIM908 SDIO FSMC STM32 FIFO
- STM32F103 CC2500完整驱动(模拟SPI)
评论
共有 条评论