許多MCU配置了一個獨立的啟動ROM,包含處理器復(fù)位并跳轉(zhuǎn)到用戶應(yīng)用程序之前執(zhí)行的代碼。啟動ROM的工作包含設(shè)置時鐘,啟用調(diào)試接口,根據(jù)不同的引導(dǎo)源初始化外圍設(shè)備等等…當(dāng)然,不同MCU的啟動ROM行為并不相同。實際上,啟動ROM的行為在同一設(shè)備的兩個硬件版本之間也會有變化。
問題
調(diào)試體系架構(gòu)沒有規(guī)定如何設(shè)計啟動ROM或其行為,因此在啟動ROM執(zhí)行之后,無法為MCU實現(xiàn)一種通用的復(fù)位方法,讓其暫停在用戶應(yīng)用程序的第一條指令上。處理器需要一個特定的復(fù)位程序,它可以處理設(shè)備特定的啟動ROM場景,如沒有有效的映像,映像位于QSPI中,通過SD卡啟動等等…實現(xiàn)這種特定于設(shè)備的復(fù)位非常具有挑戰(zhàn)性,甚至是不可能的,而且非常耗時,因為現(xiàn)代MCU通常有多種啟動路徑。此外,由于某些原因,供應(yīng)商通常不會記錄啟動ROM的行為。
解決方式
如果J-Link不支持使用設(shè)備或引導(dǎo)源的引導(dǎo)加載程序后的Reset&halt,則可以通過兩個步驟輕松啟用正確的復(fù)位:
2.1 修改啟動代碼
在startup代碼中添加下列指令:
// // Perform a dummy read access from address 0x00000008 followed by two nop's // This is needed to support the reset strategy: Reset and Halt After Bootloader. // mov r0, 8 ldr r0,[r0] nop nop
2.2 修改Reset策略
復(fù)位策略需要設(shè)置為12。
如何改變J-Link使用的復(fù)位策略取決于所使用的環(huán)境。復(fù)位策略可以通過所使用環(huán)境設(shè)置配置,也可以通過J-Link命令字符串配置。如J-Link Commander,允許通過本機命令直接將J-Link命令字符串傳遞給J-Link DLL。如果這兩個方式都不可用,使用通用方法。
2.2.1 J-Link Commander
啟動J-Link Commander后,可以通過執(zhí)行RSetType命令改變復(fù)位策略為
RSetType = 12
2.2.2 通用方法
如果使用的IDE 或應(yīng)用沒有提供選項配置使用的reset類型,也不能將J-Link命令字符串傳遞給J-Link DLL,我們建議使用J-Link腳本文件API函數(shù)JLINK_ExecCommand(“”)將它們包含到J-Link腳本文件中。
下面是一個J-Link腳本文件的示例,該文件通過JLINK_ExecCommand(…)傳遞J-Link命令字符串SetResetType到J-Link DLL。
/********************************************************************* * * ConfigTargetSettings * * Function description * Called before InitTarget(). Mainly used to set some global DLL variables to customize the * normal connect procedure. For ARM CoreSight devices this may be specifying the base * address of some CoreSight components (ETM, …) that cannot be auto-detected by J-Link * due to erroneous ROM tables etc. May also be used to specify the device name in case * debugger does not pass it to the DLL. * * Notes * (1) May not, under absolutely NO circumstances, call any API functions that perform target communication. * (2) Should only set some global DLL variables * * Return value * >= 0 O.K. * < 0 ?Error * ? ? ?-1 ?Unspecified error */ int ConfigTargetSettings(void) { ?// ?// Set reset strategy used by the J-Link to Reset + Halt After Bootloader Using Watchpoint. ?// ?JLINK_SYS_Report("-- Configure Reset Strategy --"); ?JLINK_ExecCommand("SetResetType = 12"); ?return 0; }
操作示例
基于SEGGER Cortex-M Trace參考板的SEGGER Embedded Studio工程示例項目,可以訪問:https://wiki.segger.com/File:SEGGER_Cortex-M_Trace_Reference_Board_Blinky_ES_V550b.zip
該項目可以很容易地移植到其它基于Cortex-M的MCU。
3.1 使用J-Link Commander測試&驗證
1、使用SES下載應(yīng)用
2、使用J-Link Commander連接目標(biāo)板
3、執(zhí)行reset
4、檢查PC==0x0800010E
5、修改reset策略為 Reset+Halt
6、執(zhí)行Reset
7、檢查PC==0x08000116
? ?
總結(jié)
正常復(fù)位后,MCU停在復(fù)位向量(Reset_Handler / 0x0800010E)處。
通過執(zhí)行Reset&halt after bootloader復(fù)位策略后,MCU停在啟動代碼(0x08000116)處。
這確認(rèn)了reset的行為與預(yù)期一致。
為了模擬引導(dǎo)加載程序,可以將修改的代碼從啟動代碼移動到用戶應(yīng)用程序中的其它地方。執(zhí)行reset應(yīng)該顯示CPU在代碼移動到的地址處停止。
審核編輯:湯梓紅
-
處理器
+關(guān)注
關(guān)注
68文章
19286瀏覽量
229872 -
mcu
+關(guān)注
關(guān)注
146文章
17149瀏覽量
351225 -
ROM
+關(guān)注
關(guān)注
4文章
572瀏覽量
85773 -
reset
+關(guān)注
關(guān)注
0文章
34瀏覽量
12885 -
bootloader
+關(guān)注
關(guān)注
2文章
235瀏覽量
45630
原文標(biāo)題:使用Reset&Halt After bootloader復(fù)位策略
文章出處:【微信號:麥克泰技術(shù),微信公眾號:麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論