許多MCU配置了一個獨立的啟動ROM,包含處理器復位并跳轉到用戶應用程序之前執行的代碼。啟動ROM的工作包含設置時鐘,啟用調試接口,根據不同的引導源初始化外圍設備等等…當然,不同MCU的啟動ROM行為并不相同。實際上,啟動ROM的行為在同一設備的兩個硬件版本之間也會有變化。
問題
調試體系架構沒有規定如何設計啟動ROM或其行為,因此在啟動ROM執行之后,無法為MCU實現一種通用的復位方法,讓其暫停在用戶應用程序的第一條指令上。處理器需要一個特定的復位程序,它可以處理設備特定的啟動ROM場景,如沒有有效的映像,映像位于QSPI中,通過SD卡啟動等等…實現這種特定于設備的復位非常具有挑戰性,甚至是不可能的,而且非常耗時,因為現代MCU通常有多種啟動路徑。此外,由于某些原因,供應商通常不會記錄啟動ROM的行為。
解決方式
如果J-Link不支持使用設備或引導源的引導加載程序后的Reset&halt,則可以通過兩個步驟輕松啟用正確的復位:
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策略
復位策略需要設置為12。
如何改變J-Link使用的復位策略取決于所使用的環境。復位策略可以通過所使用環境設置配置,也可以通過J-Link命令字符串配置。如J-Link Commander,允許通過本機命令直接將J-Link命令字符串傳遞給J-Link DLL。如果這兩個方式都不可用,使用通用方法。
2.2.1 J-Link Commander
啟動J-Link Commander后,可以通過執行RSetType命令改變復位策略為
RSetType = 12
2.2.2 通用方法
如果使用的IDE 或應用沒有提供選項配置使用的reset類型,也不能將J-Link命令字符串傳遞給J-Link DLL,我們建議使用J-Link腳本文件API函數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下載應用
2、使用J-Link Commander連接目標板
3、執行reset
4、檢查PC==0x0800010E
5、修改reset策略為 Reset+Halt
6、執行Reset
7、檢查PC==0x08000116
? ?
總結
正常復位后,MCU停在復位向量(Reset_Handler / 0x0800010E)處。
通過執行Reset&halt after bootloader復位策略后,MCU停在啟動代碼(0x08000116)處。
這確認了reset的行為與預期一致。
為了模擬引導加載程序,可以將修改的代碼從啟動代碼移動到用戶應用程序中的其它地方。執行reset應該顯示CPU在代碼移動到的地址處停止。
審核編輯:湯梓紅
-
處理器
+關注
關注
68文章
19259瀏覽量
229652 -
mcu
+關注
關注
146文章
17123瀏覽量
350992 -
ROM
+關注
關注
4文章
563瀏覽量
85732 -
reset
+關注
關注
0文章
34瀏覽量
12877 -
bootloader
+關注
關注
2文章
235瀏覽量
45612
原文標題:使用Reset&Halt After bootloader復位策略
文章出處:【微信號:麥克泰技術,微信公眾號:麥克泰技術】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論