0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Reset和Halt After bootloader復(fù)位策略

麥克泰技術(shù) ? 來源:麥克泰技術(shù) ? 2023-04-14 13:04 ? 次閱讀

許多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)用

fbb1a440-da80-11ed-bfe3-dac502259ad0.png

2、使用J-Link Commander連接目標(biāo)板

3、執(zhí)行reset

4、檢查PC==0x0800010E

fbd4d352-da80-11ed-bfe3-dac502259ad0.png

5、修改reset策略為 Reset+Halt

6、執(zhí)行Reset

7、檢查PC==0x08000116

fbf9182a-da80-11ed-bfe3-dac502259ad0.png ? ?

總結(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在代碼移動到的地址處停止。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19286

    瀏覽量

    229872
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17149

    瀏覽量

    351225
  • ROM
    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)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    什么是復(fù)位同步電路 reset synchronizer?

    復(fù)位同步電路 reset synchronizer 其實只在復(fù)位信號 release 的時候派上用場。復(fù)位結(jié)束后,這個電路其實就沒用了。 但這個電路的時鐘還在 switch,這個電路還
    的頭像 發(fā)表于 02-19 09:21 ?1437次閱讀
    什么是<b class='flag-5'>復(fù)位</b>同步電路 <b class='flag-5'>reset</b> synchronizer?

    請問stm8l101p3u為什么進(jìn)入halt之后看門狗不復(fù)位

    在網(wǎng)上查了半天,很多人都是說halt之后不想讓看門狗運行卻停不下來,為什么到了我這我想halt之后看門狗繼續(xù)運行它反而不復(fù)位了呢?? 看門狗的代碼 RST_ClearFlag
    發(fā)表于 05-13 07:01

    CC1310仿真出錯Fatal error:Failed to halt after bootloader 1

    程序編譯沒有問題,當(dāng)點擊仿真調(diào)試的時候有彈窗提示出錯。Fatal error:Failed to halt after bootloader 1Session aborted!求解答!
    發(fā)表于 08-18 07:12

    軟件復(fù)位后保持引腳狀態(tài)為高電平

    after a reset or is there another way to jump to the bootloader without doing the software rese
    發(fā)表于 12-25 15:43

    在啟用IWDG的情況下進(jìn)入暫停模式會導(dǎo)致STM8s003F3P6芯片復(fù)位

    我檢查了選項字節(jié),OPT3字節(jié)為零,因此WDG_HALT位為0,這意味著當(dāng)看門狗使能時,MCU應(yīng)進(jìn)入暫停模式而不會導(dǎo)致復(fù)位。 但是HALT或WFI會產(chǎn)生復(fù)位。我在暫停指令之前刷新看門
    發(fā)表于 06-28 16:11

    使用Reset&amp;Halt After bootloader復(fù)位策略

    and Halt After Bootloader. // mov r0, 8 ldr r0,[r0] nop nop2.2修改Reset策略
    發(fā)表于 05-18 13:55

    HT66Fx0系列MCU的Reset復(fù)位電路應(yīng)用介紹

    HT66Fx0系列MCU的Reset復(fù)位電路應(yīng)用介紹HT66Fx0 系列MCU 的Reset 復(fù)位電路均采用了與I/O 共用的架構(gòu),本文即著重對此系列MCU
    發(fā)表于 03-27 08:38 ?36次下載

    復(fù)位穩(wěn)定放大器:The Reset Stabilized A

    復(fù)位穩(wěn)定放大器:The Reset Stabilized Amplifier The reset stabilized amplifier is a form of chopper-stabilized amplifier a
    發(fā)表于 05-16 16:12 ?1276次閱讀
    <b class='flag-5'>復(fù)位</b>穩(wěn)定放大器:The <b class='flag-5'>Reset</b> Stabilized A

    STM32 Bootloader異常復(fù)位如何解決

    客戶反饋通過PC軟件Flashloader不能夠跟STM32 MCU自帶Bootloader連接。并且系統(tǒng)運行一段時間后異常復(fù)位。
    的頭像 發(fā)表于 03-23 10:26 ?9636次閱讀
    STM32 <b class='flag-5'>Bootloader</b>異常<b class='flag-5'>復(fù)位</b>如何解決

    STM32下載后無法自動復(fù)位,需手動復(fù)位 下載程序時,勾選reset and run后仍不可自動復(fù)位

    項目場景:STM32下載后無法自動復(fù)位,需手動復(fù)位下載程序時,勾選reset and run后仍不可自動復(fù)位問題描述:STM32下載后無法自動復(fù)位
    發(fā)表于 01-17 12:36 ?11次下載
    STM32下載后無法自動<b class='flag-5'>復(fù)位</b>,需手動<b class='flag-5'>復(fù)位</b> 下載程序時,勾選<b class='flag-5'>reset</b> and run后仍不可自動<b class='flag-5'>復(fù)位</b>

    Reset復(fù)位電路的PCB布局布線要求

    Reset復(fù)位電路的PCB布局布線要求 —來源:瑞芯微RK3588 PCB設(shè)計白皮書 Reset復(fù)位電路是一種用來使電路恢復(fù)到起始狀態(tài)的電路設(shè)計,一般簡單的
    的頭像 發(fā)表于 08-03 07:45 ?1136次閱讀
    <b class='flag-5'>Reset</b><b class='flag-5'>復(fù)位</b>電路的PCB布局布線要求

    STM32 Bootloader異常復(fù)位案例

    電子發(fā)燒友網(wǎng)站提供《STM32 Bootloader異常復(fù)位案例.pdf》資料免費下載
    發(fā)表于 09-25 09:17 ?3次下載
    STM32 <b class='flag-5'>Bootloader</b>異常<b class='flag-5'>復(fù)位</b>案例

    Linux reset子系統(tǒng)有什么功能

    的分級關(guān)系,需要弄清楚時鐘樹里每個時鐘的關(guān)系。 而reset驅(qū)動有點相當(dāng)于clock驅(qū)動的門控,它只有復(fù)位和解復(fù)位兩個功能。 類似于clock子系統(tǒng),reset子系統(tǒng)也分為了 cons
    的頭像 發(fā)表于 09-27 14:06 ?768次閱讀
    Linux <b class='flag-5'>reset</b>子系統(tǒng)有什么功能

    Linux的reset復(fù)位API說明

    入的reset資源進(jìn)行解復(fù)位操作 參數(shù) : rstc:指向申請reset資源的設(shè)備句柄 返回 : 成功:返回0 失?。悍祷劐e誤碼 reset_control_assert int re
    的頭像 發(fā)表于 09-27 14:14 ?1182次閱讀

    reset API使用示例步驟

    時鐘和復(fù)位是兩個不同的驅(qū)動,但通常都是由負(fù)責(zé)clock驅(qū)動的人,把reset驅(qū)動完成。同樣,reset驅(qū)動也是由芯片廠商去完成的。 reset API使用示例 基本步驟: 1、調(diào)用
    的頭像 發(fā)表于 09-27 14:17 ?1132次閱讀