大家好,我是痞子衡,是正經搞技術的痞子,今天痞子衡給大家分享的是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主頁、知乎主頁、微信公眾號 平臺上,
微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦,

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/288166.html
標籤:嵌入式
上一篇:docker基本底層原理
下一篇:docker安裝及卸載
