stm32IAP代码升级小结
1 概述
最近負責項目代碼升級這一部分,在這里做一個小結。要實現程序的遠程升級,需要用到兩個程序,一個是Bootloader,另一個就是APP。單片機開機首先執行Bootloader,然后對APP進行引導。
2 流程圖
在我們的項目中兩個程序的流程圖大致如下:
開始BootLoader需要更新?app循環更新代碼?接收,寫入更新代碼yesnoyesno
說明:需要更新時,通過GPRS模塊向單片機發送代碼更新指令和數據,然后單片機依次從模塊中取出發開的代碼數據,寫入到flash中。然后寫入相關更新數據到指定flash,重啟單片機,在Bootloader中讀取相關地址數據,獲取更新程序的地址等信息,然后對程序進行跳轉。
3 功能實現
需要把單片機flash,分成4個部分,分別是Bootloader,APP1,APP2,參數區。其中參數區一般幾十個字節就夠用,用于保存是否更新標識等信息,當前demo參數區信息為:
#define FLASH_UPDATE_FLAG_ADDR FLASH_CONFIGDATA_ADDR #define FLASH_APP1_VISION_ADDR FLASH_UPDATE_FLAG_ADDR+HALFWORD #define FLASH_APP2_VISION_ADDR FLASH_APP1_VISION_ADDR+VISION_SIZE #define FLASH_APP1_LENGTH_ADDR FLASH_APP2_VISION_ADDR+VISION_SIZE #define FLASH_APP2_LENGTH_ADDR FLASH_APP1_LENGTH_ADDR+HALFWORD #define FLASH_APP1_CRC_ADDR FLASH_APP2_LENGTH_ADDR+HALFWORD #define FLASH_APP2_CRC_ADDR FLASH_APP1_CRC_ADDR+HALFWORD #define FLASH_CURRENTAPP_FLAG_ADDR FLASH_APP2_LENGTH_ADDR+HALFWORD- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
3.1 Bootloader主要代碼
在Bootloader中主要是開機讀取flash參數區用于更新,然后對程序進行引導,其跳轉程序為:
void iap_load_app(u32 appxaddr) {if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //判斷地址合法{ __set_CONTROL(0); //特權模式__ASM("CPSID I"); //關中斷jump2app=(iapfun)*(vu32*)(appxaddr+4); //程序開始地址為代碼區第二字 MSR_MSP(*(vu32*)appxaddr); //初始化堆棧指針jump2app(); //跳轉 } }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
3.2 APP主要代碼
在APP,和平常不同的主要是兩個方面,一個是代碼存放的地址,如果是通過JLink升級,下載的地址需要更改?
?
二是,程序開始時需要加上,這兩句代碼
- 1
- 2
4 其他
這里有幾個需要注意的細節?
1.在用到RTOS時,在跳轉時一般都要在跳轉前開啟特權模式以及關中端,然后在APP中一開始打開中斷。?
2.由于中斷向量的關系,跳轉程序的起始位置需要是512字節的倍數。?
3.flash的讀取和寫入一般都是半字操作的。?
4.大容量的stm32每個扇區為2k,中容量為1k,這個在寫入更新代碼時需要注意。
總結
以上是生活随笔為你收集整理的stm32IAP代码升级小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32的can总线理解及应用——程序
- 下一篇: Linux 环境下的抓包工具 - tcp