ARM Cortex-M 调试器 - 基础知识
文章目錄
- 前言
- Processor memory map
- 內(nèi)核寄存器
- 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
- 總結(jié)
推薦博文1: SWD協(xié)議通信的簡單總結(jié)
前言
根據(jù)《ARM Technical Reference Manual cortex_m3_r1p1_trm》和《Arm? Debug Interface Architecture Specification ADI v6.0.pdf》進(jìn)行梳理。
Processor memory map
內(nèi)核寄存器
Cortex-M3 處理器實(shí)現(xiàn)了ARM v7-M架構(gòu)。這包括整個 16 位的Thumb指令集和基本的 Thumb-2 32位指令集架構(gòu)。處理器無法執(zhí)行ARM指令。
- Thumb 指令集是 ARM 指令集的一個子集,被重新編碼為 16 位。它支持更高的代碼密度和具有 16 位寬或 16 位窄的內(nèi)存數(shù)據(jù)總線的系統(tǒng)。
- Thumb-2 是對 Thumb 指令集體系結(jié)構(gòu)(ISA)的一個主要增強(qiáng)。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,系統(tǒng)級的處理器狀態(tài)分為三類:
-
Application 應(yīng)用程序PSR
-
Interrupt 中斷PSR
-
Execution 執(zhí)行 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 復(fù)位值為 0x411FC231。
根據(jù) CPUID 識別 ARM 內(nèi)核: - 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進(jìn)行整理,可得:
| 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
應(yīng)用程序中斷和復(fù)位控制寄存器 (Application Interrupt/Reset Control Registe)
- [31:16] VECTKEY 。寄存器鍵。寫入這個寄存器需要在 VECTKEY 字段中輸入 0x05FA。否則,寫值將被忽略。
- [31:16] VECTKEYSTAT。讀入 0xFA05
- [15] ENDIANESS。數(shù)據(jù)字節(jié)順序。ENDIANESS 在復(fù)位時從大端輸入端口采樣。您不能在重置之外更改 ENDIANESS
- 1 =大端
- 0 =小端
- [14:11] reserved
- [10:8] 中斷優(yōu)先級分組字段: PRIGROUP 字段是一個二進(jìn)制點(diǎn)位指示符,用于為具有相同搶占級別的異常創(chuàng)建子優(yōu)先級
- [2] SYSRESETREQ:導(dǎo)致向外部系統(tǒng)斷言一個信號,表明請求復(fù)位
用于強(qiáng)制除調(diào)試外的所有主要組件的大型系統(tǒng)重置。設(shè)置此位不會阻止“Halting Debug ”運(yùn)行 - [1] VECTCLRACTIVE:清除活動向量位:
- 1 清除所有活動NMI、故障、中斷的狀態(tài)信息
- 0 =不清除
重新初始化堆棧是應(yīng)用程序的責(zé)任。該位用于在調(diào)試期間返回到已知狀態(tài)。(自動清零)該操作不會清除IPSR。因此,如果應(yīng)用程序使用它,它必須只能在基本激活級別上使用,或者在可以設(shè)置活動位的系統(tǒng)處理程序中使用
- [0] VECTRESET:系統(tǒng)復(fù)位。重置系統(tǒng),除調(diào)試組件外:
- 1 =復(fù)位系統(tǒng)
- 0 =不重啟系統(tǒng)
VECTRESET 位會自動清除。Reset清除 VECTRESET 位。對于調(diào)試,只有當(dāng)core 被 halted 時才寫入此位。
*注意:
SYSRESETREQ 由系統(tǒng)復(fù)位清除,這意味著同時斷言 VECTRESET 可能會導(dǎo)致 SYSRESETREQ 在寫入的同一周期內(nèi)被清除。 這可能會阻止外部系統(tǒng)看到 SYSRESETREQ。 因此,建議獨(dú)占使用 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
核心調(diào)試通過核心調(diào)試寄存器訪問。對這些寄存器的調(diào)試訪問是通過高級高性能總線(AHB-AP)端口進(jìn)行的.處理器可以通過內(nèi)部的私有外圍總線(PPB)直接訪問這些寄存器。
Halt mode debugging / 內(nèi)核 Halt 狀態(tài)下的調(diào)試方法
- 調(diào)試器可以通過設(shè)置調(diào)試暫停控制和狀態(tài)寄存器的 C_DEBUGEN 和 C_HALT 位來暫停內(nèi)核。 內(nèi)核通過設(shè)置調(diào)試停止控制和狀態(tài)寄存器的 S_HALT 位在停止時進(jìn)行確認(rèn)。
- 通過暫停內(nèi)核,將 C_STEP 位設(shè)置為 1,然后將 C_HALT 位清除為 0,內(nèi)核可以單步執(zhí)行。內(nèi)核通過設(shè)置 DBG_HCSR.S_HALT 位確認(rèn)單步完成并重新暫停。
退出內(nèi)核調(diào)試
- Core 可以通過清除調(diào)試停止和狀態(tài)寄存器中的 C_DEBUGEN 位來退出停機(jī)調(diào)試。
DBG_HCSR: 0xE000EDF0
-
C_Halt: Halts the core.
暫停核心。當(dāng)核心停止時,該位是自動設(shè)置的。例如斷點(diǎn)。此位在核心重置時清除。該位只能在 C_DEBUGEN 為 1 時寫入,否則將被忽略。當(dāng)設(shè)置該位為 1 時,C_DEBUGEN 也必須以相同的值寫入1 (值[1:0]為 2’b11)。核心可以停止自己,但只有當(dāng) C_DEBUGEN 已經(jīng)是 1 并且只有當(dāng)它使用 b11 進(jìn)行寫操作時)。 -
C_DebugEN:Enables debug.
啟用調(diào)試。這只能由 AHB-AP 編寫,而不是由 core 編寫。它在內(nèi)核寫入時被忽略,內(nèi)核不能設(shè)置或清除它。當(dāng)寫入 C_HALT 來停止自身時,核心必須向它寫入 1。
READ: -
S_REGRDY:
調(diào)試內(nèi)核寄存器選擇器寄存器上的寄存器讀/寫可用。 最后一次傳輸完成。 -
S_HALT
當(dāng) S_HALT 為高時,內(nèi)核處于調(diào)試狀態(tài) -
S_SLEEP
表示內(nèi)核正在休眠.WFI、WFE 或 SLEEP-ON-EXIT, 必須使用 C_HALT 來獲得控制權(quán)或等待中斷喚醒。 -
S_LOCKUP:
如果內(nèi)核正在運(yùn)行(未停止)并且存在鎖定條件,則讀取為 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
表示自從上次讀取該位以來,內(nèi)核已被復(fù)位或正在被復(fù)位。 這是一個在讀取時清除的粘性位。 因此,讀取兩次并得到 1 然后 0 意味著它在過去被重置。 讀取兩次并獲得 1 意味著它現(xiàn)在正在重置(仍然保持在重置狀態(tài))。
DBG_CRSR: 0xE000EDF4
DBG_CRDR: 0xE000EDF8
DBG_EMCR: 0xE000EDFC
- VC_CoreReset: Reset Vector Catch.
復(fù)位向量。如果內(nèi)核 Core 發(fā)生復(fù)位,停止正在運(yùn)行的系統(tǒng) - TRCENA:
該位必須設(shè)置為 1 以啟用跟蹤和調(diào)試塊:數(shù)據(jù)觀察點(diǎn)和跟蹤 (DWT)/儀器跟蹤宏單元 (ITM)/嵌入式跟蹤宏單元 (ETM)/跟蹤端口接口單元(TPIU). 除非需要跟蹤,否則這可以控制電源使用。 應(yīng)用程序可以啟用此功能,供 ITM 使用或由調(diào)試器使用。
注意:如果 TIEOFF_TRCENA 定義在實(shí)施期間在 CM3Defs.v 中未注釋,則無法設(shè)置 TRCENA。 - MON_REQ:
這使監(jiān)視器能夠確定其喚醒的原因:1 =由 MON_PEND; 0 = debug異常喚醒。 - MON_STEP:
當(dāng) MON_EN = 1 時,這會步進(jìn)內(nèi)核。 當(dāng) MON_EN = 0 時,該位被忽略。 這相當(dāng)于 C_STEP。 中斷僅根據(jù)監(jiān)視器的優(yōu)先級和 PRIMASK、FAULTMASK 或 BASEPRI 的設(shè)置進(jìn)行步進(jìn)。 - MON_PEND:
當(dāng)優(yōu)先級允許時,掛起監(jiān)視器以激活。 這可以通過 AHB-AP 端口喚醒顯示器。 它等效于用于監(jiān)視器調(diào)試的 C_HALT。該寄存器不會在系統(tǒng)復(fù)位時復(fù)位。 它只能通過上電復(fù)位來復(fù)位。 復(fù)位處理程序或更高版本中的軟件,或由 DAP 提供的軟件必須啟用調(diào)試監(jiān)視器。 - MON_EN:Enable the debug monitor.
啟用調(diào)試監(jiān)視器。 啟用后,系統(tǒng)處理程序優(yōu)先級寄存器控制其優(yōu)先級。 如果禁用,則所有調(diào)試事件都會進(jìn)入硬故障。 調(diào)試停止控制和狀態(tài)寄存器中的 C_DEBUGEN 覆蓋該位。矢量捕獲是半同步的。 當(dāng)看到匹配事件時,請求停止。 因?yàn)樘幚砥髦荒茉谥噶钸吔缟贤V?#xff0c;它必須等到下一個指令邊界。 結(jié)果,它在異常處理程序的第一條指令處停止。 但是,當(dāng)向量捕獲已觸發(fā)時,存在兩種特殊情況:- 如果在向量化、向量讀取或堆棧推送錯誤期間發(fā)生故障,則在或響應(yīng)的故障處理程序上發(fā)生停止,用于向量錯誤或堆棧推送。- 如果在引導(dǎo)過程中出現(xiàn)遲到的中斷,則不接受。 也就是說,在這種情況下,支持延遲到達(dá)優(yōu)化的實(shí)現(xiàn)必須抑制它。 - 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
重置向量捕獲。 如果發(fā)生核心重置,則停止運(yùn)行系統(tǒng)。僅當(dāng) C_DEBUGEN = 1 時可用。
該寄存器不會在系統(tǒng)復(fù)位時復(fù)位。該寄存器由上電復(fù)位復(fù)位。 位 [19:16] 總是在內(nèi)核復(fù)位時清零。調(diào)試監(jiān)視器由復(fù)位處理程序或更高版本中的軟件啟用,或者由 AHB-AP 端口啟用。
矢量捕獲是半同步的。 當(dāng)看到匹配事件時,請求停止。 因?yàn)樘幚砥髦荒茉谥噶钸吔缟贤V?#xff0c;它必須等到下一個指令邊界。 結(jié)果,它在異常處理程序的第一條指令處停止。 但是,當(dāng)向量捕獲已觸發(fā)時,存在兩種特殊情況:- 如果在向量讀取或堆棧推送錯誤期間發(fā)生故障,則在向量錯誤或堆棧推送的相應(yīng)故障處理程序上發(fā)生暫停。- 如果在向量讀取或堆棧推入錯誤期間檢測到遲到中斷,則不接受。 也就是說,在這種情況下,支持遲到優(yōu)化的實(shí)現(xiàn)必須抑制它。
矢量捕獲只能用于停止調(diào)試。高16位是用于監(jiān)控控制,低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 寫入數(shù)據(jù)錯誤位清除到 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 寫入該位。 是否實(shí)現(xiàn) CTRL/STAT.STICKYCMP 位由實(shí)現(xiàn)定義。
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]
要生成中止當(dāng)前 AP 事務(wù)的 AP 中止,請將 0b1 寫入該位。
僅當(dāng)調(diào)試器在較長時間內(nèi)收到 WAIT 響應(yīng)時才執(zhí)行此寫入操作。
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.
系統(tǒng)上電確認(rèn)。 指示 CSYSPWRUPACK 信號的狀態(tài)。 - CSYSPWRUPREQ, bit[30], rw. System powerup request.
系統(tǒng)上電請求。 該位控制 CSYSPWRUPREQ 信號。上電復(fù)位后,該位為 0b0。 - CDBGPWRUPACK, bit[29], ro. Debug powerup acknowledge.
調(diào)試上電確認(rèn)。 指示 CDBGPWRUPACK 信號的狀態(tài)。 - CDBGPWRUPREQ, bit[28]. Debug powerup request.
調(diào)試上電請求。 該位控制 CDBGPWRUPREQ 信號。 上電復(fù)位后,該位為 0b0。 - CDBGRSTACK, bit[27] ro. Debug reset acknowledge.
調(diào)試復(fù)位確認(rèn)。 指示 CDBGRSTACK 信號的狀態(tài)。 請參閱調(diào)試重置控制行為(Debug reset control behavior on page B2-86). - CDBGRSTREQ, bit[26]. Debug reset request.
調(diào)試復(fù)位請求。 該位控制 CDBGRSTREQ 信號。 該位是 RW 還是 RAZ/WI 由實(shí)現(xiàn)定義。 上電復(fù)位后,該位為 0b0。 - ERRMODE, bit[24].
錯誤模式。 指示 CTRL/STAT.STICKYERR 字段的重置行為。 0b0:AP 事務(wù)設(shè)置錯誤 CTRL/STAT.STICKYERR 和 CTRL/STAT.STICKYERR 保持設(shè)置直到明確清除。 0b1:AP 事務(wù)上的錯誤設(shè)置 CTRL/STAT.STICKYERR,當(dāng)輸出 FAULT 響應(yīng)時清除 CTRL/STAT.STICKYERR。
如果 ERRMODE 為 0b1,則 AP 事務(wù)上發(fā)生的錯誤可能會通過 FAULT 報(bào)告給調(diào)試器 響應(yīng),但不需要調(diào)試器顯式清除 CTRL/STAT.STICKYERR。 導(dǎo)致 FAULT 響應(yīng)的 JTAG-DP 或 SW-DP 事務(wù)不成功,并且 CTRL/STAT.STICKYERR 被清除為 0b0,允許嘗試將來的事務(wù)。 上電復(fù)位后,該字段的值為 0b0。 - TRNCNT, bits[23:12]. Transaction counter.
交易計(jì)數(shù)器。 上電復(fù)位后,該字段的值為 UNKNOWN。
注意:該字段是否實(shí)現(xiàn)由 IMPLEMENTATION DEFINED 定義。 MINDP 配置中不支持 TRNCNT。 在 MINDP 配置中,將非零值寫入 TRNCNT 或 TRNMODE 的效果是 UNPREDICTABLE。 - MASKLANE, bits[11:8]
對于推送操作,DP 對 AP 寫事務(wù)中提供的字與目標(biāo) AP 地址處的當(dāng)前字進(jìn)行逐字節(jié)比較。 MASKLANE 字段用于選擇要包含在此比較中的字節(jié)。 MASKLANE 字段的四位中的每一位對應(yīng)于要比較的字的四個字節(jié)之一。 因此,每一位被稱為控制比較操作的一個字節(jié)通道。
表 B2-4 顯示了 MASKLANE 的位如何控制比較屏蔽。。
- a: 是否包含其他位由 MASKLANE 的其他位決定:為了比較整個字,將 MASKLANE 設(shè)置為 0b1111 以包含所有字節(jié)通道。 如果 MASKLANE 位為 0b0,則從比較中排除相應(yīng)的字節(jié)通道。
注意:以下內(nèi)容適用于 MASKLANE 字段: - MASKLANE 僅在傳輸模式字段 TRNMODE 為 0b01(用于推送驗(yàn)證操作)或 0b10(用于推送比較操作)時才相關(guān)。 上電復(fù)位后,MASKLANE 的值為未知
- a: 是否包含其他位由 MASKLANE 的其他位決定:為了比較整個字,將 MASKLANE 設(shè)置為 0b1111 以包含所有字節(jié)通道。 如果 MASKLANE 位為 0b0,則從比較中排除相應(yīng)的字節(jié)通道。
- WDATAERR, bit[7] . Write Data Error.
如果發(fā)生以下寫入數(shù)據(jù)錯誤之一,則該位設(shè)置為 0b1: - 寫入數(shù)據(jù)階段的奇偶校驗(yàn)或幀錯誤。 - 已被 DP 接受的寫入將被丟棄而不提交給 AP。 SW-DP,所有實(shí)現(xiàn):訪問是 RO/WI。 要將 WDATAERR 清除為 0b0,請將 0b1 寫入 ABORT 寄存器中的 ABORT.WDERRCLR 字段。 如有必要,可以使用 ABORT 寄存器的單次寫入來清除多個標(biāo)志。 清除 WDATAERR 標(biāo)志后,通常必須重新發(fā)送損壞的數(shù)據(jù)。 上電復(fù)位后,WDATAERR 為 0b0. - READOK, bit[6]
在 SW-DP 上,訪問是 RO/WI。如果對先前 AP 讀取或 RDBUFF 讀取的響應(yīng)是 OK,則該位設(shè)置為 0b1。 如果響應(yīng)不正常,則清零為 0b0。此標(biāo)志始終指示對最后一次 AP 讀取訪問的響應(yīng)。 上電復(fù)位后,該位為 0b. - STICKYERR, bit[5]
如果 AP 事務(wù)返回錯誤,則該位設(shè)置為 0b1 - STICKYCMP, bit[4]
當(dāng)在推送比較操作期間發(fā)生不匹配或在推送驗(yàn)證操作期間發(fā)生匹配時,該位設(shè)置為 0b1. - TRNMODE, bits[3:2]
此字段設(shè)置 AP 操作的傳輸模式。- 在正常操作中,AP 交易被傳遞給 AP 進(jìn)行處理;- 在推送驗(yàn)證和推送比較操作中,DP 將 AP 寫入事務(wù)中提供的值與目標(biāo) AP 地址中保存的值進(jìn)行比較。TRNMODE 可以具有以下值之一:- 0b00 正常操作。- 0b01 推送驗(yàn)證模式。- 0b10 推送比較模式。- 0b11 保留。上電復(fù)位后,該字段的值為未知. - STICKYORUN, bit[1]
如果啟用了溢出檢測,則在發(fā)生溢出時該位設(shè)置為 0b1。SW-DP:訪問為 RO/WI。要將 STICKYORUN 清零為 0b0,請將 0b1 寫入 ABORT 寄存器中的 ABORT.ORUNERRCLR 字段。 如有必要,可以使用 ABORT 寄存器的單次寫入來清除多個標(biāo)志。在清除 CTRL/STAT.STICKYORUN 后,您必須找出哪個 DP 或 AP 事務(wù)引發(fā)了導(dǎo)致設(shè)置標(biāo)志的溢出,并重復(fù)這些事務(wù) 事務(wù)計(jì)數(shù)器指向的事務(wù)中的 DP 或 AP。上電復(fù)位后,該位為 0b0. - ORUNDETECT, bit[0] 。Overrun detection
0b0 溢出檢測被禁用。0b1 啟用溢出檢測。上電復(fù)位后,該位為 0b0
DP8_SELECT (0x08 SW W)
- APSEL=0X00: 表示AHB訪問
- APBANKSEL: 選擇當(dāng)前AP的 bank 地址。
DP8_RESEND register 0x08 (SW R)
DPc_RDBUFF register 0x0C (SW R)
NOTE: 電源和復(fù)位控制
DP 支持 CTRL/STAT 寄存器中的以下電源和復(fù)位控制字段:
- 系統(tǒng)和調(diào)試電源控制、CDBGPWRUPREQ、CDBGPWRUPACK、CSYSPWRUPREQ 和 CSYSPWRUPACK 的控制字段。有關(guān)詳細(xì)信息,請參閱2.1節(jié)《系統(tǒng)和調(diào)試電源控制行為 System and debug power control behavior》。
- 調(diào)試復(fù)位控制、CDBGRSTREQ 和 CDBGRSTACK 的控制字段。有關(guān)詳細(xì)信息,請參閱 2.2節(jié)《調(diào)試復(fù)位控制行為》。
這些控制位可由調(diào)試器編程,并將信號驅(qū)動到目標(biāo)系統(tǒng)。
當(dāng)由 CTRL/STAT 寄存器中的電源和復(fù)位控制字段控制時,可以使用 CDBGRSTREQ 字段實(shí)現(xiàn)調(diào)試邏輯復(fù)位,但 CTRL/STAT 不提供任何用于請求系統(tǒng)復(fù)位的控制位。然而,調(diào)試器的物理接口通常包含一個系統(tǒng)復(fù)位引腳 nSRST,它旨在為現(xiàn)有的電源和復(fù)位控制器提供提示或激勵。有關(guān)如何實(shí)現(xiàn)系統(tǒng)復(fù)位管腳的詳細(xì)信息,請參見第 B2-88 頁的系統(tǒng)復(fù)位控制行為。
Arm 建議僅將 CDBGRSTREQ 用作解除鎖定系統(tǒng)阻塞的最后手段。 CDBGRSTREQ 可能影響的不僅僅是鎖定邏輯,必須小心使用。
nSRST 也可能導(dǎo)致調(diào)試邏輯復(fù)位,但需要釋放調(diào)試邏輯復(fù)位以允許調(diào)試器在保持系統(tǒng)復(fù)位的同時對調(diào)試邏輯進(jìn)行編程。
ADI不更換系統(tǒng)電源和復(fù)位控制器,ADI規(guī)范對系統(tǒng)電源和復(fù)位控制器的操作沒有任何要求
電源控制要求和操作。
**1 系統(tǒng)和調(diào)試電源控制行為 **
System and debug power control behavior
1.1 ADI功率域模型
The ADI power domains model ADI 支持多個電源域,為可斷電的調(diào)試組件提供支持。實(shí)現(xiàn)對三個電源域進(jìn)行建模:
- Always-on power domain :必須(始終)上電的區(qū)域,用于debugger連接device。必須為調(diào)試器上電才能連接到設(shè)備的電源域 [感謝評論區(qū)1層層主建議]
- 系統(tǒng)電源域:包括系統(tǒng)組件的電源域。
- 調(diào)試電源域:包括整個調(diào)試子系統(tǒng)的電源域。
如有必要,可以細(xì)分系統(tǒng)和調(diào)試電源域。然而,要定義一個簡單的調(diào)試接口,必須在頂層將設(shè)備劃分為系統(tǒng)和調(diào)試電源域。任何更細(xì)粒度的控制都超出了此模型的范圍。
在大多數(shù)情況下,調(diào)試器會啟動整個 SoC。但是,如果調(diào)試器正在調(diào)查電源管理問題,它可能只想啟動調(diào)試域。為了實(shí)現(xiàn)這一目標(biāo),SoC 設(shè)計(jì)人員可能希望將電源控制器映射到一個總線段,當(dāng)只有調(diào)試電源域上電時,ADI 可以訪問該總線段。
使用 ADI 時,為了使調(diào)試過程正常工作,系統(tǒng)不得在調(diào)試會話期間斷開 DP 的電源。如果斷電,DP 控制器狀態(tài)將丟失。但是,ADI 旨在允許 ADI 的其余部分和系統(tǒng)在保持對 DP 供電的同時斷電和調(diào)試。
DP 寄存器位于始終開啟的電源域中,位于 DP 的外部接口側(cè)。因此,它們始終可以被驅(qū)動,從而能夠向系統(tǒng)電源控制器發(fā)出上電請求。電源和復(fù)位控制位是 DP CTRL/STAT 寄存器的一部分。有關(guān)此寄存器中的復(fù)位控制位的更多信息,請參見第 B2-86 頁的調(diào)試復(fù)位控制行為。
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 是從調(diào)試接口到電源控制器的信號。該信號請求系統(tǒng)電源控制器完全上電并確保時鐘在調(diào)試電源域中可用。
CDBGPWRUPACK 是從電源控制器到調(diào)試接口的信號。當(dāng) CDBGPWRUPREQ 置位時,電源控制器啟動調(diào)試電源域,然后置位 CDBGPWRUPACK 以確認(rèn)它已響應(yīng)請求。
哪些組件在由 CDBGPWRUPREQ 控制的調(diào)試電源域中是實(shí)現(xiàn)定義的。例如,此域可能包括系統(tǒng)中的所有調(diào)試組件,或者可能僅限于排除具有額外功率控制級別的組件。CDBGPWRUPREQ 信號指示調(diào)試器需要這些組件的調(diào)試資源是可通信的。通信意味著調(diào)試器可以訪問至少足夠的調(diào)試資源寄存器,以確定資源的狀態(tài)。
資源是否處于活動狀態(tài)由實(shí)現(xiàn)定義。電源和時鐘控制器必須加電并運(yùn)行所需數(shù)量的域的時鐘,以符合來自調(diào)試器的此請求,以使資源可通信。
只要 CDBGPWRUPREQ 被斷言,電源和時鐘控制器就必須遵守它。例如,如果調(diào)試電源域中的組件請求斷電,則必須針對該電源域內(nèi)的非調(diào)試邏輯模擬該請求,包括具有單個共享域的所有組件。
如果某個組件的某些調(diào)試資源不在調(diào)試電源域中,則至少該組件的最小調(diào)試接口必須上電。如果滿足以下要求,則可以從組件的其余部分移除電源:
- 有一些方法可以保存和恢復(fù)調(diào)試資源的狀態(tài)。
- 當(dāng)組件的其余部分未通電時,調(diào)試器可以與調(diào)試資源通信。
保存和恢復(fù)這些資源中保存的值的方法可能包括軟件解決方案。如果當(dāng)從組件的其余部分移除電源時調(diào)試資源確實(shí)失去了它們的價值,那么調(diào)試接口必須包括讓調(diào)試器發(fā)現(xiàn)編程值已經(jīng)丟失的裝置。
CDBGPWRUPACK 是 CDBGPWRUPREQ 請求信號的確認(rèn)信號。只要 CDBGPWRUPREQ 被斷言,CDBGPWRUPACK 就必須被斷言。請參見第 B2-84 頁的上電請求和確認(rèn)時間。
1.1.2 CSYSPWRUPREQ and CSYSPWRUPACK
CSYSPWRUPREQ 是從調(diào)試接口到電源控制器的信號。該信號請求系統(tǒng)電源控制器完全啟動并確保時鐘在系統(tǒng)電源域中可用。
CSYSPWRUPACK 是從電源控制器到調(diào)試接口的信號。當(dāng) CSYSPWRUPREQ 置位時,電源控制器啟動系統(tǒng)電源域,然后置位 CSYSPWRUPACK 以確認(rèn)它已響應(yīng)請求。
由 CSYSPWRUPREQ 控制的系統(tǒng)電源域中的哪些組件是實(shí)現(xiàn)定義的。此域可能包括系統(tǒng)中的所有調(diào)試組件,或者可能受到限制,例如排除具有額外功率控制級別的組件,例如實(shí)現(xiàn)獨(dú)立核心的處理器
通電請求控件。
CSYSPWRUPREQ 信號指示調(diào)試器需要這些組件的所有調(diào)試資源處于活動狀態(tài)。激活意味著調(diào)試資源可以執(zhí)行其調(diào)試功能。一個活躍的資源也是可以交流的。
只要 CSYSPWRUPREQ 被斷言,電源和時鐘控制器就必須遵守它。
CSYSPWRUPREQ 對由 CDBGPWRUPREQ 控制的調(diào)試組件沒有影響,因?yàn)檫@些組件在系統(tǒng)電源域中沒有調(diào)試邏輯。但是,對于某些調(diào)試資源位于由 CSYSPWRUPREQ 控制的系統(tǒng)電源域中的組件,必須為該電源域內(nèi)的非調(diào)試邏輯模擬請求。
CSYSPWRUPACK 是 CSYSPWRUPREQ 請求信號的確認(rèn)信號。只要 CSYSPWRUPREQ 被斷言,CSYSPWRUPACK 就必須被斷言。請參閱第 B2-84 頁的上電請求和確認(rèn)時間。
當(dāng) CSYSPWRUPREQ 被調(diào)試器斷言時,CDBGPWRUPREQ 也必須被斷言。
1.2 電源控制要求和操作
Power control requirements and operation
本節(jié)適用于 system 和 debug 域,并使用以下符號:
- CxxxPWRUPREQ 指的是 CSYSPWRUPREQ 或 CDBGPWRUPREQ。
- CxxxPWRUPACK 是指 CSYSPWRUPACK 或 CDBGPWRUPACK。
本節(jié)中描述的所有信號都是高電平有效,因此 assert 表示將信號設(shè)為高電平,而 deassert 表示將信號設(shè)為低電平。
powerup 請求和確認(rèn)的操作規(guī)則是:
-
調(diào)試器不得同時將 CTRL/STAT.CSYSPWRUPREQ 設(shè)為1 、CTRL/STAT.CDBGPWRUPREQ 設(shè)為0。對這種請求組合的響應(yīng)是不可預(yù)測的。
-
要初始化powerup,DP 必須斷言 CxxxPWRUPREQ。
- 如果相應(yīng)的電源域斷電或處于低功耗保持狀態(tài),則電源控制器必須在檢測到 CxxxPWRUPREQ 被斷言時為域上電。域上電后,控制器必須置位 CxxxPWRUPACK。
- 如果在電源控制器檢測到 CxxxPWRUPREQ 被置位時相應(yīng)的電源域已經(jīng)上電,控制器仍必須通過置位 CxxxPWRUPACK 來響應(yīng),即使它不影響電源域。
-
Arm 強(qiáng)烈建議工具僅在 CDBGPWRUPREQ 和 CDBGPWRUPACK 被斷言時才啟動 AP 傳輸。如果 CDBGPWRUPREQ 或 CDBGPWRUPACK 為 LOW,則任何 AP 傳輸都可能生成故障響應(yīng)。
-
DP 通過置低 CxxxPWRUPREQ 請求斷開域的電源。
當(dāng)電源控制器接受關(guān)閉域的請求時,它會取消斷言 CxxxPWRUPACK。
注意:電源控制器置低 CxxxPWRUPACK,并不表示該域已掉電,僅表示電源控制器已識別并接受斷電請求。 -
CxxxPWRUPACK 必須默認(rèn)為LOW 狀態(tài),并且只有在收到 CxxxPWRUPREQ 請求時才會變?yōu)?HIGH。
-
在檢測到 CxxxPWRUPREQ 的置低后,電源控制器必須正常關(guān)閉域,除非從域中移除電源會影響系統(tǒng)操作。例如,如果電源控制器有其他保持電源的請求,它可能會保持對域的電源。
-
通過取消斷言 CxxxPWRUPREQ 請求斷電后,工具必須等到 CxxxPWRUPACK為低電平后才能發(fā)出新的上電請求。
此要求確保不違反電源控制握手機(jī)制。
第 B2-84 頁的圖 B2-1 顯示了電源控制信號的時序
注意:
Arm 強(qiáng)烈建議在時間 T2 和 T3 之間為 CDBGPWRUPREQ 和 CDBGPWRUPACK 發(fā)起所有 AP 事務(wù),如圖 B2-1 所示。
2 調(diào)試復(fù)位控制行為
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: 讀取或?qū)懭霐?shù)據(jù)訪問時的自動地址遞增和打包模式。 僅當(dāng)當(dāng)前事務(wù)完成且沒有錯誤時才會增加。
訪問分組數(shù)據(jù)寄存器 0x10 - 0x1C 時不會執(zhí)行自動地址遞增和打包傳輸。 在這些情況下,這些位的狀態(tài)將被忽略。
在 4 KB 地址邊界內(nèi)遞增和回繞,例如對于從 0x1000 到 0x1FFC 的字遞增。 如果從 0x14A0 開始,則計(jì)數(shù)器遞增到 0x1FFC,回繞到 0x1000,然后繼續(xù)遞增到 0x149C。
0b00 自動增量 關(guān)閉
0b01 增量 單次。從相應(yīng)的字節(jié)通道進(jìn)行一次傳輸。
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傳輸?shù)刂芳拇嫫?TAR)
提供一種通過 DAP 訪問直接映射到 AHB 傳輸?shù)臋C(jī)制,而無需在四個位置邊界內(nèi)重寫 TAR,例如 BD0 從 TAR 讀取/寫入,BD1 從 TAR+4 讀取/寫入。
如果 DAPADDR[7:4] == 0x0001,因此訪問 0x10-0x1C 范圍內(nèi)的 AHB-AP 寄存器,則派生的 HADDR[31:0] 如下:
- 讀取模式:從外部地址 TAR[31:4] + DAPADDR[3:0] 讀取當(dāng)前傳輸?shù)臄?shù)據(jù)值。 對 BD0-BD3 的 DAP 訪問不執(zhí)行自動地址遞增。
- 寫入模式:將當(dāng)前傳輸?shù)臄?shù)據(jù)值寫入外部地址 TAR[31:4] + DAPADDR[3:0]。
BANK 傳輸僅支持 word。 當(dāng)前忽略非word傳輸大小,假設(shè) word 訪問。
AP_DRAR (Debug ROM Address Register)
IDR (ID Register)
System Debug
系統(tǒng)調(diào)試框圖
部分模塊注解:
- 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 系統(tǒng)的調(diào)試訪問端口,提供對系統(tǒng)中所有內(nèi)存和寄存器的訪問,包括通過 NVIC 訪問的處理器寄存器。系統(tǒng)訪問與處理器狀態(tài)無關(guān)。 SW-DP 或 SWJ-DP 訪問 AHB-AP。
- AHB-AP 是總線矩陣的主控。 事務(wù)是使用 AHB-AP 程序員模型進(jìn)行的,該模型將 AHB-Lite 事務(wù)生成到總線矩陣中。 請參閱 AHB-AP 寄存器的摘要和說明。
AHB-AP
AHB-AP 和 MEM-AP 的聯(lián)系
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調(diào)試接口V5體系結(jié)構(gòu)規(guī)范中定義的內(nèi)存訪問端口(MEM-AP)。AHB-AP是進(jìn)入Cortex-M3系統(tǒng)的可選調(diào)試訪問端口,并提供對系統(tǒng)中所有內(nèi)存和寄存器的訪問,包括通過SCS的處理器寄存器。系統(tǒng)訪問獨(dú)立于處理器狀態(tài)。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 的主機(jī)。交換是使用 AHB-AP 編程模型進(jìn)行的,該模型將 AHB-LITE 轉(zhuǎn)換生成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, 自動增量關(guān)閉
- DbgSwEnable, bit[31]
Debug software access enable.調(diào)試軟件訪問使能 - Prot, bits[30:24]
與 type 類型字段一起使用,以定義總線訪問保護(hù)控制。調(diào)試器可以使用這些字段來指定用于調(diào)試訪問的標(biāo)志。 - SDeviceEn, bit[23]
Secure Debug Enabled. 安全調(diào)試啟用:
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
如果實(shí)現(xiàn)包括大物理地址擴(kuò)展,則偏移量 0xD04 處的字表示傳輸?shù)刂返淖畹陀行ё?#xff0c;偏移量 0xD08 處的字表示最高有效字。
如果實(shí)現(xiàn)不包括大物理地址擴(kuò)展,偏移量 0xD04 處的字表示傳輸?shù)刂?#xff0c;偏移量 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] 數(shù)據(jù) BD0-BD3。 復(fù)位值:0x00000000。
- 提供一種通過 DAP 訪問直接映射到 AHB 傳輸?shù)臋C(jī)制,而無需在四個位置邊界內(nèi)重寫 TAR,例如 BD0 從 TAR 讀取/寫入,BD1 從 TAR+4 讀取/寫入。
- 如果 DAPADDR[7:4] == 0x0001,因此訪問 0x10-0x1C 范圍內(nèi)的 AHB-AP 寄存器,則派生的 HADDR[31:0] 如下:
- 讀取模式:從外部地址 TAR[31:4] + DAPADDR[3:0] 讀取當(dāng)前傳輸?shù)臄?shù)據(jù)值。 對 BD0-BD3 的 DAP 訪問不執(zhí)行自動地址遞增。
- 寫入模式:將當(dāng)前傳輸?shù)臄?shù)據(jù)值寫入外部地址 TAR[31:4] + DAPADDR[3:0]。
- BANK 傳輸僅支持 word。 當(dāng)前忽略非word傳輸大小,假設(shè) 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 寄存器的數(shù)據(jù):
DAP沒準(zhǔn)備好,響應(yīng)WAIT給HOST,此次通訊結(jié)束。
DAP出錯,響應(yīng)FAULT給HOST,此次通訊結(jié)束。
NOTE
1. 請求
主機(jī) HOST 發(fā)出的請求由 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]}組成這四位數(shù)的奇偶總個數(shù)。 |
| Bit6 | Stop | 固定為0。 |
| Bit7 | Park | 固定為1。 |
A2/A3兩位,給出 DP 或 AP 寄存器地址的 A[3:2] 地址字段:
- 對于 DPACC 訪問,被尋址的寄存器取決于 A[3:2] 的值,如果 A[3:2]==0b01,則取決于 SELECT 中保存的值。 DPBANKSEL。 有關(guān)詳細(xì)信息,請參閱第 B2-51 頁的 DP 架構(gòu)版本 3 (DPv3) 地址映射。
- 對于 APACC 訪問,被尋址的寄存器取決于 A[3:2] 值和 SELECT.{APSEL,APBANKSEL} 中保存的值。 有關(guān)尋址的詳細(xì)信息,請參見:
- C2-192 頁的 MEM-AP 程序員模型,用于訪問 MEM-AP 寄存器
- JTAG-AP 程序員模型在 C3-245 頁上,用于訪問 JTAG-AP 寄存器。
比如 DP_Select 的寄存器地址為 0x08(即 0b1000),顯然A[2:3]就為 01。
2. 響應(yīng)
Target返回的ACK值由3bit組成:
| ACK[0:2]==001 | FAULT |
| ACK[0:2]==010 | WAIT |
| ACK[0:2]==100 | OK response |
3. 數(shù)據(jù)
由32bit有效數(shù)據(jù) + 1bit數(shù)據(jù)的奇偶校驗(yàn)位組成
MCU連接過程
操作步驟:
1. SWD初始化
- a. 初始化IO口,SWCLK和SWIO設(shè)置為輸出模式,保持SWDIO=1,保證Host連續(xù)發(fā)送至少50個“1”,使得Target進(jìn)行Line Reset。
- b. 發(fā)送JTAG to SWD命令,0x79、0xE7兩個byte(在ARM-Debug_Interface官方文檔中可以查到),隨后再發(fā)送一次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. 至少發(fā)送兩個Idle信號,保持 SWDIO=0。
- d. 讀取Chip ID,從而完成SWD初始化操作。
注意:此時只能訪問DP寄存器組,AP寄存器組還無法訪問。
2. 解鎖 AP
- a. 寫入 DP_CTRL/STAT寄存器(addr=0x04)數(shù)據(jù)為0x50000000 (第28位CDBGPWRUPREG和第30位CSYSPERUPREQ),開啟Debug Port及其時鐘.
- b. 寫入 DP_SELECT 寄存器(addr=0x08)數(shù)據(jù)為 0x000000F0,AP_bank:0xF
- c. 讀取 AP_IDR寄存器(addr = 0xFC)識別數(shù)據(jù)并驗(yàn)證。讀取IDR寄存器的數(shù)值時,需要兩次,第一次是dummy read,第二次讀取到的才是正確的數(shù)據(jù)。(第二次也可以讀RDBUFF寄存器)
- d. 寫入DP_SELECT寄存器數(shù)據(jù)為0x00000000,bank:0x0
- e. 寫入 AP_CSW 寄存器數(shù)據(jù)為0x00000002,data_size:32bit
Size:訪問MEM-AP的數(shù)據(jù)類型的大小
其中:寄存器的數(shù)據(jù)是32bit 0b010,編程寫入Flash的數(shù)據(jù)是16bit 0b001。
MCU 讀寫操作
如果想要 寫入/讀出 MCU內(nèi)部Flash的數(shù)值,需要用到兩個AP寄存器
- TAR (The Transfer Address Register)
- DRW (The Data Read/Write Register)
寫操作
1)在 TAR_W 寄存器中寫入要訪問的內(nèi)存地址數(shù)值 (addr = 0x08000000)
2)在 DRW_W 寄存器中寫入要往內(nèi)存中寫入的數(shù)據(jù) (data = 0x12345678)
讀操作
1)在 TAR_W 寄存器中寫入要訪問的內(nèi)存地址數(shù)值 (addr = 0x08000000)
2)從 DRW_R 寄存器中讀取要訪問的內(nèi)存中存放的數(shù)據(jù)
3)從 DP_RDBUFF寄存器中讀取數(shù)據(jù) or 從AP_DRW_R 寄存器中讀取數(shù)據(jù)
注意
由于讀取AP寄存器的特殊性,當(dāng)讀取AP寄存器時,返回的數(shù)據(jù)是上一次傳輸?shù)闹怠R簿褪钦f,有兩種方式可以得到正確的 AP 寄存器的值。
- 發(fā)送兩次讀AP_DRW寄存器的操作
- 發(fā)送一次讀AP_DRW寄存器的操作(讀取上一周期的數(shù)據(jù)),再發(fā)送一次讀DP_RDBUFF寄存器的操作(讀取自己需要的數(shù)據(jù))
總的來說,讀寫DP寄存器沒有遲滯,不需要讀寫兩次。讀取AP寄存器,有遲滯,第一次讀AP,是上一周期的值,第二次讀AP才是想要的值。寫AP寄存器,沒有遲滯,如TAR,DRW只需要寫一次即可寫進(jìn)去。
原文鏈接
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
總結(jié)
總結(jié)
以上是生活随笔為你收集整理的ARM Cortex-M 调试器 - 基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 情感小记
- 下一篇: JVM系列之深入理解JVM(三)