资源简介
主控板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
- 下一篇:红外脉搏测量硬件原理图
相关资源
- 遥控器S.BUS信号解析转发到CAN源码
- STM32 ADC采样和滤波
- stm32 isp工具支持rts,cts控制复位
- STM32F411RCT6最小系统原理图
- IAR下stm32程序
- stm32f103的AD7091驱动程序
- stm32f103系列spi连接rc522的rfid读卡程序
- STM32CubeMX 实验03 通用定时器2定时中断
- 单片机控制继电器模块电路原理图,
- STM32_EC20
-
SurfaceView+MediaPla
yer视频播放以及小窗 - MAG3110代码基于stm32
- OV7725摄像头液晶颜色识别
- 基于STM32F407的OTM8009液晶显示驱动
- 基于STM32的GPS定位接收显示
- TM1640实现两根数据线控制8x16点阵
- STM32F103+GPRS原理图 PCB制作PM2.5检测仪和
- STM32F030实现AM2302模块,stm32stm8系列基
- stm32f1+esp8266+温湿度+光强+噪音+红外检
- STM32H743全部封装IO引脚分配表.xlsx
- STM32F103下的编码器程序
- stm32读取陀螺仪MPU6050发送数据到串口
- STM32控制锁相环频综芯片HMC704的程序
- STM32 PCB原理图
- 嵌入式网络那些事-STM32物联实战完整
-
qt/qml MediaPla
yerDemo -
STM32f103 jli
nk命令行 SWD方式烧写脚本 - STM32F0,F1,F2,F3,F4固件包库,DFP文
- STM32F407驱动AD7606的8路16位AD同步采样含
- 基于STM32的 ADXL345三轴测量角度 软件
评论
共有 条评论