• 大小: 958KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-13
  • 语言: 其他
  • 标签: STM32  IAP  GPRS  SIM7600CE  

资源简介

主控板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个文件信息

评论

共有 条评论