大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是Keil線上調試時設不同複位類型可能會導緻i.MXRT下調試現象不一緻。
本篇是 《IAR EWARM複位類型》、《MCUXpresso IDE複位類型》的同系列篇,三大經典IDE(IAR EWARM、Keil MDK、MCUXpresso IDE)下的複位政策隻剩 Keil MDK 沒介紹了,心事不了,覺睡不好。今天痞子衡就來認真講一下搞嵌入式生涯裡最早接觸的 IDE - Keil,完結這個系列。
Note: 痞子衡測試的Keil MDK版本是v5.31。
關于 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複位功能 小節。
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,暫不介紹。
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 小節
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
- Core
- Normal
- Core and peripherals
關閉校驗後可正常下載下傳,但無法調試
關閉校驗後可正常下載下傳,能正常調試
- Reset Pin
正常下載下傳,但無法調試
- VECTRESET
- SYSRESETREQ
- HW RESET
無法下載下傳,報錯無法停止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首頁、知乎首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。