STM32IAP在線燒寫_第1頁
STM32IAP在線燒寫_第2頁
STM32IAP在線燒寫_第3頁
STM32IAP在線燒寫_第4頁
STM32IAP在線燒寫_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、STM32 IAP在線升級 STM32很強大的一個功能是支持IAP在線升級,IAP(In-Application Programming),即在“應(yīng)用程序中編程,通俗的來將是程序自己可以往程序存儲器里寫數(shù)據(jù)或修改程序。有了IAP功能,即使在產(chǎn)品發(fā)布之后也可以方便的通過預(yù)留的通信端口(如串口、USB、IIC等)對產(chǎn)品中的程序固件進(jìn)行更新升級,而無需通過傳統(tǒng)的JTAG方式做燒錄更新。IAP功能的固件一般包含兩個部分:Boot和UserApp。其中Boot部分必須通過JATG或ISP進(jìn)行燒錄,APP部分可以在燒錄BOOT后通過IAP升級燒入或者與BOOT合并到一起后通過JATG或ISP進(jìn)行燒錄。 M

2、CU上電后,首先運行BOOT,BOOT起來后,做如下操作: 1.對APP部分做校驗,如果校驗失敗,認(rèn)為APP出現(xiàn)異常,自動切換到升級流程(流程3),反之,跳轉(zhuǎn)到APP執(zhí)行(流程4); 2.檢查升級標(biāo)志,看是否需要升級,如果需要升級,進(jìn)入升級流程(流程3),反之,跳轉(zhuǎn)到APP執(zhí)行(流程4); 3.執(zhí)行升級流程,升級完成后重置升級標(biāo)志并軟件復(fù)位; 4.跳轉(zhuǎn)到APP執(zhí)行,APP在需要升級時,寫入升級標(biāo)志并軟件復(fù)位。需要注意的是:如果BOOT程序被破壞,產(chǎn)品就只能通過JATG或ISP進(jìn)行燒錄了,這一點是不能容忍的,解決的方法是我們可以對BOOT區(qū)域設(shè)置成寫保護(hù)。以禁止對BOOT區(qū)域進(jìn)行編程或擦除操作。

3、在實現(xiàn)IAP之前,先了解一下STM32的存儲器架構(gòu)和啟動過程:STM32的內(nèi)部閃存地址起始于0x8000000,一般情況下,程序文件就從此地址開始寫入。此外STM32是基于Cortex-M3內(nèi)核的微控制器,其內(nèi)部通過一張“中斷向量表”來響應(yīng)中斷,程序啟動后,將首先從“中斷向量表”取出復(fù)位中斷向量執(zhí)行復(fù)位中斷程序完成啟動。而這張“中斷向量表”的起始地址是0x8000004,當(dāng)中斷來臨,STM32的內(nèi)部硬件機制亦會自動將PC指針定位到“中斷向量表”處,并根據(jù)中斷源取出對應(yīng)的中斷向量執(zhí)行中斷服務(wù)程序。 IAP功能設(shè)計:帶IAP的功能有兩個程序需要編寫,一個是IAP(及BOOT)工程,一個是APP工程

4、。設(shè)計將IAP放在STM32內(nèi)部FLASH的0x80000000-0x80002000區(qū)域,大小為8K,APP放在0x80002000以后的區(qū)域,內(nèi)部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函數(shù)地址15. void(*BootEntry)(void)=(void(*)(void)0x08000004;/BOOTmian函數(shù)地址16. u3

6、2crcCode=0;17. /硬件初始化18. HWInit();19. /對APP部分代碼做CRC校驗20. crcCode=GetCRC32(u8*)APP_ADDR,APP_LEN);21. /讀取升級標(biāo)志,該標(biāo)志存放在備份寄存器中22. g_bUpdateFlag=BKP_ReadBackupRegister(BKP_DR9);23. if(g_bUpdateFlag)24. 25. /清除升級標(biāo)志26. BKP_WriteBackupRegister(BKP_DR9,0x00);27. 28. /判斷時候需要做升級處理29. if(crcCode!=APP_CRC|g_bUpdat

7、eFlag)30. 31. /APP校驗失敗或檢測到APP升級時直接進(jìn)入升級流程32. printf(gotobootmode,begintoupgrade.n);33. /進(jìn)入升級流程34. UpdateProc();35. /升級完成后跳轉(zhuǎn)到BOOT,做校驗檢查36. BootEntry0();37. 38. else39. 40. /跳轉(zhuǎn)到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函數(shù)地址9. /硬件初始化10. HWInit();11. while(1)12. 13. /是否收到升級請求14. if(g_bRevUpdateReq)15. 16. /設(shè)置升級標(biāo)志17. BKP_WriteBackupRegister(BKP_DR9,0x01);18. /跳轉(zhuǎn)到BOOT執(zhí)行19. BootEntry0();20

9、. 21. Task1();22. Task2();23. /.24. 25. 查看評論11樓Super煙火2014-06-24 15:04發(fā)表回復(fù)你好,請問一下,你從app跳轉(zhuǎn)回IAP的時候用的是軟件復(fù)位還是,PC指針的跳轉(zhuǎn)啊,我現(xiàn)在用的pc指針的跳轉(zhuǎn),但是由于app中開了太多中斷,跳回iap后程序就死了。如果你用的是pc指針跳轉(zhuǎn)的話,你的中斷寄存器是如何復(fù)位的。10樓茶亦爽2014-06-11 20:36發(fā)表回復(fù)您好,如果沒有備用電池,是不是就不能用備份寄存器?9樓WangSanHuai20102014-04-11 14:11發(fā)表回復(fù)個人分析你這個IAP的處理很不可靠,需要改進(jìn)。幾乎產(chǎn)品上

10、不可能這么用。Re:firehood2014-04-11 23:45發(fā)表回復(fù)回復(fù)WangSanHuai2010:你覺得哪里不可靠,請指出來。事實上我們公司的產(chǎn)品就用到了此種方案。8樓zmh1692014-01-02 09:19發(fā)表回復(fù)正在學(xué)習(xí)STM32的IAP,原來有點迷惑APP和IAP間如何相互切換,謝謝你提供的思路,現(xiàn)在明白了7樓xiaochengzjc2013-06-14 14:32發(fā)表回復(fù)兩個main函數(shù),編譯器不報錯嗎6樓lin3578587712013-04-18 14:05發(fā)表回復(fù)想請問下,IAP在線升級。怎么把BOOT與APP合并,第一次就全都燒進(jìn)去?5樓shenhaipiao

11、liuDE2013-04-11 09:55發(fā)表回復(fù)你好!最近在學(xué)習(xí)和STM32 IAP相關(guān)的知識,在網(wǎng)上找了很多的資料發(fā)現(xiàn)他們基本上是采用的硬件觸發(fā)升級的方式!但是我現(xiàn)在想實現(xiàn)是軟件觸發(fā)的方式!就是通過PC端 的軟件給下位機(具有DFU功能)處在APP時發(fā)一個升級信號!讓它跳轉(zhuǎn)到IAP,我想請問一下這個升級的信號應(yīng)該發(fā)到下位機的什么位置!我想的是將flash中的一頁用來存放這些和升級相關(guān)的標(biāo)志和校驗碼之類的東西!但是又如何讓上位機控制數(shù)據(jù)給固定的flash地址呢?不知道是不是我想得太復(fù)雜了!問題是有些長,真不好意思!謝謝!Re:firehood2013-04-11 10:12發(fā)表回復(fù)回復(fù)she

12、nhaipiaoliuDE:1.上位機可以通過串口跟STM32發(fā)送升級指令,當(dāng)STM32收到升級請求后程序跳轉(zhuǎn)到IAP部分執(zhí)行。2.APP長度和校驗碼可以放在中斷向量表里,由于中斷向量表的地址是固定的,在代碼中可以直接進(jìn)行讀取。Re:shenhaipiaoliuDE2013-04-11 12:05發(fā)表回復(fù)回復(fù)feihu521a:謝謝你的解答!有些想法!去試一試!4樓草根聰2013-02-27 19:48發(fā)表回復(fù)你好,在你上次講解后,我成功實現(xiàn)了程序的下載,并且跳轉(zhuǎn)到了我下載的應(yīng)用程序中去執(zhí)行,與預(yù)期的效果一直。但是現(xiàn)在我遇到了一個問題。我要有一種方式回到我最開始的Bootloader程序吧?當(dāng)

13、然我可以通過把電源拔掉插上。因為我覺得復(fù)位就好了。我使用了以下兩種方式都沒有成功:1、NVIC_SystemReset(); 發(fā)生串口中斷,并且串口接到的數(shù)據(jù)與協(xié)議一直。我調(diào)用這個系統(tǒng)復(fù)位函數(shù)。 (個人覺得由于內(nèi)存分配修改了,所以在生成bin文件的時候這個系統(tǒng)函數(shù)的跳轉(zhuǎn)位置可能改變),并且通過掉電在插電都不行了。因此我使用了第二種方式2、umpAddress = (*(volatile unsigned int*)0x08000004);Jump_To_Application = (pFunction)JumpAddress;_set_MSP(*(volatile unsigned long

14、int*)0x08000000);Jump_To_Application();強制的跳轉(zhuǎn)到絕對地址,后面想想也不對,因為現(xiàn)在內(nèi)存是從0x0800 4000開始的,怎么又能跳轉(zhuǎn)過去了。后面實驗了一次,的確也不行。但是掉電再上電,仍然可以重新下載。即原來Bootloader程序沒有被破壞。希望你能有空幫我看看,謝謝你3樓pogulu2013-01-30 19:31發(fā)表回復(fù)引用“pogulu”的評論:你好,g_bRevUpdateReq 這個變量存儲在哪里?您的博文讓我受益匪淺。對于剛才的問題我想了一下,難道還是存儲在備份數(shù)據(jù)寄存器嗎?Re:firehood2013-01-30 21:54發(fā)表回復(fù)回

15、復(fù)pogulu:g_bUpdateFlag 這個變量保存在備份寄存器中,為是否升級標(biāo)志。APP運行時,當(dāng)收到外圍主機的升級請求后,即g_bRevUpdateReq標(biāo)志為TRUE時,將g_bUpdateFlag標(biāo)志保存在BKP中,然后跳轉(zhuǎn)到BOOT運行,BOOT執(zhí)行后,從BKP讀出g_bUpdateFlag標(biāo)志,如果需要升級,則進(jìn)入到升級流程。大概的過程就是這樣了。2樓pogulu2013-01-30 19:24發(fā)表回復(fù)你好,g_bRevUpdateReq 這個變量存儲在哪里?1樓草根聰2013-01-02 11:18發(fā)表回復(fù)引用舉報你好,我有一點十分不明白,就是STM32的Bootloader已經(jīng)實現(xiàn)了這種IAP,為什么一般要自己來實現(xiàn)呢?而不直接使用系統(tǒng)存儲器的啟動來實現(xiàn)呢?Re:firehood2013-01-03 10:39發(fā)表回復(fù)引用舉報回復(fù)cangencong:STM32的Bootload

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論