大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是Keil在線調試時設不同復位類型可能會導致i.MXRT下調試現象不一致。
本篇是 《IAR EWARM復位類型》、《MCUXpresso IDE復位類型》的同系列篇,三大經典IDE(IAR EWARM、Keil MDK、MCUXpresso IDE)下的復位策略只剩 Keil MDK 沒介紹了,心事不了,覺睡不好。今天痞子衡就來認真講一下搞嵌入式生涯里最早接觸的 IDE - Keil,完結這個系列。
- Note: 痞子衡測試的Keil MDK版本是v5.31。
一、Keil調試機制與調試分類
關於 Keil MDK 下的調試機制原理在 \Keil_v5\ARM\Hlp 目錄下沒有找到專門的設計性文檔,IDE 幫助手冊 uv4.chm 里 Debugging 章節更多是介紹如何在 IDE 里使用下載調試功能。
不過調試機制在各 IDE 上大同小異,設計理念都是一致的,這部分建議參考 《IAR EWARM復位類型》 里的一、二章節。
二、復位類型全解析
好了,現在我們進入正題,開始介紹 Keil 下復位類型。我們知道不同硬件仿真器下復位功能有差異,痞子衡主要介紹 i.MXRT 上兩種最常用的仿真器:J-Link 和 DAPLink。此外不管是哪種仿真器,其都借助了 Cortex-M7 內核功能,內核在 SCB 模塊的 AIRCR 寄存器中集成了復位的支持,詳見 《IAR EWARM復位類型》 的 3.1 Cortex-M7復位功能 小節。
2.1 J-Link復位類型
Keil 里關於 J-Link 連接(Connect)和復位(Reset)是兩級設置,先連接后復位,並且復位動作僅在勾選了"Reset after Connect"之后才有效。實際使用中推薦 Connect 選項固定設為"Normal",且勾選上"Reset after Connect",然后在 Reset 選項里指定想要的復位類型。
Note: 詳細介紹可以查看 \Keil_v5\ARM\Hlp\jlink.chm 文檔中 Debug 小節

連接類型選項:
- Normal:默認的連接策略,連接后只是將 PC 停在當前執行的指令處
- with Pre–reset:在連接前,先執行一次 HW RESET
- under Reset:在連接過程中一直保持 HW RESET 有效(該選項適用於用戶程序誤將 JTAG/SWD 禁掉的情況)
復位類型選項:
- Normal(復位編號0):默認的復位策略,對於i.MXRT來說等同於Core and peripherals方式
- Core(復位編號1):借助Cortex-M內核模塊SCB中的AIRCR寄存器的VECTRESET位功能來復位Core
- Reset Pin(復位編號2):通過拉低J-Link的RESET引腳(一般也會接到MCU reset腳)來復位MCU
- Core and peripherals(復位編號8):借助Cortex-M內核模塊SCB中的AIRCR寄存器的VECTRESET位和SYSRESETREQ位來同時復位Core和MCU外設模塊
剩下幾種復位類型不適用i.MXRT,暫不介紹。
2.2 DAPLink復位類型
Keil 里關於 DAP-Link 連接(Connect)和復位(Reset)也是兩級設置,先連接后復位,並且復位動作僅在勾選了"Reset after Connect"之后才有效。實際使用中推薦 Connect 選項固定設為"Normal",且勾選上"Reset after Connect",然后在 Reset 選項里指定想要的復位類型。此外相比 J-Link 還多一個 "Stop after Reset "選項,這個選項用於永久使能應用程序復位向量的捕獲,我們一般不勾選。
Note: 詳細介紹可以查看 \Keil_v5\ARM\Hlp\dapdebug.chm 文檔中 Debug 小節

連接類型選項:
- Normal:默認的連接策略,連接后只是將 PC 停在當前執行的指令處
- with Pre–reset:在連接前,先執行一次 HW RESET
- under Reset:在連接過程中一直保持 HW RESET 有效(該選項適用於用戶程序誤將 JTAG/SWD 禁掉的情況)
- without Stop:連接后任 CPU 自由執行(適用於觀測存儲器或者外設 SFR 情況)
復位類型選項:
- HW RESET:通過翻轉DAPLink的nSRST/nRESET引腳(一般也會接到MCU reset腳)來復位MCU
- SYSRESETREQ:借助Cortex-M內核模塊SCB中的AIRCR寄存器的SYSRESETREQ位來同時復位MCU外設模塊
- VECTRESET:借助Cortex-M內核模塊SCB中的AIRCR寄存器的VECTRESET位功能來復位Core
三、復位類型對在線調試的影響
復位類型對在線調試的影響分兩種:一、是否影響應用程序正常調試;二、是否影響應用程序正常運行。對於第二點,因為應用程序的設計差異,無法確定復位類型的不同導致的未復位模塊對其產生何種影響,因此我們暫不討論這點,我們主要看第一點。
設置不同的復位類型是否影響應用程序正常調試(能否停在程序入口函數,能否進行單步)?痞子衡在MIMXRT1050-EVKB上實測了SDK里的led_blinky例程,選取了flexspi_nor_debug(在Flash)build做了很多組測試,結果如下:
| 例程Build | 仿真器 | 復位類型 | BootMode | 調試現象 |
|---|---|---|---|---|
| debug | J-Link DAPLink |
所有的(除了DAPLink下HW RESET) | 2'b01 - SDP 2'b10 - Flash Boot |
正常下載與調試 |
| flexspi_nor_debug | J-Link | - Core | 2'b01 - SDP 2'b10 - Flash Boot |
正常下載與調試 |
| flexspi_nor_debug | J-Link | - Normal - Core and peripherals |
2'b01 - SDP | 關閉校驗后可正常下載,但無法調試 |
| flexspi_nor_debug | J-Link | - Normal - Core and peripherals |
2'b10 - Flash Boot | 關閉校驗后可正常下載,能正常調試 |
| flexspi_nor_debug | J-Link | - Reset Pin | 2'b01 - SDP | 正常下載,但無法調試 |
| flexspi_nor_debug | J-Link | - Reset Pin | 2'b10 - Flash Boot | 正常下載與調試 |
| flexspi_nor_debug | DAPLink | - VECTRESET | 2'b01 - SDP 2'b10 - Flash Boot |
正常下載與調試 |
| flexspi_nor_debug | DAPLink | - SYSRESETREQ | 2'b01 - SDP | 關閉校驗后可正常下載,但無法調試 |
| flexspi_nor_debug | DAPLink | - SYSRESETREQ | 2'b10 - Flash Boot | 正常下載與調試 |
| flexspi_nor_debug | DAPLink | - HW RESET | 2'b01 - SDP 2'b10 - Flash Boot |
無法下載,報錯無法停止CPU |
從上表的測試結果,我們可以得到如下結論:
- 結論1:在Flash調試,要想正常調試,要么不復位片上外設(保留Flashloader對FlexSPI等模塊的初始化),要么啟動模式設成Flash Boot(讓BootROM完成FlexSPI等模塊的初始化),因為Clock/GPIO/FlexSPI的初始化必須保留,CPU才能正常獲得Flash里指令。
- 結論2:JLink復位下,Keil MDK調試體驗與其他IDE是一致的。
- 結論3:DAPLink復位下,Keil MDK下HW RESET方式復位可能會報奇怪的內核連接錯誤。
至此,Keil在線調試時設不同復位類型可能會導致i.MXRT下調試現象不一致現象痞子衡便介紹完畢了,掌聲在哪里~~~
歡迎訂閱
文章會同時發布到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平台上。
微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

