ARM Cortex-M 调试器 - 基础知识
文章目錄
- 前言
- Processor memory map
- 內核寄存器
- SFR(特殊功能寄存器)
- 0xE000E000-0xE000ED8F (CPUID/AIRCR)
- 0xE000EF00-0xE000EFFF
- Core Debug
- DBG_HCSR: 0xE000EDF0
- DBG_CRSR: 0xE000EDF4
- DBG_CRDR: 0xE000EDF8
- DBG_EMCR: 0xE000EDFC
- DP- Debug Port
- DP0_ABORT (0x00 SW W)
- DP0_IDCODE (0x00 SW R)
- DP4_CTRL/STAT (0x04 SW W/R)
- DP8_SELECT (0x08 SW W)
- DP8_RESEND register 0x08 (SW R)
- DPc_RDBUFF register 0x0C (SW R)
- AP Access Port
- AP0_CSW (Control and Status Word Register) 0x00
- AP4_TAR (Transfer Address Register) 0x04~08
- APc_DRW (Data Read/Write Register) 0x0C
- AP_BDR0-3 (Banked Data Registers 0-3)
- AP_DRAR (Debug ROM Address Register)
- IDR (ID Register)
- System Debug
- AHB-AP
- CSW 0x00
- TAR 0x04~08
- DRW 0x0C
- Bandked Data 4 0x10-0x1C
- Debug ROM Address 0xF8
- IDR 0xFC
- SWD 時序
- MCU連接過程
- 1. SWD初始化
- 2. 解鎖 AP
- MCU 讀寫操作
- MM32-LINK 測試(MT304)
- 1. SWD Connect: read DP_IDCODE
- 2. Set DP_CTRL/STAT PWR UP
- 3. Read CPUID(`0xE000_ED00`)
- 4. Unknow: Read from 0xE000_1028/38/48/58
- 5. DBG_HCSR(`0xE000_EDF0`) = 0xA05F_0003, Halt CPU, DBG_EN
- 7. DBG_EMCR(`0xE000_EDFC`) = 0x0100_0001, Catch Reset & Trace
- 8. DBG_AIRCR(`0xE000_ED0C`) = 0x05FA_0004, SYS_RST_REQ
- 9. nRST = 0. dalay xxms
- 10. nRST = 1. delay 20ms
- 11. read DBG_HCSR(`0xE000_EDF0`) 3times
- 12. DBG_EMCR(`0xE000_EDFC`) = 0x0100_0000, Trace(3 times)
- while true: step11 cycle
- 總結
推薦博文1: SWD協議通信的簡單總結
前言
根據《ARM Technical Reference Manual cortex_m3_r1p1_trm》和《Arm? Debug Interface Architecture Specification ADI v6.0.pdf》進行梳理。
Processor memory map
內核寄存器
Cortex-M3 處理器實現了ARM v7-M架構。這包括整個 16 位的Thumb指令集和基本的 Thumb-2 32位指令集架構。處理器無法執行ARM指令。
- Thumb 指令集是 ARM 指令集的一個子集,被重新編碼為 16 位。它支持更高的代碼密度和具有 16 位寬或 16 位窄的內存數據總線的系統。
- Thumb-2 是對 Thumb 指令集體系結構(ISA)的一個主要增強。Thumb-2 支持比 Thumb 更高的代碼密度,并提供更高的性能。
The processor has the following 32-bit registers:
- 13 General-Purpose Registers, r0-r12
- Stack Point alias of banked registers, SP_process & SP_main. SP
- Link Register, r14
- Program Counter, r15
- one Program Status Register, xPSR.
R16寄存器 xPSR
Special-purpose Program Status Registers,系統級的處理器狀態分為三類:
-
Application 應用程序PSR
-
Interrupt 中斷PSR
-
Execution 執行 PSR
SFR(特殊功能寄存器)
0xE000E000-0xE000ED8F (CPUID/AIRCR)
NVIC register map:
- 0xE000E000 - 0xE000E00F. Interrupt Type Register
- 0xE000E004 Interrupt Control Type Register r
- 0xE000E010 - 0xE000E0FF. System Timer
- 0xE000E010 SysTick Control and Status Register r/w
- 0xE000E014 SysTick Reload Value Register r/w
- 0xE000E018 SysTick Current Value Register r/wc
- 0xE000E01C SysTick Calibration Value Register r
- 0xE000E100 - 0xE000ECFF. NVIC
- 0xE000E100 Irq 0 to 31 Set Enable Register r/w
- 0xE000E11C Irq 224 to 239 Set Enable Register r/w
- 0xE000E180 Irq 0 to 31 Clear Enable Register r/w
- 0xE000E19C Irq 224 to 239 Clear Enable Register r/w
- 0xE000E200 Irq 0 to 31 Set Pending Register r/w
- 0xE000E21C Irq 224 to 239 Set Pending Register
- 0xE000E280 Irq 0 to 31 Clear Pending Register
- 0xE000E29C Irq 224 to 239 Clear Pending Register
- 0xE000E300 Irq 0 to 31 Active Bit Register
- 0xE000E31C Irq 224 to 239 Active Bit Register
- 0xE000E400 Irq 0 to 31 Priority Register
- 0xE000E4F0 Irq 236 to 239 Priority Register
- 0xE000ED00 - 0xE000ED8F. SCB
System Control Block, 包括:CPUID \ System Control, Configuration & Status\ Fault reporting.- 0xE000ED00 CPUID Base Register r
- 0xE000ED04 Interrupt Control State Register r/w
- 0xE000ED08 Vector Table Offset Register r/w
- 0xE000ED0C Application Interrupt/Reset Control Register r/w
- 0xE000ED10 System Control Register r/w
- 0xE000ED14 Configuration Control Register r/w
- Fault reporting
1. CPUID 0xE000ED00
- m3_r1p1 復位值為 0x411FC231。
根據 CPUID 識別 ARM 內核: - bit [31:24]: 0x41 = ARM
- bit [23:20]: variant number
- bit [19:16]: 0xF
- bit[15:14]: b11= Cortex Family
- bit[13:12]: b00 = version
- bit[11:10]: b00 = reserved
- bit[9:8]: b10 = M(v7-M)
- bit[7:4]: b0011 = Cortex-M3. Family member
- bit [3:0]: revision numer
通過對ARM 全系列CPUID進行整理,可得:
| 0xC20 | Cortex-M0 |
| 0xC21 | Cortex-M1 |
| 0xC23 | Cortex-M3 |
| 0xC24 | Cortex-M4 |
| 0xC27 | Cortex-M7 |
| 0xC60 | Cortex-M0+ |
| 0xD20 | Cortex-M23 |
| 0xD21 | Cortex-M33 |
| 0xD22 | Cortex-M55 |
2. AIRCR 0xE000ED0C
應用程序中斷和復位控制寄存器 (Application Interrupt/Reset Control Registe)
- [31:16] VECTKEY 。寄存器鍵。寫入這個寄存器需要在 VECTKEY 字段中輸入 0x05FA。否則,寫值將被忽略。
- [31:16] VECTKEYSTAT。讀入 0xFA05
- [15] ENDIANESS。數據字節順序。ENDIANESS 在復位時從大端輸入端口采樣。您不能在重置之外更改 ENDIANESS
- 1 =大端
- 0 =小端
- [14:11] reserved
- [10:8] 中斷優先級分組字段: PRIGROUP 字段是一個二進制點位指示符,用于為具有相同搶占級別的異常創建子優先級
- [2] SYSRESETREQ:導致向外部系統斷言一個信號,表明請求復位
用于強制除調試外的所有主要組件的大型系統重置。設置此位不會阻止“Halting Debug ”運行 - [1] VECTCLRACTIVE:清除活動向量位:
- 1 清除所有活動NMI、故障、中斷的狀態信息
- 0 =不清除
重新初始化堆棧是應用程序的責任。該位用于在調試期間返回到已知狀態。(自動清零)該操作不會清除IPSR。因此,如果應用程序使用它,它必須只能在基本激活級別上使用,或者在可以設置活動位的系統處理程序中使用
- [0] VECTRESET:系統復位。重置系統,除調試組件外:
- 1 =復位系統
- 0 =不重啟系統
VECTRESET 位會自動清除。Reset清除 VECTRESET 位。對于調試,只有當core 被 halted 時才寫入此位。
*注意:
SYSRESETREQ 由系統復位清除,這意味著同時斷言 VECTRESET 可能會導致 SYSRESETREQ 在寫入的同一周期內被清除。 這可能會阻止外部系統看到 SYSRESETREQ。 因此,建議獨占使用 VECTRESET 和 SYSRESETREQ,切勿兩者同時寫 1。
0xE000EF00-0xE000EFFF
- 0xE000EF00 - 0xE000EF0F. Software Trigger Exception Register
- 0xE000EF00 Software Trigger Interrupt Register w
- 0xE000EFD0 Peripheral identification register (PID4) r
- 0xE000EFDC Peripheral identification register (PID7)
- 0xE000EFE0 Peripheral identification register Bits 7:0 (PID0) r
- 0xE000EFEC Peripheral identification register Bits 31:24 (PID3)
- 0xE000EFF0 Component identification register Bits 7:0 (CID0)
- 0xE000EFFC Component identification register Bits 31:24 (CID3)
- 0xE000EFD0 - 0xE000EFFF. ID Space
Core Debug
核心調試通過核心調試寄存器訪問。對這些寄存器的調試訪問是通過高級高性能總線(AHB-AP)端口進行的.處理器可以通過內部的私有外圍總線(PPB)直接訪問這些寄存器。
Halt mode debugging / 內核 Halt 狀態下的調試方法
- 調試器可以通過設置調試暫停控制和狀態寄存器的 C_DEBUGEN 和 C_HALT 位來暫停內核。 內核通過設置調試停止控制和狀態寄存器的 S_HALT 位在停止時進行確認。
- 通過暫停內核,將 C_STEP 位設置為 1,然后將 C_HALT 位清除為 0,內核可以單步執行。內核通過設置 DBG_HCSR.S_HALT 位確認單步完成并重新暫停。
退出內核調試
- Core 可以通過清除調試停止和狀態寄存器中的 C_DEBUGEN 位來退出停機調試。
DBG_HCSR: 0xE000EDF0
-
C_Halt: Halts the core.
暫停核心。當核心停止時,該位是自動設置的。例如斷點。此位在核心重置時清除。該位只能在 C_DEBUGEN 為 1 時寫入,否則將被忽略。當設置該位為 1 時,C_DEBUGEN 也必須以相同的值寫入1 (值[1:0]為 2’b11)。核心可以停止自己,但只有當 C_DEBUGEN 已經是 1 并且只有當它使用 b11 進行寫操作時)。 -
C_DebugEN:Enables debug.
啟用調試。這只能由 AHB-AP 編寫,而不是由 core 編寫。它在內核寫入時被忽略,內核不能設置或清除它。當寫入 C_HALT 來停止自身時,核心必須向它寫入 1。
READ: -
S_REGRDY:
調試內核寄存器選擇器寄存器上的寄存器讀/寫可用。 最后一次傳輸完成。 -
S_HALT
當 S_HALT 為高時,內核處于調試狀態 -
S_SLEEP
表示內核正在休眠.WFI、WFE 或 SLEEP-ON-EXIT, 必須使用 C_HALT 來獲得控制權或等待中斷喚醒。 -
S_LOCKUP:
如果內核正在運行(未停止)并且存在鎖定條件,則讀取為 1。 -
S_RETIRE_ST: Indicates that an instruction has completed since last read. This is a sticky bit that clears on read. This determines if the core is stalled on a load/store or fetch. 表示自上次讀取后指令已完成。 這是一個在讀取時清除的粘性位。 這確定核心是否在加載/存儲或獲取時停止。
-
S_RESET_ST
表示自從上次讀取該位以來,內核已被復位或正在被復位。 這是一個在讀取時清除的粘性位。 因此,讀取兩次并得到 1 然后 0 意味著它在過去被重置。 讀取兩次并獲得 1 意味著它現在正在重置(仍然保持在重置狀態)。
DBG_CRSR: 0xE000EDF4
DBG_CRDR: 0xE000EDF8
DBG_EMCR: 0xE000EDFC
- VC_CoreReset: Reset Vector Catch.
復位向量。如果內核 Core 發生復位,停止正在運行的系統 - TRCENA:
該位必須設置為 1 以啟用跟蹤和調試塊:數據觀察點和跟蹤 (DWT)/儀器跟蹤宏單元 (ITM)/嵌入式跟蹤宏單元 (ETM)/跟蹤端口接口單元(TPIU). 除非需要跟蹤,否則這可以控制電源使用。 應用程序可以啟用此功能,供 ITM 使用或由調試器使用。
注意:如果 TIEOFF_TRCENA 定義在實施期間在 CM3Defs.v 中未注釋,則無法設置 TRCENA。 - MON_REQ:
這使監視器能夠確定其喚醒的原因:1 =由 MON_PEND; 0 = debug異常喚醒。 - MON_STEP:
當 MON_EN = 1 時,這會步進內核。 當 MON_EN = 0 時,該位被忽略。 這相當于 C_STEP。 中斷僅根據監視器的優先級和 PRIMASK、FAULTMASK 或 BASEPRI 的設置進行步進。 - MON_PEND:
當優先級允許時,掛起監視器以激活。 這可以通過 AHB-AP 端口喚醒顯示器。 它等效于用于監視器調試的 C_HALT。該寄存器不會在系統復位時復位。 它只能通過上電復位來復位。 復位處理程序或更高版本中的軟件,或由 DAP 提供的軟件必須啟用調試監視器。 - MON_EN:Enable the debug monitor.
啟用調試監視器。 啟用后,系統處理程序優先級寄存器控制其優先級。 如果禁用,則所有調試事件都會進入硬故障。 調試停止控制和狀態寄存器中的 C_DEBUGEN 覆蓋該位。矢量捕獲是半同步的。 當看到匹配事件時,請求停止。 因為處理器只能在指令邊界上停止,它必須等到下一個指令邊界。 結果,它在異常處理程序的第一條指令處停止。 但是,當向量捕獲已觸發時,存在兩種特殊情況:- 如果在向量化、向量讀取或堆棧推送錯誤期間發生故障,則在或響應的故障處理程序上發生停止,用于向量錯誤或堆棧推送。- 如果在引導過程中出現遲到的中斷,則不接受。 也就是說,在這種情況下,支持延遲到達優化的實現必須抑制它。 - VC_HARDERR: Debug trap on Hard Fault
- VC_INTERR: Debug Trap on interrupt/exception service errors. These are a subset of
other faults and catches before BUSERR or HARDERR. - VC_BUSERR: Debug Trap on normal Bus error.
- VC_STATERR:Debug trap on Usage Fault state errors
- VC_CHKERR:Debug trap on Usage Fault enabled checking errors.
- VC_NOCPERR:Debug trap on Usage Fault access to Coprocessor which is not present
or marked as not present in CAR register. - VC_MMERR:Debug trap on Memory Management faults.
- VC_CORERESET
重置向量捕獲。 如果發生核心重置,則停止運行系統。僅當 C_DEBUGEN = 1 時可用。
該寄存器不會在系統復位時復位。該寄存器由上電復位復位。 位 [19:16] 總是在內核復位時清零。調試監視器由復位處理程序或更高版本中的軟件啟用,或者由 AHB-AP 端口啟用。
矢量捕獲是半同步的。 當看到匹配事件時,請求停止。 因為處理器只能在指令邊界上停止,它必須等到下一個指令邊界。 結果,它在異常處理程序的第一條指令處停止。 但是,當向量捕獲已觸發時,存在兩種特殊情況:- 如果在向量讀取或堆棧推送錯誤期間發生故障,則在向量錯誤或堆棧推送的相應故障處理程序上發生暫停。- 如果在向量讀取或堆棧推入錯誤期間檢測到遲到中斷,則不接受。 也就是說,在這種情況下,支持遲到優化的實現必須抑制它。
矢量捕獲只能用于停止調試。高16位是用于監控控制,低16位是暫停、異常支持。
DP- Debug Port
#define DP_IDCODE 0x00U // IDCODE Register (SW Read only) #define DP_ABORT 0x00U // Abort Register (SW Write only) #define DP_CTRL_STAT 0x04U // Control & Status #define DP_WCR 0x04U // Wire Control Register (SW Only) #define DP_SELECT 0x08U // Select Register (JTAG R/W & SW W) #define DP_RESEND 0x08U // Resend (SW Read Only) #define DP_RDBUFF 0x0CU // Read Buffer (Read Only)DP0_ABORT (0x00 SW W)
- ORUNERRCLR, bit[4]
要將 CTRL/STAT.STICKYORUN 溢出錯誤位清除為 0b0,請將 0b1 寫入該位。
To clear the CTRL/STAT.STICKYORUN overrun error bit to 0b0, write 0b1 to this bit. - WDERRCLR, bit[3]
要將 CTRL/STAT.WDATAERR 寫入數據錯誤位清除到 0b0,請將 0b1 寫入該位。
To clear the CTRL/STAT.WDATAERR write data error bit to 0b0, write 0b1 to this bit. - STKERRCLR, bit[2]
要將 CTRL/STAT.STICKYERR 粘滯錯誤位清除為 0b0,請將 0b1 寫入該位。
To clear the CTRL/STAT.STICKYERR sticky error bit to 0b0, write 0b1 to this bit. - STKCMPCLR, bit[1]
要將 CTRL/STAT.STICKYCMP 粘性比較位清除為 0b0,請將 0b1 寫入該位。 是否實現 CTRL/STAT.STICKYCMP 位由實現定義。
To clear the CTRL/STAT.STICKYCMP sticky compare bit to 0b0, write 0b1 to this bit. It is IMPLEMENTATION DEFINED whether the CTRL/STAT.STICKYCMP bit is implemented. - DAPABORT, bit[0]
要生成中止當前 AP 事務的 AP 中止,請將 0b1 寫入該位。
僅當調試器在較長時間內收到 WAIT 響應時才執行此寫入操作。
To generate an AP abort, which aborts the current AP transaction, write 0b1 to this bit.
Do this write only if the debugger has received WAIT responses over an extended period
DP0_IDCODE (0x00 SW R)
DP4_CTRL/STAT (0x04 SW W/R)
- CSYSPWRUPACK, bit[31], ro. System powerup acknowledge.
系統上電確認。 指示 CSYSPWRUPACK 信號的狀態。 - CSYSPWRUPREQ, bit[30], rw. System powerup request.
系統上電請求。 該位控制 CSYSPWRUPREQ 信號。上電復位后,該位為 0b0。 - CDBGPWRUPACK, bit[29], ro. Debug powerup acknowledge.
調試上電確認。 指示 CDBGPWRUPACK 信號的狀態。 - CDBGPWRUPREQ, bit[28]. Debug powerup request.
調試上電請求。 該位控制 CDBGPWRUPREQ 信號。 上電復位后,該位為 0b0。 - CDBGRSTACK, bit[27] ro. Debug reset acknowledge.
調試復位確認。 指示 CDBGRSTACK 信號的狀態。 請參閱調試重置控制行為(Debug reset control behavior on page B2-86). - CDBGRSTREQ, bit[26]. Debug reset request.
調試復位請求。 該位控制 CDBGRSTREQ 信號。 該位是 RW 還是 RAZ/WI 由實現定義。 上電復位后,該位為 0b0。 - ERRMODE, bit[24].
錯誤模式。 指示 CTRL/STAT.STICKYERR 字段的重置行為。 0b0:AP 事務設置錯誤 CTRL/STAT.STICKYERR 和 CTRL/STAT.STICKYERR 保持設置直到明確清除。 0b1:AP 事務上的錯誤設置 CTRL/STAT.STICKYERR,當輸出 FAULT 響應時清除 CTRL/STAT.STICKYERR。
如果 ERRMODE 為 0b1,則 AP 事務上發生的錯誤可能會通過 FAULT 報告給調試器 響應,但不需要調試器顯式清除 CTRL/STAT.STICKYERR。 導致 FAULT 響應的 JTAG-DP 或 SW-DP 事務不成功,并且 CTRL/STAT.STICKYERR 被清除為 0b0,允許嘗試將來的事務。 上電復位后,該字段的值為 0b0。 - TRNCNT, bits[23:12]. Transaction counter.
交易計數器。 上電復位后,該字段的值為 UNKNOWN。
注意:該字段是否實現由 IMPLEMENTATION DEFINED 定義。 MINDP 配置中不支持 TRNCNT。 在 MINDP 配置中,將非零值寫入 TRNCNT 或 TRNMODE 的效果是 UNPREDICTABLE。 - MASKLANE, bits[11:8]
對于推送操作,DP 對 AP 寫事務中提供的字與目標 AP 地址處的當前字進行逐字節比較。 MASKLANE 字段用于選擇要包含在此比較中的字節。 MASKLANE 字段的四位中的每一位對應于要比較的字的四個字節之一。 因此,每一位被稱為控制比較操作的一個字節通道。
表 B2-4 顯示了 MASKLANE 的位如何控制比較屏蔽。。
- a: 是否包含其他位由 MASKLANE 的其他位決定:為了比較整個字,將 MASKLANE 設置為 0b1111 以包含所有字節通道。 如果 MASKLANE 位為 0b0,則從比較中排除相應的字節通道。
注意:以下內容適用于 MASKLANE 字段: - MASKLANE 僅在傳輸模式字段 TRNMODE 為 0b01(用于推送驗證操作)或 0b10(用于推送比較操作)時才相關。 上電復位后,MASKLANE 的值為未知
- a: 是否包含其他位由 MASKLANE 的其他位決定:為了比較整個字,將 MASKLANE 設置為 0b1111 以包含所有字節通道。 如果 MASKLANE 位為 0b0,則從比較中排除相應的字節通道。
- WDATAERR, bit[7] . Write Data Error.
如果發生以下寫入數據錯誤之一,則該位設置為 0b1: - 寫入數據階段的奇偶校驗或幀錯誤。 - 已被 DP 接受的寫入將被丟棄而不提交給 AP。 SW-DP,所有實現:訪問是 RO/WI。 要將 WDATAERR 清除為 0b0,請將 0b1 寫入 ABORT 寄存器中的 ABORT.WDERRCLR 字段。 如有必要,可以使用 ABORT 寄存器的單次寫入來清除多個標志。 清除 WDATAERR 標志后,通常必須重新發送損壞的數據。 上電復位后,WDATAERR 為 0b0. - READOK, bit[6]
在 SW-DP 上,訪問是 RO/WI。如果對先前 AP 讀取或 RDBUFF 讀取的響應是 OK,則該位設置為 0b1。 如果響應不正常,則清零為 0b0。此標志始終指示對最后一次 AP 讀取訪問的響應。 上電復位后,該位為 0b. - STICKYERR, bit[5]
如果 AP 事務返回錯誤,則該位設置為 0b1 - STICKYCMP, bit[4]
當在推送比較操作期間發生不匹配或在推送驗證操作期間發生匹配時,該位設置為 0b1. - TRNMODE, bits[3:2]
此字段設置 AP 操作的傳輸模式。- 在正常操作中,AP 交易被傳遞給 AP 進行處理;- 在推送驗證和推送比較操作中,DP 將 AP 寫入事務中提供的值與目標 AP 地址中保存的值進行比較。TRNMODE 可以具有以下值之一:- 0b00 正常操作。- 0b01 推送驗證模式。- 0b10 推送比較模式。- 0b11 保留。上電復位后,該字段的值為未知. - STICKYORUN, bit[1]
如果啟用了溢出檢測,則在發生溢出時該位設置為 0b1。SW-DP:訪問為 RO/WI。要將 STICKYORUN 清零為 0b0,請將 0b1 寫入 ABORT 寄存器中的 ABORT.ORUNERRCLR 字段。 如有必要,可以使用 ABORT 寄存器的單次寫入來清除多個標志。在清除 CTRL/STAT.STICKYORUN 后,您必須找出哪個 DP 或 AP 事務引發了導致設置標志的溢出,并重復這些事務 事務計數器指向的事務中的 DP 或 AP。上電復位后,該位為 0b0. - ORUNDETECT, bit[0] 。Overrun detection
0b0 溢出檢測被禁用。0b1 啟用溢出檢測。上電復位后,該位為 0b0
DP8_SELECT (0x08 SW W)
- APSEL=0X00: 表示AHB訪問
- APBANKSEL: 選擇當前AP的 bank 地址。
DP8_RESEND register 0x08 (SW R)
DPc_RDBUFF register 0x0C (SW R)
NOTE: 電源和復位控制
DP 支持 CTRL/STAT 寄存器中的以下電源和復位控制字段:
- 系統和調試電源控制、CDBGPWRUPREQ、CDBGPWRUPACK、CSYSPWRUPREQ 和 CSYSPWRUPACK 的控制字段。有關詳細信息,請參閱2.1節《系統和調試電源控制行為 System and debug power control behavior》。
- 調試復位控制、CDBGRSTREQ 和 CDBGRSTACK 的控制字段。有關詳細信息,請參閱 2.2節《調試復位控制行為》。
這些控制位可由調試器編程,并將信號驅動到目標系統。
當由 CTRL/STAT 寄存器中的電源和復位控制字段控制時,可以使用 CDBGRSTREQ 字段實現調試邏輯復位,但 CTRL/STAT 不提供任何用于請求系統復位的控制位。然而,調試器的物理接口通常包含一個系統復位引腳 nSRST,它旨在為現有的電源和復位控制器提供提示或激勵。有關如何實現系統復位管腳的詳細信息,請參見第 B2-88 頁的系統復位控制行為。
Arm 建議僅將 CDBGRSTREQ 用作解除鎖定系統阻塞的最后手段。 CDBGRSTREQ 可能影響的不僅僅是鎖定邏輯,必須小心使用。
nSRST 也可能導致調試邏輯復位,但需要釋放調試邏輯復位以允許調試器在保持系統復位的同時對調試邏輯進行編程。
ADI不更換系統電源和復位控制器,ADI規范對系統電源和復位控制器的操作沒有任何要求
電源控制要求和操作。
**1 系統和調試電源控制行為 **
System and debug power control behavior
1.1 ADI功率域模型
The ADI power domains model ADI 支持多個電源域,為可斷電的調試組件提供支持。實現對三個電源域進行建模:
- Always-on power domain :必須(始終)上電的區域,用于debugger連接device。必須為調試器上電才能連接到設備的電源域 [感謝評論區1層層主建議]
- 系統電源域:包括系統組件的電源域。
- 調試電源域:包括整個調試子系統的電源域。
如有必要,可以細分系統和調試電源域。然而,要定義一個簡單的調試接口,必須在頂層將設備劃分為系統和調試電源域。任何更細粒度的控制都超出了此模型的范圍。
在大多數情況下,調試器會啟動整個 SoC。但是,如果調試器正在調查電源管理問題,它可能只想啟動調試域。為了實現這一目標,SoC 設計人員可能希望將電源控制器映射到一個總線段,當只有調試電源域上電時,ADI 可以訪問該總線段。
使用 ADI 時,為了使調試過程正常工作,系統不得在調試會話期間斷開 DP 的電源。如果斷電,DP 控制器狀態將丟失。但是,ADI 旨在允許 ADI 的其余部分和系統在保持對 DP 供電的同時斷電和調試。
DP 寄存器位于始終開啟的電源域中,位于 DP 的外部接口側。因此,它們始終可以被驅動,從而能夠向系統電源控制器發出上電請求。電源和復位控制位是 DP CTRL/STAT 寄存器的一部分。有關此寄存器中的復位控制位的更多信息,請參見第 B2-86 頁的調試復位控制行為。
ADIv6 定義了兩對電源控制信號:
- CDBGPWRUPREQ DP_CTRL_STAT.bit[28] 和 CDBGPWRUPACK DP_CTRL_STAT.bit[29]
- CSYSPWRUPREQ DP_CTRL_STAT.bit[30] 和 CSYSPWRUPACK DP_CTRL_STAT.bit[31]
1.1.1 CDBGPWRUPREQ & CDBGPWRUPACK
CDBGPWRUPREQ 是從調試接口到電源控制器的信號。該信號請求系統電源控制器完全上電并確保時鐘在調試電源域中可用。
CDBGPWRUPACK 是從電源控制器到調試接口的信號。當 CDBGPWRUPREQ 置位時,電源控制器啟動調試電源域,然后置位 CDBGPWRUPACK 以確認它已響應請求。
哪些組件在由 CDBGPWRUPREQ 控制的調試電源域中是實現定義的。例如,此域可能包括系統中的所有調試組件,或者可能僅限于排除具有額外功率控制級別的組件。CDBGPWRUPREQ 信號指示調試器需要這些組件的調試資源是可通信的。通信意味著調試器可以訪問至少足夠的調試資源寄存器,以確定資源的狀態。
資源是否處于活動狀態由實現定義。電源和時鐘控制器必須加電并運行所需數量的域的時鐘,以符合來自調試器的此請求,以使資源可通信。
只要 CDBGPWRUPREQ 被斷言,電源和時鐘控制器就必須遵守它。例如,如果調試電源域中的組件請求斷電,則必須針對該電源域內的非調試邏輯模擬該請求,包括具有單個共享域的所有組件。
如果某個組件的某些調試資源不在調試電源域中,則至少該組件的最小調試接口必須上電。如果滿足以下要求,則可以從組件的其余部分移除電源:
- 有一些方法可以保存和恢復調試資源的狀態。
- 當組件的其余部分未通電時,調試器可以與調試資源通信。
保存和恢復這些資源中保存的值的方法可能包括軟件解決方案。如果當從組件的其余部分移除電源時調試資源確實失去了它們的價值,那么調試接口必須包括讓調試器發現編程值已經丟失的裝置。
CDBGPWRUPACK 是 CDBGPWRUPREQ 請求信號的確認信號。只要 CDBGPWRUPREQ 被斷言,CDBGPWRUPACK 就必須被斷言。請參見第 B2-84 頁的上電請求和確認時間。
1.1.2 CSYSPWRUPREQ and CSYSPWRUPACK
CSYSPWRUPREQ 是從調試接口到電源控制器的信號。該信號請求系統電源控制器完全啟動并確保時鐘在系統電源域中可用。
CSYSPWRUPACK 是從電源控制器到調試接口的信號。當 CSYSPWRUPREQ 置位時,電源控制器啟動系統電源域,然后置位 CSYSPWRUPACK 以確認它已響應請求。
由 CSYSPWRUPREQ 控制的系統電源域中的哪些組件是實現定義的。此域可能包括系統中的所有調試組件,或者可能受到限制,例如排除具有額外功率控制級別的組件,例如實現獨立核心的處理器
通電請求控件。
CSYSPWRUPREQ 信號指示調試器需要這些組件的所有調試資源處于活動狀態。激活意味著調試資源可以執行其調試功能。一個活躍的資源也是可以交流的。
只要 CSYSPWRUPREQ 被斷言,電源和時鐘控制器就必須遵守它。
CSYSPWRUPREQ 對由 CDBGPWRUPREQ 控制的調試組件沒有影響,因為這些組件在系統電源域中沒有調試邏輯。但是,對于某些調試資源位于由 CSYSPWRUPREQ 控制的系統電源域中的組件,必須為該電源域內的非調試邏輯模擬請求。
CSYSPWRUPACK 是 CSYSPWRUPREQ 請求信號的確認信號。只要 CSYSPWRUPREQ 被斷言,CSYSPWRUPACK 就必須被斷言。請參閱第 B2-84 頁的上電請求和確認時間。
當 CSYSPWRUPREQ 被調試器斷言時,CDBGPWRUPREQ 也必須被斷言。
1.2 電源控制要求和操作
Power control requirements and operation
本節適用于 system 和 debug 域,并使用以下符號:
- CxxxPWRUPREQ 指的是 CSYSPWRUPREQ 或 CDBGPWRUPREQ。
- CxxxPWRUPACK 是指 CSYSPWRUPACK 或 CDBGPWRUPACK。
本節中描述的所有信號都是高電平有效,因此 assert 表示將信號設為高電平,而 deassert 表示將信號設為低電平。
powerup 請求和確認的操作規則是:
-
調試器不得同時將 CTRL/STAT.CSYSPWRUPREQ 設為1 、CTRL/STAT.CDBGPWRUPREQ 設為0。對這種請求組合的響應是不可預測的。
-
要初始化powerup,DP 必須斷言 CxxxPWRUPREQ。
- 如果相應的電源域斷電或處于低功耗保持狀態,則電源控制器必須在檢測到 CxxxPWRUPREQ 被斷言時為域上電。域上電后,控制器必須置位 CxxxPWRUPACK。
- 如果在電源控制器檢測到 CxxxPWRUPREQ 被置位時相應的電源域已經上電,控制器仍必須通過置位 CxxxPWRUPACK 來響應,即使它不影響電源域。
-
Arm 強烈建議工具僅在 CDBGPWRUPREQ 和 CDBGPWRUPACK 被斷言時才啟動 AP 傳輸。如果 CDBGPWRUPREQ 或 CDBGPWRUPACK 為 LOW,則任何 AP 傳輸都可能生成故障響應。
-
DP 通過置低 CxxxPWRUPREQ 請求斷開域的電源。
當電源控制器接受關閉域的請求時,它會取消斷言 CxxxPWRUPACK。
注意:電源控制器置低 CxxxPWRUPACK,并不表示該域已掉電,僅表示電源控制器已識別并接受斷電請求。 -
CxxxPWRUPACK 必須默認為LOW 狀態,并且只有在收到 CxxxPWRUPREQ 請求時才會變為 HIGH。
-
在檢測到 CxxxPWRUPREQ 的置低后,電源控制器必須正常關閉域,除非從域中移除電源會影響系統操作。例如,如果電源控制器有其他保持電源的請求,它可能會保持對域的電源。
-
通過取消斷言 CxxxPWRUPREQ 請求斷電后,工具必須等到 CxxxPWRUPACK為低電平后才能發出新的上電請求。
此要求確保不違反電源控制握手機制。
第 B2-84 頁的圖 B2-1 顯示了電源控制信號的時序
注意:
Arm 強烈建議在時間 T2 和 T3 之間為 CDBGPWRUPREQ 和 CDBGPWRUPACK 發起所有 AP 事務,如圖 B2-1 所示。
2 調試復位控制行為
Debug reset control behavior
…
AP Access Port
#define AP_CSW 0x00 // Control and Status Word #define AP_TAR 0x04 // Transfer Address #define AP_DRW 0x0C // Data Read/Write #define AP_BD0 0x10 // Banked Data 0 #define AP_BD1 0x14 // Banked Data 1 #define AP_BD2 0x18 // Banked Data 2 #define AP_BD3 0x1C // Banked Data 3 #define AP_ROM 0xF8 // Debug ROM Address #define AP_IDR 0xFC // Identification RegisterAP0_CSW (Control and Status Word Register) 0x00
Mode: 讀取或寫入數據訪問時的自動地址遞增和打包模式。 僅當當前事務完成且沒有錯誤時才會增加。
訪問分組數據寄存器 0x10 - 0x1C 時不會執行自動地址遞增和打包傳輸。 在這些情況下,這些位的狀態將被忽略。
在 4 KB 地址邊界內遞增和回繞,例如對于從 0x1000 到 0x1FFC 的字遞增。 如果從 0x14A0 開始,則計數器遞增到 0x1FFC,回繞到 0x1000,然后繼續遞增到 0x149C。
0b00 自動增量 關閉
0b01 增量 單次。從相應的字節通道進行一次傳輸。
0b10 包 增量
AP4_TAR (Transfer Address Register) 0x04~08
APc_DRW (Data Read/Write Register) 0x0C
AP_BDR0-3 (Banked Data Registers 0-3)
使用這些寄存器直接將AHB-AP訪問映射到AHB傳輸,而無需重寫AHB- AP傳輸地址寄存器(TAR)
提供一種通過 DAP 訪問直接映射到 AHB 傳輸的機制,而無需在四個位置邊界內重寫 TAR,例如 BD0 從 TAR 讀取/寫入,BD1 從 TAR+4 讀取/寫入。
如果 DAPADDR[7:4] == 0x0001,因此訪問 0x10-0x1C 范圍內的 AHB-AP 寄存器,則派生的 HADDR[31:0] 如下:
- 讀取模式:從外部地址 TAR[31:4] + DAPADDR[3:0] 讀取當前傳輸的數據值。 對 BD0-BD3 的 DAP 訪問不執行自動地址遞增。
- 寫入模式:將當前傳輸的數據值寫入外部地址 TAR[31:4] + DAPADDR[3:0]。
BANK 傳輸僅支持 word。 當前忽略非word傳輸大小,假設 word 訪問。
AP_DRAR (Debug ROM Address Register)
IDR (ID Register)
System Debug
系統調試框圖
部分模塊注解:
- Flash Patch and Breakpoint (FPB) unit to implement breakpoints and code
patches. - Data Watchpoint and Trace (DWT) unit to implement watchpoints, trigger
resources, and system profiling. - Instrumentation Trace Macrocell (ITM) for application-driven trace source that
supports printf style debugging - Embedded Trace Macrocell (ETM) for instruction trace. The processor is
supported in versions with and without the ETM. - AHB-AP
- AHB-AP 是 Cortex-M3 系統的調試訪問端口,提供對系統中所有內存和寄存器的訪問,包括通過 NVIC 訪問的處理器寄存器。系統訪問與處理器狀態無關。 SW-DP 或 SWJ-DP 訪問 AHB-AP。
- AHB-AP 是總線矩陣的主控。 事務是使用 AHB-AP 程序員模型進行的,該模型將 AHB-Lite 事務生成到總線矩陣中。 請參閱 AHB-AP 寄存器的摘要和說明。
AHB-AP
AHB-AP 和 MEM-AP 的聯系
The AHB-AP is a Memory Access Port (MEM-AP) as defined in the ARM Debug Interface v5 Architecture Specification. The AHB-AP is an optional debug access port into the Cortex-M3 system, and provides access to all memory and registers in the system, including processor registers through the SCS. System access is independent of the processor status. Either SW-DP or SWJ-DP is used to access the AHB-AP.
AHB-AP是ARM調試接口V5體系結構規范中定義的內存訪問端口(MEM-AP)。AHB-AP是進入Cortex-M3系統的可選調試訪問端口,并提供對系統中所有內存和寄存器的訪問,包括通過SCS的處理器寄存器。系統訪問獨立于處理器狀態。SW-DP或SWJ-DP用于訪問AHB-AP。
The AHB-AP is a master into the Bus Matrix. Transactions are made using the AHB-AP programmers model, which generates AHB-Lite transactions into the Bus Matrix.
AHB-AP是 Bus Matrix 的主機。交換是使用 AHB-AP 編程模型進行的,該模型將 AHB-LITE 轉換生成BUS Matrix。
CSW 0x00
Control and Status Word:
0x2300_0012:
[29]=0b1: Debug is master.
[25]=0b1: Resetvalue = 1. User/Privilege
[24] Reserved = 1
[5:4]=0b01: Increment Single, 一次傳輸
[2:0]=0b010: 32bit
0x2300_0002:
change [5:4]=0b00, 自動增量關閉
- DbgSwEnable, bit[31]
Debug software access enable.調試軟件訪問使能 - Prot, bits[30:24]
與 type 類型字段一起使用,以定義總線訪問保護控制。調試器可以使用這些字段來指定用于調試訪問的標志。 - SDeviceEn, bit[23]
Secure Debug Enabled. 安全調試啟用:
0b0 Secure access 禁用.
0b1 Secure access 使能 - ERRSTOP, bit[17]
Errors prevent future memory accesses. This field has one of the following values:
0b0 Memory access errors do not prevent future memory accesses.
0b1 Memory access errors prevent future memory accesses. - ERRNPASS, bit[16]
Errors are not passed upstream. This field has one of the following values:
0b0 Errors are passed upstream.
0b1 Errors are not passed upstream. - Type, bits[15:12]
Used with the Prot field to define the bus access protection control. - Mode, bits[11:8]
Mode of operation of the MEM-AP. This field has one of the following values:
0b0000 Basic mode.
0b0001 Barrier support enabled. - TrInProg, bit[7]
Transfer in progress. This field has one of the following values:
0b0 The connection to the memory system is idle.
0b1 A transfer is in progress on the connection to the memory system - DeviceEn, bit[6]
Device enabled.
This field has one of the following values:
0b0 The MEM-AP is not enabled.
0b1 Transactions can be issued through the MEM-AP. - AddrInc, bits[5:4]
Address auto-increment and packing mode. This field controls whether the access address
increments automatically on read and write data accesses through the DRW register. - Size, bits[2:0]
The size of the data type that is used to access the MEM-AP,
TAR 0x04~08
如果實現包括大物理地址擴展,則偏移量 0xD04 處的字表示傳輸地址的最低有效字,偏移量 0xD08 處的字表示最高有效字。
如果實現不包括大物理地址擴展,偏移量 0xD04 處的字表示傳輸地址,偏移量 0x08 處的字為 RES0
Tranfer Address:
- [31:0]. ADDRESS.Reset value = 0x00000000.
- Current transfer address.
DRW 0x0C
Data Read/Write
- [31:0]. Reset value = 0x00000000
- DATA Write mode:
- data value to write for the current transfer
- DATA Read mode:
- data value to read for the current transfer
- DATA Write mode:
Bandked Data 4 0x10-0x1C
- [31:0] 數據 BD0-BD3。 復位值:0x00000000。
- 提供一種通過 DAP 訪問直接映射到 AHB 傳輸的機制,而無需在四個位置邊界內重寫 TAR,例如 BD0 從 TAR 讀取/寫入,BD1 從 TAR+4 讀取/寫入。
- 如果 DAPADDR[7:4] == 0x0001,因此訪問 0x10-0x1C 范圍內的 AHB-AP 寄存器,則派生的 HADDR[31:0] 如下:
- 讀取模式:從外部地址 TAR[31:4] + DAPADDR[3:0] 讀取當前傳輸的數據值。 對 BD0-BD3 的 DAP 訪問不執行自動地址遞增。
- 寫入模式:將當前傳輸的數據值寫入外部地址 TAR[31:4] + DAPADDR[3:0]。
- BANK 傳輸僅支持 word。 當前忽略非word傳輸大小,假設 word 訪問。
Debug ROM Address 0xF8
- [31:0] Debug ROM address
- Base address of debug interface
IDR 0xFC
Identification Register
- [31:28] Revision
- This field is zero for the first implementation of an AP design, and is updated
for each major revision of the design.
- This field is zero for the first implementation of an AP design, and is updated
- [27:24] JEP-106 continuation code
- For an ARM-designed AP, this field has value 0b0100, 0x4.
- [23:17] JEP-106 identity code
- For an ARM-designed AP, this field has value 0b0111011, 0x3B.
- [16] Class
- 0b1: This AP is a Memory Access Port
- [15:8] -
- Reserved. SBZ.
- [7:4] AP Variant
- 0x1: Cortex-M3 variant
- [3:0] AP Type
- 0x1: AMBA AHB Bus
SWD 時序
燒錄器往 DP 或 MEM-AP 寄存器的寫操作:
指燒錄器讀取 DP 或 MEM-AP 寄存器的數據:
DAP沒準備好,響應WAIT給HOST,此次通訊結束。
DAP出錯,響應FAULT給HOST,此次通訊結束。
NOTE
1. 請求
主機 HOST 發出的請求由 8bit 組成:
| Bit0 | Start | 固定為 1。 |
| Bit1 | APnDP | 0表示訪問 DP 寄存器,1 表示訪問 MEM-AP 寄存器。 |
| Bit2 | RnW | 0表示寫請求,1表示讀請求。 |
| Bit[4:3] | A[3:2] | 地址值,存放 DP/AP 寄存器的地址。 |
| Bit5 | Parity | 用于表示由{APnDP,RnW, A[2:3]}組成這四位數的奇偶總個數。 |
| Bit6 | Stop | 固定為0。 |
| Bit7 | Park | 固定為1。 |
A2/A3兩位,給出 DP 或 AP 寄存器地址的 A[3:2] 地址字段:
- 對于 DPACC 訪問,被尋址的寄存器取決于 A[3:2] 的值,如果 A[3:2]==0b01,則取決于 SELECT 中保存的值。 DPBANKSEL。 有關詳細信息,請參閱第 B2-51 頁的 DP 架構版本 3 (DPv3) 地址映射。
- 對于 APACC 訪問,被尋址的寄存器取決于 A[3:2] 值和 SELECT.{APSEL,APBANKSEL} 中保存的值。 有關尋址的詳細信息,請參見:
- C2-192 頁的 MEM-AP 程序員模型,用于訪問 MEM-AP 寄存器
- JTAG-AP 程序員模型在 C3-245 頁上,用于訪問 JTAG-AP 寄存器。
比如 DP_Select 的寄存器地址為 0x08(即 0b1000),顯然A[2:3]就為 01。
2. 響應
Target返回的ACK值由3bit組成:
| ACK[0:2]==001 | FAULT |
| ACK[0:2]==010 | WAIT |
| ACK[0:2]==100 | OK response |
3. 數據
由32bit有效數據 + 1bit數據的奇偶校驗位組成
MCU連接過程
操作步驟:
1. SWD初始化
- a. 初始化IO口,SWCLK和SWIO設置為輸出模式,保持SWDIO=1,保證Host連續發送至少50個“1”,使得Target進行Line Reset。
- b. 發送JTAG to SWD命令,0x79、0xE7兩個byte(在ARM-Debug_Interface官方文檔中可以查到),隨后再發送一次line reset操作。
- JATG->SWD: 0111 1001 1110 0111(0x79,0xE7)
- SWD->JTAG: 0011 1100 1110 0111
- JATG->SWD: 0111 1001 1110 0111(0x79,0xE7)
- c. 至少發送兩個Idle信號,保持 SWDIO=0。
- d. 讀取Chip ID,從而完成SWD初始化操作。
注意:此時只能訪問DP寄存器組,AP寄存器組還無法訪問。
2. 解鎖 AP
- a. 寫入 DP_CTRL/STAT寄存器(addr=0x04)數據為0x50000000 (第28位CDBGPWRUPREG和第30位CSYSPERUPREQ),開啟Debug Port及其時鐘.
- b. 寫入 DP_SELECT 寄存器(addr=0x08)數據為 0x000000F0,AP_bank:0xF
- c. 讀取 AP_IDR寄存器(addr = 0xFC)識別數據并驗證。讀取IDR寄存器的數值時,需要兩次,第一次是dummy read,第二次讀取到的才是正確的數據。(第二次也可以讀RDBUFF寄存器)
- d. 寫入DP_SELECT寄存器數據為0x00000000,bank:0x0
- e. 寫入 AP_CSW 寄存器數據為0x00000002,data_size:32bit
Size:訪問MEM-AP的數據類型的大小
其中:寄存器的數據是32bit 0b010,編程寫入Flash的數據是16bit 0b001。
MCU 讀寫操作
如果想要 寫入/讀出 MCU內部Flash的數值,需要用到兩個AP寄存器
- TAR (The Transfer Address Register)
- DRW (The Data Read/Write Register)
寫操作
1)在 TAR_W 寄存器中寫入要訪問的內存地址數值 (addr = 0x08000000)
2)在 DRW_W 寄存器中寫入要往內存中寫入的數據 (data = 0x12345678)
讀操作
1)在 TAR_W 寄存器中寫入要訪問的內存地址數值 (addr = 0x08000000)
2)從 DRW_R 寄存器中讀取要訪問的內存中存放的數據
3)從 DP_RDBUFF寄存器中讀取數據 or 從AP_DRW_R 寄存器中讀取數據
注意
由于讀取AP寄存器的特殊性,當讀取AP寄存器時,返回的數據是上一次傳輸的值。也就是說,有兩種方式可以得到正確的 AP 寄存器的值。
- 發送兩次讀AP_DRW寄存器的操作
- 發送一次讀AP_DRW寄存器的操作(讀取上一周期的數據),再發送一次讀DP_RDBUFF寄存器的操作(讀取自己需要的數據)
總的來說,讀寫DP寄存器沒有遲滯,不需要讀寫兩次。讀取AP寄存器,有遲滯,第一次讀AP,是上一周期的值,第二次讀AP才是想要的值。寫AP寄存器,沒有遲滯,如TAR,DRW只需要寫一次即可寫進去。
原文鏈接
MM32-LINK 測試(MT304)
ARM cortex -M0
理論值 - 0x0BB1_1477
| MT304 | 0x412F_C231 |
| MM0020 | 0x410C_C200 |
1. SWD Connect: read DP_IDCODE
- LineReset(30+30) - JTAG2SWD - LineReset(30+30) - 16b1110_1110_1110_1110(0xEEEE LSB) - LineReset(30+30) - R DP_IDCode(DP0) - OK + 0x2ba01477 - delay 200us2. Set DP_CTRL/STAT PWR UP
- R DP_CTRL/STAT(DP4) - OK+0xF000_0040 - W DP_ABORT(DP0) - OK+0x0000_001e - W DP_CTRL/STAT(DP4) - OK+0x5000_0000 - W DP_SELECT(DP8) - OK+0x0000_0000 - W DP_ABORT(DP0) - OK+0x0000_001e3. Read CPUID(0xE000_ED00)
- W DP_SELECT - OK+0x0000_0000 - W AP_TAR(AP4) - OK+0xE000_ED00(NVIC_CPUID) - W AP_CSW(AP0) - OK+0x2300_0012 - R AP_DRW(APc) - Wait - R AP_DRW(APc) - OK+0xFFFF_FFFF - R DP_RDBUFF(DPc) - OK+0x412F_C231 - delay 120us4. Unknow: Read from 0xE000_1028/38/48/58
- W DP_ABORT(DP0) - OK+0x0000_001E - W DP_SELECT(DP8) - OK+0x0000_0000 - W AP_TAR(AP4) - OK+0xE000_1028 / 0xE000_1038 / 0xE000_1048 / 0xE000_1058 - W AP_CSW(AP0) - OK+0x2300_0012 - W AP_DRW(APc) - OK+0x0000_0000 - R DP_RDBUFF(DPc) - OK+0x412F_C231(Last Time) ??ERROR - W DP_ABORT(DP0) - OK+0x0000_001E5. DBG_HCSR(0xE000_EDF0) = 0xA05F_0003, Halt CPU, DBG_EN
- W DP_SELECT(DP8) - OK+0x0000_0000 - W AP_TAR(AP4) - OK+0xE000_EDF0 - W AP_CSW(AP0) - OK+0x2300_0002 - W AP_DRW(APc) - OK+`0xA05F_0003` - R AP_DRW(APc) - WAIT - R AP_DRW(APc) - OK+0x412F_C231(last time) - R AP_DRW(APc) - OK+0x0103_0003 - W DP_ABORT(DP0) - OK+0x0000_001E - W DP_SELECT(DP8) - OK+0x0000_0000 - W AP_TAR(AP4) - OK+0xE000_EDF0 - W AP_CSW(AP0) - OK+0x2300_0012 // something change: - R AP_DRW(APc) - Wait - R AP_DRW(APc) - OK+0x0003_0003 - R DP_RDBUFF(DPc) - OK+0x0003_0003 - W DP_ABORT(DP0) - OK+0x0000_001E - W DP_SELECT(DP8) - OK+0x0000_00007. DBG_EMCR(0xE000_EDFC) = 0x0100_0001, Catch Reset & Trace
- W AP_TAR(AP4) - OK+`0xE000_EDFC` - W AP_CSW(AP0) - OK+`0x2300_0012` - W AP_DRW(APc) - OK+`0x0100_0001` - send 0x0000( 8 clock no used) - R DP_RDBUFF(DPc) - OK+0x0003_0003 - send ack(3clk) + send 8clk(0x0000) + send 8clk(0x0000) - W DP_ABORT(DP0) - OK+0x0000_001E8. DBG_AIRCR(0xE000_ED0C) = 0x05FA_0004, SYS_RST_REQ
- W DP_ABORT(DP0) - OK+0x0000_001E - W DP_SELECT(DP8) - OK+0x0000_0000 - W AP_TAR(AP4) - OK+0xE000_ED0C - W AP_CSW(AP0) - OK+0x2300_0012 - W AP_DRW(APc) - OK+`0x05FA_0004` - later send 0x00009. nRST = 0. dalay xxms
- 418 us later. - R AP_DRW(APc) - OK+0x0003_0003 - send 3 ack clock, but not used - **18 ms later.**10. nRST = 1. delay 20ms
11. read DBG_HCSR(0xE000_EDF0) 3times
- W DP_ABORT(DP0) - OK+0x0000_001E - W DP_SELECT(DP8) - OK+0x0000_0000 - W AP_TAR(AP4) - OK+0xE000_EDF0 - W AP_CSW(AP0) - OK+0x2300_0012 - R AP_DRW(APc) - WAIT - R AP_DRW(APc) - OK+0x0003_0003 - second time: 0x0203_0003 - third time: 0x0003_0003 - R DP_RDBUFF(DPc) - OK+0x0203_0003 - second time: 0x0003_0003 - third time: 0x0003_000312. DBG_EMCR(0xE000_EDFC) = 0x0100_0000, Trace(3 times)
- W DP_ABORT(DP0) - OK+0x0000_001E - W DP_SELECT(DP8) - OK+0x0000_0000 - W AP_TAR(AP4) - OK+0xE000_EDFC - W AP_CSW(AP0) - OK+0x2300_0012 - W AP_DRW(APc) - OK+0100_0000 - send 8clk(0x0000) / R AP_DRW(APc) - WAIT / OK+0x0100_0000 - R DP_RDBUFF(DPc) - OK+0x0003_0003while true: step11 cycle
總結
總結
以上是生活随笔為你收集整理的ARM Cortex-M 调试器 - 基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 情感小记
- 下一篇: JVM系列之深入理解JVM(三)