91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 958KB
    文件類型: .rar
    金幣: 2
    下載: 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? {
//STM32是小端模式 ????
temp?=?(uint16_t)dfu[1]?< 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個文件信息

評論

共有 條評論