成人免费无码不卡毛片,亚洲AⅤ无码精品一区二区三区,国产尤物精品视频,久久精品日本亚洲,欧美成人一区三区无码乱码A片,中文字日产幕码一区二区色哟哟,亞洲日韓中文字幕網AV

  • 正文
    • 一、引出調試問題
    • 二、什么是 Debug Mailbox?
    • 三、ROM 中 Debug Mailbox 實現(xiàn)
    • 四、激活 Debug Mailbox 的 JLink Script
    • 五、芯片調試模式(REQUEST = 0x07)下的狀態(tài)
    • 六、Debug Mailbox 對 JLink 調試的影響
  • 相關推薦
申請入駐 產業(yè)圖譜

為何用JLink連接上這款MCU后PC指向0x1c04a?

2020/11/27
165
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是 i.MXRT600 中的 Debug Mailbox 實現(xiàn)對 JLink 調試的影響。

事情緣起痞子衡的同事 - 喜歡打破砂鍋問到底的 Kerry 小姐姐,她最近在研究 i.MXRT600 這款芯片,她發(fā)現(xiàn)在芯片 ROM 串行下載(ISP)模式下,連上芯片 USB 端口可以在設備管理器中正??吹矫杜e的 HID 設備(0x1fc9,0x0020),這個 HID 設備可配合上位機工具 blhost.exe 進行應用程序下載。但是當使用 JLink 正常連上芯片(選擇的是 MIMXRT685,不是 CM33)后,之前的那個 HID 設備不見了,看起來芯片像是退出了 ROM 正常運行,這個體驗跟 i.MXRT1050 上不太一樣,這是為什么?這其實是 Debug Mailbox 在搗鬼,且聽痞子衡細聊:

?

一、引出調試問題

按照我們之前在 i.MXRT1050 上的調試經驗,將芯片設為串行下載模式后,使用 JLink 連接上芯片,并 halt 住內核,此時芯片 PC 是正常停在 ROM 區(qū)域的(0x200000 之后),讓我們同樣的過程在 i.MXRT600 上也操作一次:

我們發(fā)現(xiàn) PC 指向了 0x1c04a,并且不管你如何 reset 再重新 halt,它一直停在這個地方,更奇怪的是這個地方不在 ROM 區(qū)域(0x03000000 或 0x13000000 之后)里,這是怎么回事?

?

二、什么是 Debug Mailbox?

與 i.MXRT1050 不同的是,i.MXRT600 中引入了 Debug Mailbox 機制,這個機制由 ROM 負責實現(xiàn),因此連接上 JLink 后的行為是由 Debug Mailbox 機制決定的。

翻開 i.MXRT600 的 User Manual,在 Debug subsystem 這一章節(jié)可以找到 Debug Mailbox 相關信息,Debug Mailbox 其實最早是 NXP LPC 系列新推的一項功能,后來也用在了 i.MXRT600 上面。

下圖是 i.MXRT600 的 SWD 調試系統(tǒng)內部連接圖,其中藍框標出的 DM AP 便是 Debug Mailbox。

我們知道 i.MXRT600 是基于 Cortex-M33 內核的 MCU,這款 ARM 內核主打特點是安全,因此 NXP 在設計芯片時也加入了很多安全方面的特性,Debug Mailbox 便是其一,Debug Mailbox 基于 NXP debug authentication protocol version 1.0,主要作用是實現(xiàn)外部調試器與芯片內 ROM 的通信,從而賦予調試器擦寫 Flash、進入 ROM ISP、調試認證等功能。

?

三、ROM 中 Debug Mailbox 實現(xiàn)

那么 ROM 中的 Debug Mailbox 機制到底是什么?簡單理解就是如下一段代碼插入了 ROM 的初始化流程。這個機制其實很簡單,就是確保 debug 特性是正常開啟的,然后根據(jù)芯片復位類型來初始化 debug port 并決定要不要進入 Mailbox 命令處理。

//?確認 IFR 里 debug 特性正常開啟
if?(kStatus_DBG_Success?!=?debug_auth_evaluate_dcfg_socu())
{
????__set_FAULTMASK(1);
????__WFI();
}
volatile?uint32_t?reset_status?=?RSTCTRL0->SYSRSTSTAT;
//?根據(jù)復位類型設置初始 debug?port 狀態(tài)
if?(kStatus_DBG_Success?!=?debug_auth_hal_set_initial_debug_port_state(reset_status))
{
????__set_FAULTMASK(1);
????__WFI();
}
if?(reset_status?&?0x20)
{
????//?處理 mailbox 收到的來自 debugger 的命令
????debug_mailbox_GetRequest();
}

RSTCTRL0->SYSRSTSTAT[5]位即 ARM_APD_RESET,表明 ARM 內核是否發(fā)生了軟復位(warm reset),正常芯片上電,這個位不會被置 1,但是如果有調試器接入給內核發(fā)軟復位,這個位就會被置位。一旦這個位被置起來,ROM 初始化過程中便會進入 Mailbox 命令處理函數(shù) debug_mailbox_GetRequest(),不再往后執(zhí)行正常的 ROM 串行下載 / 啟動流程。

debug_mailbox_GetRequest()函數(shù)是 Debug Mailbox 機制的核心,它借助的是如下三個 Mailbox 寄存器來實現(xiàn)調試器與 ROM 的互動。

  • CSW:命令狀態(tài)寄存器,調試器操作這個寄存器指示 ROM 進入 mailbox 命令解析狀態(tài) REQUEST:請求寄存器,調試器將 mailbox 命令寫入這個寄存器指示 ROM 去執(zhí)行 RETURN:結果寄存器,調試器通過讀這個寄存器獲取 ROM 執(zhí)行 mailbox 命令結果

對于使用者來說,一般借助調試器先向 CSW 寄存器寫入 0x21 申請 re-sync 同時 reset device ,然后再按需寫入如下具體的命令進 REQUEST 寄存器,便可實現(xiàn) Debug Mailbox 相應功能。

#define?ENTER_DEBUGGER_MAILBOX?(0x0001)??//?Start?Mailbox?debug
#define?GET_CRP_LEVEL??????????(0x0002)??//?Deprecated?and?retuen?3
#define?DM_ERASE_FLASH?????????(0x0003)??//?Mass?erase?flash
#define?EXIT_DEBUGGER_MAILBOX??(0x0004)??//?Exit?Mailbox?debug
#define?ENTER_ISP_MODE?????????(0x0005)??//?Enter?specified?ISP?mode
#define?SET_FA_MODE????????????(0x0006)??//?Set?to?"Fault?Analysis"?mode
#define?START_DEBUG_SESSION????(0x0007)??//?Start?Debug?session
#define?DEBUG_AUTH_START???????(0x0010)??//?Start?Debug?Authentication?Protocol
#define?DEBUG_AUTH_RESP????????(0x0011)??//?Debug?Authentication?response

?

四、激活 Debug Mailbox 的 JLink Script

了解了 Debug Mailbox 機制原理,我們再來看 JLink 連接 i.MXRT600 時必須要加載執(zhí)行的如下 Script 內容(開頭痞子衡說了必須選擇 MIMXRT685,而不是 CM33,因為在 JLink DLL / JLinkDevices.xml 里 MIMXRT685 才默認指定了配套 Script 腳本)。關于 JLink Script 知識,可以先看痞子衡之前文章 《JLink Script 文件基礎及其在 IAR 下調用方法》。

這個腳本內容其實在 i.MXRT600 的 User Manual 中已經給出了相應偽代碼,通過調用 JLINK_CORESIGHT_WriteAP()來寫 Mailbox 寄存器(index 0 對應 CSW,index 1 對應 REQUEST),基本是按照前面介紹的 Debug Mailbox 使用流程來的,最后通過寫入 START_DEBUG_SESSION 命令進 REQUEST 寄存器開啟芯片調試模式。

void?InitTarget(void)?{
??int?v;

??JLINK_CORESIGHT_Configure("IRPre=0;DRPre=0;IRPost=0;DRPost=0;IRLenDevice=4");
??//?Pre-select?that?we?have?a?Cortex-M33?connected
??CPU?=?CORTEX_M33;
??//?J-Link?is?allowed?to?use?a?TAP?reset?for?JTAG-chain?auto-detection
??JTAG_AllowTAPReset?=?0;

??JTAG_SetDeviceId(0,?0x6BA02477);

??//?Read?AP?ID?register?to?identify?DM?AP?at?index?2
??JLINK_CORESIGHT_WriteDP(2,?0x020000f0);
??v?=?JLINK_CORESIGHT_ReadAP(3);
??JLINK_SYS_Report1("DAP-IDCODE:",?v);
??//?Select?DM?AP?index?2
??JLINK_CORESIGHT_WriteDP(2,?0x02000000);
??JLINK_CORESIGHT_ReadDP(0);

??//?Active?DebugMailbox
??JLINK_CORESIGHT_WriteAP(0,?0x21);
??JLINK_CORESIGHT_ReadAP(0);

??//?Enter?Debug?Session
??JLINK_CORESIGHT_WriteAP(1,?0x07);
??JLINK_CORESIGHT_ReadAP(0);
}

?

五、芯片調試模式(REQUEST = 0x07)下的狀態(tài)

前面講了 JLink Script 會使芯片進入調試模式,那調試模式下芯片到底是什么狀態(tài)?ROM 其實是通過如下函數(shù)加載執(zhí)行了 0x1c040 - 0x1c04B 處的一小段代碼,并最終停在了 0x1c04a 處的 while(1);,至此真相大白。

void?go_debug_mode(void)
{
#define?VECTOR_DUMMY_ROUTINE?0x0001c000u
#define?APP_ENTRY?(VECTOR_DUMMY_ROUTINE?+?0x40?+?1)
????uint32_t?dummy_loop_routines[]?=?{
????????VECTOR_DUMMY_ROUTINE?+?0x1000,?//?SP
????????APP_ENTRY,?????????????????????//?Reset?Handler
????????APP_ENTRY,?????????????????????//?NMI?Handler
????????APP_ENTRY,?????????????????????//?HardFault_Handler
????????APP_ENTRY,?????????????????????//?MemManage_Handler
????????APP_ENTRY,?????????????????????//?BusFault_Handler
????????APP_ENTRY,?????????????????????//?UsageFault_Handler
????????APP_ENTRY,?????????????????????//?SecureFault_Handler
????????0,?????????????????????????????//?Reserved
????????0,?????????????????????????????//?Reserved
????????0,?????????????????????????????//?Reserved
????????APP_ENTRY,?????????????????????//?SVC_Handler
????????APP_ENTRY,?????????????????????//?DebugMon_Handler
????????0,?????????????????????????????//?Reserved
????????APP_ENTRY,?????????????????????//?PendSV_Handler
????????APP_ENTRY,?????????????????????//?SysTick_Handler
????????//?Below?are?the?binary?codes?for?:?
????????//???register?uint32_t?dummy?=?SCB->CPUID;?
????????//???while(1);
????????0x5000f64eu,
????????0x0000f2ceu,
????????0xe7fe6801u,
????};

????{
????????uint32_t?*dest?=?(uint32_t?*)VECTOR_DUMMY_ROUTINE;
????????uint32_t?*src?=?(uint32_t?*)&dummy_loop_routines[0];
????????for?(uint32_t?i?=?0u;?i?<?ARRAY_SIZE(dummy_loop_routines);?i++)
????????{
????????????*dest++?=?*src++;
????????}
????????jump_to_boot_image(VECTOR_DUMMY_ROUTINE);
????}
}

?

六、Debug Mailbox 對 JLink 調試的影響

基于上面分析,最后痞子衡再總結一下 Debug Mailbox 對 JLink 調試的影響:

  1. 當芯片在 ROM 中執(zhí)行(比如 ISP 模式,比如 Flash 中沒有應用程序)時,JLink 要想正常連接,必須加載使能芯片調試模式的 Script 才行,否則會連不上芯片。通過加載執(zhí)行 JLink Script 成功連接上芯片后,PC 總是停在 0x1c04a,這是 Debug Mailbox 機制決定的。只有當芯片正常啟動 Flash 里的應用程序后(即離開了 ROM),用 JLink 連接芯片(選擇 CM33,不加載 Script),halt 住內核,PC 指向的才是真實的應用程序位置。

至此,i.MXRT600 中的 Debug Mailbox 實現(xiàn)對 JLink 調試的影響痞子衡便介紹完畢了,掌聲在哪里~~~

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

碩士畢業(yè)于蘇州大學電子信息學院,目前就職于恩智浦(NXP)半導體MCU系統(tǒng)部門,擔任嵌入式系統(tǒng)應用工程師。痞子衡會定期分享嵌入式相關文章

正蓝旗| 漳浦县| 油尖旺区| 铅山县| 横山县| 朝阳区| 大洼县| 高安市| 江达县| 嘉荫县| 漾濞| 福建省| 滦平县| 泗阳县| 璧山县| 丘北县| 日喀则市| 临江市| 石泉县| 水城县| 新昌县| 天门市| 嘉黎县| 黄骅市| 分宜县| 乌拉特后旗| 五河县| 哈尔滨市| 西华县| 屯留县| 平顺县| 弥勒县| 桂平市| 牟定县| 洱源县| 诸城市| 永兴县| 阳东县| 普定县| 张家界市| 壶关县|