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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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)品中的程序固件進行更新升級,而無需通過傳統(tǒng)的JTAG方式做燒錄更新。IAP功能的固件一般包含兩個部分:Boot和UserApp。其中Boot部分必須通過JATG或ISP進行燒錄,APP部分可以在燒錄 BOOT后通過IAP升級燒入或者與 BOOT合并到一起后通過 JATG或I

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

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

4、是IAP(及BOOT工程,一個是APP工程。設(shè)計將 IAP 放在 STM3勸部 FLASH勺 0x800000000x80002000 區(qū)域,大小為 8K,APP放在 0x80002000 以后的區(qū)域,內(nèi)部 FALSH具體的大小由具體的芯片決定。IAP部分核心代碼如下:cpp view pla in copy1 /*2. / STM32F10x IAP OnlineUpdate Test-IAP Part3. / compiler: Keil UV34. / 2012-08-09 , By friehood5./*6.7.#define APP_ADDR(0x08002000)/ APP地址8

5、.#define APP_CRC_ADDR(u32 *)(APP_ADDR+28)/ APP CRC放地址,存放在中斷向量表中第七個校驗碼存9.#define APP_CRC(u32)(*(u32 *)APP_CRC_ADDR) / APP CRC校驗碼10.#define APP_LEN(u32)(*(u32 *)(APP_ADDR+32) / APP斷向量表中第八個長度,存放在中11.12.int main( void )13.14.void (*AppEntry)(void ) = ( void (*)( void )0x08002004;/ APP mian函數(shù)地址15.void (*

6、BootEntry)(void ) = ( void (*)( void )0x08000004;/ BOOT mian函數(shù)地址16.u32 crcCode = 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_WriteBackupRegiste

7、r(BKP_DR9,0x00);27.28./判斷時候需要做升級處理29.if (crcCode != APP_CRC | g_bUpdateFlag)30.31./ APP校驗失敗或檢測到APP升級時直接進入升級流程32.printf("go to boot mode,begin to upgrade.n");33./進入升級流程34.UpdateProc();35./升級完成后跳轉(zhuǎn)到 BOOT,做校驗檢查36.BootEntry0();37.38.else39.40./跳轉(zhuǎn)到APP執(zhí)行41.printf("goto app mode.n");42.A

8、ppEntry0();43. 44. APP部分核心代碼如下:cpp view pla in copy1./*2.23.24.查看評論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ù)位的。*2. / STM32F10x IAP OnlineUpdate Test-APP Part

9、3. / compiler: Keil UV34. / 2012-08-09 , By friehood5. *6. int main( void )7. 8. void (*BootEntry)( void ) = ( void (*)( void )0x08000004;/ BOOT mian 函數(shù)地址9. /硬件初始化HWInit();while (1)/是否收到升級請求if (g_bRevUpdateReq)/設(shè)置升級標志BKP_WriteBackupRegister(BKP_DR9,0x01);/ 跳轉(zhuǎn)到BOOT執(zhí)行BootEntry0();Task1();Task2();/. 25

10、. 10樓 茶亦爽2014-06-11 20:36 發(fā)表回復(fù)您好,如果沒有備用電池,是不是就不能用備份寄存器?9 樓 WangSanHuai2010 2014-04-11 14:11 發(fā)表回復(fù)個人分析你這個IAP的處理很不可靠,需要改進。 幾乎產(chǎn)品上不可能這么用。Re: firehood 2014-04-11 23:45 發(fā)表回復(fù)回復(fù)WangSanHuai2010 :你覺得哪里不可靠,請指出來 事實上我們公司的產(chǎn)品就用到了此種方案。8 樓 zmh169 2014-01-02 09:19 發(fā)表回復(fù)正在學(xué)習(xí)STM32的IAP,原來有點迷惑 APP和IAP間如何相互切換,謝謝你提供的思路,現(xiàn) 在明白

11、了7 樓 xiaochengzjc 2013-06-14 14:32 發(fā)表回復(fù)兩個main函數(shù),編譯器不報錯嗎6 樓 Iin3578587712013-04-18 14:05 發(fā)表回復(fù)S想請問下,IAP在線升級。怎么把 BOOT與APP合并,第一次就全都燒進去?5 樓 shenhaipiaoliuDE 2013-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,1我想請問一下這

12、個升級的信號應(yīng)該發(fā)到下位機的什么位置!2我想的是將flash中的一頁用來存放這些和升級相關(guān)的標志和校驗碼之類的東西! 但是又如何讓上位機控制數(shù)據(jù)給固定的flash地址呢?不知道是不是我想得太復(fù)雜了!問題是有些長,真不好意思!謝謝!Re: firehood 2013-04-11 10:12 發(fā)表回復(fù)回復(fù)shenhaipiaoliuDE : 1.上位機可以通過串口跟 STM32發(fā)送升級指令,當 STM32收到升 級請求后程序跳轉(zhuǎn)到IAP部分執(zhí)行。2.APP長度和校驗碼可以放在中斷向量表里,由于中斷向量表的地址是固定的,在代碼中可 以直接進行讀取。Re: shenhaipiaoliuDE 2013-

13、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程序吧?當然我可以通過把電源拔掉插上。因為我覺得復(fù)位就好了。我使用了以下兩種方式都 沒有成功:1、 NVIC_SystemReset();發(fā)生串口中斷,并且串口接到的數(shù)據(jù)與協(xié)議一直。我調(diào)用這個系統(tǒng)復(fù)位函數(shù)。(個人覺得由于內(nèi)存分配修改了,所以在生成bin文件的時候這個系統(tǒng)函數(shù)的跳

14、轉(zhuǎn)位置可能改變),并且通過掉電在插電都不行了。因此我使用了第二種方式2、umpAddress = (*(volatile unsigned int*)0x08000004);Jump_To_Application = (pFunction)JumpAddress;_set_MSP(*(volatile unsigned long int*)0x08000000);Jump_To_Application();強制的跳轉(zhuǎn)到絕對地址,后面想想也不對,因為現(xiàn)在內(nèi)存是從0x0800 4000開始的,怎么又能跳轉(zhuǎn)過去了。后面實驗了一次,的確也不行。但是掉電再上電,仍然可以重新下載。即原來 Bootload

15、er程序沒有被破壞。希望你能有空幫我看看,謝謝你3 樓 pogulu 2013-01-30 19:31 發(fā)表回復(fù)引用“pogulu的評論:你好,g_bRevUpdateReq 這個變量存儲在哪里?您的博文讓我受益匪淺。,對于剛才的問題我想了一下,難道還是存儲在備份數(shù)據(jù)寄存器嗎?Re: firehood 2013-01-30 21:54 發(fā)表回復(fù)回復(fù)pogulu : g_bUpdateFlag 這個變量保存在備份寄存器中,為是否升級標志。APP運行時,當收到外圍主機的升級請求后,即g_bRevUpdateReq 標志為TRUE時,將g_bUpdateFlag 標志保存在BKP中,然后跳轉(zhuǎn)到 BO

16、OT運行,BOOT執(zhí)行后,從BKP讀出 g_bUpdateFlag標志,如果需要升級,則進入到升級流程。大概的過程就是這樣了。2 樓 pogulu 2013-01-30 19:24 發(fā)表回復(fù)你好,g_bRevUpdateReq這個變量存儲在哪里?1樓草根聰2013-01-02 11:18發(fā)表回復(fù)引用舉報5你好,我有一點十分不明白,就是 STM32的Bootloader已經(jīng)實現(xiàn)了這種IAP,為什么一般要 自己來實現(xiàn)呢?而不直接使用系統(tǒng)存儲器的啟動來實現(xiàn)呢?Re: firehood 2013-01-03 10:39 發(fā)表回復(fù)引用舉報flLI回復(fù)cangencong :STM32的Bootloader

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論