??對于STM32用戶,經(jīng)常會涉及到通過用戶啟動程序?qū)崿F(xiàn)對用戶應(yīng)用程序的更新升級。一般來講,用戶啟動程序主要用來跟外界通信,獲取新的用戶程序代碼并實現(xiàn)對用戶代碼區(qū)的應(yīng)用程序升級。用戶應(yīng)用程序是指實現(xiàn)各種用戶功能的代碼。在這個過程中,往往需要做從用戶引導(dǎo)程序區(qū)到用戶應(yīng)用程序區(qū)的跳轉(zhuǎn),有時可能還需實現(xiàn)從用戶應(yīng)用程序區(qū)跳回到用戶啟動程序區(qū),或者不同用戶程序區(qū)的互相跳轉(zhuǎn)等操作。在這些跳轉(zhuǎn)過程中,往往有人在此遇到阻礙,破費周折,尤其是在使用基于cortex M0內(nèi)核的STM32F0做IAP應(yīng)用時,這個過程跟其它基于CORTEX M3/M4/M7內(nèi)核的STM32系列相比,操作上不太一樣,實現(xiàn)起來稍微復(fù)雜些。
這里就STM32F0芯片內(nèi)不同程序區(qū)的跳轉(zhuǎn)問題做些交流與介紹,限于篇幅,僅直接介紹具體操作和注意事項,不做過多拓展。相關(guān)知識點可閱讀STM32芯片參考手冊、STM32相關(guān)ARM內(nèi)核編程手冊。
?下面介紹中提及的集成編譯環(huán)境是指ARM MDK,硬件基于STM32F072RB Nucleo開發(fā)板。后面我將逐一介紹從BOOT區(qū)【用戶啟動程序區(qū)】跳轉(zhuǎn)到APP區(qū)【用戶應(yīng)用程序區(qū)】,從APP區(qū)跳轉(zhuǎn)到另外新APP區(qū)以及從APP區(qū)跳回BOOT區(qū)的基本流程及注意事項。
一般來講,不同區(qū)段的執(zhí)行代碼我們通過建立不同的工程項目來實現(xiàn),最終將不同區(qū)段執(zhí)行代碼寫入芯片。這里假定用戶BOOT區(qū)對應(yīng)的內(nèi)部FLASH地址段為0x8000000—0x8004000, 用戶APP1區(qū)對應(yīng)的內(nèi)部FLASH地址段為0x8004000—0x8008000, APP2區(qū)對應(yīng)的內(nèi)部FLASH地址段為0x8008000—0x800C000.
一、從用戶啟動程序區(qū)【BOOT區(qū)】到用戶應(yīng)用程序區(qū)【APP區(qū)】的跳轉(zhuǎn)
先說從BOOT區(qū)跳轉(zhuǎn)到APP區(qū)。跳轉(zhuǎn)代碼比較簡潔、簡單,注意跳轉(zhuǎn)前要關(guān)閉剛才程序區(qū)開啟過的所有中斷使能,保證所有中斷請求位都被清除,不要只是簡單的關(guān)閉總中斷,否則往往隱患多多。BOOT區(qū)相關(guān)跳轉(zhuǎn)代碼如下:
這個從BOOT區(qū)到APP區(qū)的跳轉(zhuǎn)最終能否成功,關(guān)鍵取決于APP區(qū)代碼相關(guān)配置及準備工作。假設(shè)這里的APP區(qū)是上面提到的APP1區(qū),內(nèi)部FLASH地址段為0x8004000—0x8008000,那么在MDK的option項里的memory配置板塊要做正確配置,即flash空間與ram空間的配置,如下圖所示:
IROM1的配置就是APP1代碼擺放的起始空間地址及長度。IRAM的配置要注意先保留48個字的空間用來存放中斷矢量表的內(nèi)容。因為stm32F0芯片的中斷矢量表的大小就是48個字【即0xc0字節(jié)】。至于剩下的內(nèi)部RAM空間大小由芯片本身的RAM容量決定?!具@里是基于STM32F072RB芯片,其內(nèi)部RAM總?cè)萘繛?x4000】。
另外一件很重要的事情就是做中斷矢量表的拷貝。在APP1區(qū)的main()程序開頭部分,將放在flash程序空間起始部分的連續(xù)48個中斷矢量地址表拷貝到內(nèi)部RAM的起始地址段。即將矢量表從0x8004000地址開始拷到0x20000000開始的連續(xù)48個字空間。
基于MDK環(huán)境的相關(guān)參考代碼如下:
上面代碼中綠色語句就是實現(xiàn)中斷矢量表從內(nèi)部flash到內(nèi)部RAM的拷貝,而紅色語句則是為了實現(xiàn)程序0地址執(zhí)行域的重映射,即將程序運行的0地址從內(nèi)部flash的0x8000000通過重映射機制切換到0x20000000,為的是在APP1區(qū)發(fā)生中斷時CPU能從正確的地方準確獲取相應(yīng)中斷矢量地址去執(zhí)行中斷服務(wù)程序。
到此,從BOOT區(qū)到APP1區(qū)的跳轉(zhuǎn)就算完成了。
二、從一用戶應(yīng)用程序區(qū)【APP區(qū)】到另一用戶應(yīng)用程序區(qū)【APP區(qū)】的跳轉(zhuǎn)
那么,如果想從APP1區(qū)跳轉(zhuǎn)到另外APP2代碼區(qū)呢?這個跟從BOOT區(qū)跳轉(zhuǎn)到APP1區(qū)類似。在APP1區(qū)的跳轉(zhuǎn)代碼這里就不說了,地址給對、代碼寫對就好。APP2區(qū)的代碼也同樣必須做中斷矢量表的拷貝和0地址域的重映射。這里因為在APP1代碼里已經(jīng)做過了0地址的重映射,所以就不必重復(fù)做重映射了,只需做拷貝操作,即將從0x8008000開始的48個字拷貝進0x20000000開始的RAM空間。
假定APP2代碼區(qū)的內(nèi)部flash空間安排在為0x8008000—0x800C000。MDK環(huán)境里memory布局配置如下:
三、從用戶應(yīng)用程序區(qū)【APP區(qū)】到用戶啟動程序區(qū)【BOOT區(qū)】的跳轉(zhuǎn)
有時我們還希望或需要程序能從APP區(qū)跳回用戶BOOT區(qū),那如何操作呢?對于STM32F0芯片而言,程序執(zhí)行區(qū)從APP區(qū)跳回BOOT區(qū)跟從BOOT區(qū)跳到APP區(qū)還不太一樣,經(jīng)常有人在這個跳轉(zhuǎn)過程中卡殼。
假設(shè)從APP2區(qū)跳回BOOT區(qū),在APP2區(qū)做跳轉(zhuǎn)準備時除了給定正確的跳轉(zhuǎn)地址外,另一個要做的就是再次通過重映射操作將0地址映射空間從內(nèi)部SRAM切換回內(nèi)部flash區(qū)。實際應(yīng)用中,往往因為忽視了這點,跳回去后一碰到中斷就問題來了。另外,從APP區(qū)跳回BOOT區(qū)無須矢量表的拷貝操作。所以在APP2區(qū)執(zhí)行跳轉(zhuǎn)前只需將0地址重映射回內(nèi)部flash空間,通過運行如下庫代碼完成:__HAL_SYSCFG_REMAPMEMORY_FLASH();
小結(jié):
1、從BOOT區(qū)跳轉(zhuǎn)到APP區(qū),在APP區(qū)要做中斷矢量表的拷貝和將0地址映射空間從內(nèi)部flash切換到內(nèi)部SRAM起始地址。
2、從APP區(qū)跳轉(zhuǎn)到其它新的APP區(qū),需在新的APP區(qū)的代碼里再做中斷矢量表的拷貝,并保證相關(guān)存儲配置的正確。
3、從APP區(qū)跳回BOOT區(qū),該過程無矢量表的拷貝,只需將0地址映射空間重新映射回內(nèi)部flash區(qū)。
4、不論從什么區(qū)跳往什么區(qū),跳轉(zhuǎn)前禁用當前用戶打開過的所有中斷使能、并確保無未處理的中斷請求存在。
5、以上操作流程主要針對基于ARM Cortex M0內(nèi)核的STM32F0系列芯片。
-
芯片
+關(guān)注
關(guān)注
450文章
49631瀏覽量
417126 -
RAM
+關(guān)注
關(guān)注
8文章
1344瀏覽量
114214 -
STM32F0
+關(guān)注
關(guān)注
0文章
61瀏覽量
17042
原文標題:STM32F0 IAP應(yīng)用中不同代碼區(qū)的跳轉(zhuǎn)話題
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論