




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、STM32 IAP在線升級 STM32很強大的一個功能是支持IAP在線升級,IAP(In-Application Programming),即在“應用程序中編程,通俗的來將是程序自己可以往程序存儲器里寫數據或修改程序。有了IAP功能,即使在產品發(fā)布之后也可以方便的通過預留的通信端口(如串口、USB、IIC等)對產品中的程序固件進行更新升級,而無需通過傳統的JTAG方式做燒錄更新。IAP功能的固件一般包含兩個部分:Boot和UserApp。其中Boot部分必須通過JATG或ISP進行燒錄,APP部分可以在燒錄BOOT后通過IAP升級燒入或者與BOOT合并到一起后通過JATG或ISP進行燒錄。 M
2、CU上電后,首先運行BOOT,BOOT起來后,做如下操作: 1.對APP部分做校驗,如果校驗失敗,認為APP出現異常,自動切換到升級流程(流程3),反之,跳轉到APP執(zhí)行(流程4); 2.檢查升級標志,看是否需要升級,如果需要升級,進入升級流程(流程3),反之,跳轉到APP執(zhí)行(流程4); 3.執(zhí)行升級流程,升級完成后重置升級標志并軟件復位; 4.跳轉到APP執(zhí)行,APP在需要升級時,寫入升級標志并軟件復位。需要注意的是:如果BOOT程序被破壞,產品就只能通過JATG或ISP進行燒錄了,這一點是不能容忍的,解決的方法是我們可以對BOOT區(qū)域設置成寫保護。以禁止對BOOT區(qū)域進行編程或擦除操作。
3、在實現IAP之前,先了解一下STM32的存儲器架構和啟動過程:STM32的內部閃存地址起始于0x8000000,一般情況下,程序文件就從此地址開始寫入。此外STM32是基于Cortex-M3內核的微控制器,其內部通過一張“中斷向量表”來響應中斷,程序啟動后,將首先從“中斷向量表”取出復位中斷向量執(zhí)行復位中斷程序完成啟動。而這張“中斷向量表”的起始地址是0x8000004,當中斷來臨,STM32的內部硬件機制亦會自動將PC指針定位到“中斷向量表”處,并根據中斷源取出對應的中斷向量執(zhí)行中斷服務程序。 IAP功能設計:帶IAP的功能有兩個程序需要編寫,一個是IAP(及BOOT)工程,一個是APP工程
4、。設計將IAP放在STM32內部FLASH的0x80000000-0x80002000區(qū)域,大小為8K,APP放在0x80002000以后的區(qū)域,內部FALSH具體的大小由具體的芯片決定。IAP部分核心代碼如下:cppview plaincopy1. /*2. /STM32F10xIAPOnlineUpdateTest-IAPPart3. /compiler:KeilUV34. /2012-08-09,Byfriehood5. /*6. 7. #defineAPP_ADDR(0x08002000)/APP地址8. #defineAPP_CRC_ADDR(u32*)(APP_ADDR+28)/A
5、PPCRC校驗碼存放地址,存放在中斷向量表中第七個9. #defineAPP_CRC(u32)(*(u32*)APP_CRC_ADDR)/APPCRC校驗碼10. #defineAPP_LEN(u32)(*(u32*)(APP_ADDR+32)/APP長度,存放在中斷向量表中第八個11. 12. intmain(void)13. 14. void(*AppEntry)(void)=(void(*)(void)0x08002004;/APPmian函數地址15. void(*BootEntry)(void)=(void(*)(void)0x08000004;/BOOTmian函數地址16. u3
6、2crcCode=0;17. /硬件初始化18. HWInit();19. /對APP部分代碼做CRC校驗20. crcCode=GetCRC32(u8*)APP_ADDR,APP_LEN);21. /讀取升級標志,該標志存放在備份寄存器中22. g_bUpdateFlag=BKP_ReadBackupRegister(BKP_DR9);23. if(g_bUpdateFlag)24. 25. /清除升級標志26. BKP_WriteBackupRegister(BKP_DR9,0x00);27. 28. /判斷時候需要做升級處理29. if(crcCode!=APP_CRC|g_bUpdat
7、eFlag)30. 31. /APP校驗失敗或檢測到APP升級時直接進入升級流程32. printf(gotobootmode,begintoupgrade.n);33. /進入升級流程34. UpdateProc();35. /升級完成后跳轉到BOOT,做校驗檢查36. BootEntry0();37. 38. else39. 40. /跳轉到APP執(zhí)行41. printf(gotoappmode.n);42. AppEntry0();43. 44. APP部分核心代碼如下:cppview plaincopy1. /*2. /STM32F10xIAPOnlineUpdateTest-APPP
8、art3. /compiler:KeilUV34. /2012-08-09,Byfriehood5. /*6. intmain(void)7. 8. void(*BootEntry)(void)=(void(*)(void)0x08000004;/BOOTmian函數地址9. /硬件初始化10. HWInit();11. while(1)12. 13. /是否收到升級請求14. if(g_bRevUpdateReq)15. 16. /設置升級標志17. BKP_WriteBackupRegister(BKP_DR9,0x01);18. /跳轉到BOOT執(zhí)行19. BootEntry0();20
9、. 21. Task1();22. Task2();23. /.24. 25. 查看評論11樓Super煙火2014-06-24 15:04發(fā)表回復你好,請問一下,你從app跳轉回IAP的時候用的是軟件復位還是,PC指針的跳轉啊,我現在用的pc指針的跳轉,但是由于app中開了太多中斷,跳回iap后程序就死了。如果你用的是pc指針跳轉的話,你的中斷寄存器是如何復位的。10樓茶亦爽2014-06-11 20:36發(fā)表回復您好,如果沒有備用電池,是不是就不能用備份寄存器?9樓WangSanHuai20102014-04-11 14:11發(fā)表回復個人分析你這個IAP的處理很不可靠,需要改進。幾乎產品上
10、不可能這么用。Re:firehood2014-04-11 23:45發(fā)表回復回復WangSanHuai2010:你覺得哪里不可靠,請指出來。事實上我們公司的產品就用到了此種方案。8樓zmh1692014-01-02 09:19發(fā)表回復正在學習STM32的IAP,原來有點迷惑APP和IAP間如何相互切換,謝謝你提供的思路,現在明白了7樓xiaochengzjc2013-06-14 14:32發(fā)表回復兩個main函數,編譯器不報錯嗎6樓lin3578587712013-04-18 14:05發(fā)表回復想請問下,IAP在線升級。怎么把BOOT與APP合并,第一次就全都燒進去?5樓shenhaipiao
11、liuDE2013-04-11 09:55發(fā)表回復你好!最近在學習和STM32 IAP相關的知識,在網上找了很多的資料發(fā)現他們基本上是采用的硬件觸發(fā)升級的方式!但是我現在想實現是軟件觸發(fā)的方式!就是通過PC端 的軟件給下位機(具有DFU功能)處在APP時發(fā)一個升級信號!讓它跳轉到IAP,我想請問一下這個升級的信號應該發(fā)到下位機的什么位置!我想的是將flash中的一頁用來存放這些和升級相關的標志和校驗碼之類的東西!但是又如何讓上位機控制數據給固定的flash地址呢?不知道是不是我想得太復雜了!問題是有些長,真不好意思!謝謝!Re:firehood2013-04-11 10:12發(fā)表回復回復she
12、nhaipiaoliuDE:1.上位機可以通過串口跟STM32發(fā)送升級指令,當STM32收到升級請求后程序跳轉到IAP部分執(zhí)行。2.APP長度和校驗碼可以放在中斷向量表里,由于中斷向量表的地址是固定的,在代碼中可以直接進行讀取。Re:shenhaipiaoliuDE2013-04-11 12:05發(fā)表回復回復feihu521a:謝謝你的解答!有些想法!去試一試!4樓草根聰2013-02-27 19:48發(fā)表回復你好,在你上次講解后,我成功實現了程序的下載,并且跳轉到了我下載的應用程序中去執(zhí)行,與預期的效果一直。但是現在我遇到了一個問題。我要有一種方式回到我最開始的Bootloader程序吧?當
13、然我可以通過把電源拔掉插上。因為我覺得復位就好了。我使用了以下兩種方式都沒有成功:1、NVIC_SystemReset(); 發(fā)生串口中斷,并且串口接到的數據與協議一直。我調用這個系統復位函數。 (個人覺得由于內存分配修改了,所以在生成bin文件的時候這個系統函數的跳轉位置可能改變),并且通過掉電在插電都不行了。因此我使用了第二種方式2、umpAddress = (*(volatile unsigned int*)0x08000004);Jump_To_Application = (pFunction)JumpAddress;_set_MSP(*(volatile unsigned long
14、int*)0x08000000);Jump_To_Application();強制的跳轉到絕對地址,后面想想也不對,因為現在內存是從0x0800 4000開始的,怎么又能跳轉過去了。后面實驗了一次,的確也不行。但是掉電再上電,仍然可以重新下載。即原來Bootloader程序沒有被破壞。希望你能有空幫我看看,謝謝你3樓pogulu2013-01-30 19:31發(fā)表回復引用“pogulu”的評論:你好,g_bRevUpdateReq 這個變量存儲在哪里?您的博文讓我受益匪淺。對于剛才的問題我想了一下,難道還是存儲在備份數據寄存器嗎?Re:firehood2013-01-30 21:54發(fā)表回復回
15、復pogulu:g_bUpdateFlag 這個變量保存在備份寄存器中,為是否升級標志。APP運行時,當收到外圍主機的升級請求后,即g_bRevUpdateReq標志為TRUE時,將g_bUpdateFlag標志保存在BKP中,然后跳轉到BOOT運行,BOOT執(zhí)行后,從BKP讀出g_bUpdateFlag標志,如果需要升級,則進入到升級流程。大概的過程就是這樣了。2樓pogulu2013-01-30 19:24發(fā)表回復你好,g_bRevUpdateReq 這個變量存儲在哪里?1樓草根聰2013-01-02 11:18發(fā)表回復引用舉報你好,我有一點十分不明白,就是STM32的Bootloader已經實現了這種IAP,為什么一般要自己來實現呢?而不直接使用系統存儲器的啟動來實現呢?Re:firehood2013-01-03 10:39發(fā)表回復引用舉報回復cangencong:STM32的Bootload
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 黑龍江工業(yè)學院《生物醫(yī)學信息與統計學》2023-2024學年第二學期期末試卷
- 陽光學院《流體傳動與控制基礎》2023-2024學年第二學期期末試卷
- 武漢海事職業(yè)學院《單片機原理與應用綜合設計》2023-2024學年第二學期期末試卷
- 大興安嶺職業(yè)學院《企業(yè)電子產品設計與制造》2023-2024學年第二學期期末試卷
- 四川汽車職業(yè)技術學院《科學社會主義概論》2023-2024學年第二學期期末試卷
- 雙頭應急燈項目效益評估報告
- 沈陽音樂學院《內科護理學(2)》2023-2024學年第二學期期末試卷
- 鄭州商貿旅游職業(yè)學院《社會治理》2023-2024學年第二學期期末試卷
- 伊犁師范大學《中職英語微格教學技能訓練》2023-2024學年第二學期期末試卷
- 人教版初中歷史與社會七年級上冊 3.5 干旱的寶地-塔里木盆地 教學設計
- 出版物網絡零售備案表
- 云南省昭通市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細
- 國家留學基金委國外大學邀請函
- QES三體系內審檢查表 含審核記錄
- 信息論與編碼 自學報告
- 二年級乘除法口訣專項練習1000題-推薦
- 貸款項目資金平衡表
- 唯美動畫生日快樂電子相冊視頻動態(tài)PPT模板
- 設計文件簽收表(一)
- 義務教育語文課程標準2022年版
- 公務員入職登記表
評論
0/150
提交評論