推荐博文1: SWD协议通信的简单总结
根据《ARM Technical Reference Manual cortex_m3_r1p1_trm》和《Arm® Debug Interface Architecture Specification ADI v6.0.pdf》进行梳理。
Cortex-M3 处理器实现了ARM v7-M架构。这包括整个 16 位的Thumb指令集和基本的 Thumb-2 32位指令集架构。处理器无法执行ARM指令。
The processor has the following 32-bit registers:
r0
-r12
SP
r14
r15
xPSR
.R16寄存器 xPSR
Special-purpose Program Status Registers
,系统级的处理器状态分为三类:
NVIC register map:
Interrupt Control Type Register
rSysTick Control and Status Register
r/wSysTick Reload Value Register
r/wSysTick Current Value Register
r/wcSysTick Calibration Value Register
rIrq 0 to 31 Set Enable Register
r/wIrq 224 to 239 Set Enable Register
r/wIrq 0 to 31 Clear Enable Register
r/wIrq 224 to 239 Clear Enable Register
r/wIrq 0 to 31 Set Pending Register
r/wIrq 224 to 239 Set Pending Register
Irq 0 to 31 Clear Pending Register
Irq 224 to 239 Clear Pending Register
Irq 0 to 31 Active Bit Register
Irq 224 to 239 Active Bit Register
Irq 0 to 31 Priority Register
Irq 236 to 239 Priority Register
CPUID Base Register
rInterrupt Control State Register
r/wVector Table Offset Register
r/wApplication Interrupt/Reset Control Register
r/wSystem Control Register
r/wConfiguration Control Register
r/w1. CPUID 0xE000ED00
C23
1。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
通过对ARM 全系列CPUID进行整理,可得:
Part No. | Core |
---|---|
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)
VECTKEY
字段中输入 0x05FA
。否则,写值将被忽略。ENDIANESS
在复位时从大端输入端口采样。您不能在重置之外更改 ENDIANESS
PRIGROUP
字段是一个二进制点位指示符,用于为具有相同抢占级别的异常创建子优先级SYSRESETREQ
:导致向外部系统断言一个信号,表明请求复位VECTCLRACTIVE
:清除活动向量位:
VECTRESET
:系统复位。重置系统,除调试组件外:
VECTRESET
位会自动清除。Reset清除 VECTRESET
位。对于调试,只有当core 被 halted 时才写入此位。注意
:SYSRESETREQ
由系统复位清除,这意味着同时断言 VECTRESET
可能会导致 SYSRESETREQ
在写入的同一周期内被清除。 这可能会阻止外部系统看到 SYSRESETREQ
。 因此,建议独占使用 VECTRESET
和 SYSRESETREQ
,切勿两者同时写 1
。Software Trigger Interrupt Register
wPeripheral identification register (PID4)
rPeripheral identification register (PID7)
Peripheral identification register Bits 7:0 (PID0)
rPeripheral identification register Bits 31:24 (PID3)
Component identification register Bits 7:0 (CID0)
Component identification register Bits 31:24 (CID3)
核心调试通过核心调试寄存器访问。对这些寄存器的调试访问是通过高级高性能总线(AHB-AP)端口进行的.处理器可以通过内部的私有外围总线(PPB
)直接访问这些寄存器。
Halt mode debugging / 内核 Halt 状态下的调试方法
C_DEBUGEN
和 C_HALT
位来暂停内核。 内核通过设置调试停止控制和状态寄存器的 S_HALT
位在停止时进行确认。C_STEP
位设置为 1
,然后将 C_HALT
位清除为 0
,内核可以单步执行。内核通过设置 DBG_HCSR.S_HALT
位确认单步完成并重新暂停。退出内核调试
C_DEBUGEN
位来退出停机调试。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 意味着它现在正在重置(仍然保持在重置状态)。
该寄存器不会在系统复位时复位。该寄存器由上电复位复位。 位 [19:16] 总是在内核复位时清零。调试监视器由复位处理程序或更高版本中的软件启用,或者由 AHB-AP 端口启用。
矢量捕获是半同步的。 当看到匹配事件时,请求停止。 因为处理器只能在指令边界上停止,它必须等到下一个指令边界。 结果,它在异常处理程序的第一条指令处停止。 但是,当向量捕获已触发时,存在两种特殊情况:- 如果在向量读取或堆栈推送错误期间发生故障,则在向量错误或堆栈推送的相应故障处理程序上发生暂停。- 如果在向量读取或堆栈推入错误期间检测到迟到中断,则不接受。 也就是说,在这种情况下,支持迟到优化的实现必须抑制它。
矢量捕获只能用于停止调试。高16位是用于监控控制,低16位是暂停、异常支持。
#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)
ro
. System powerup acknowledge.rw
. System powerup request.ro
. Debug powerup acknowledge.ro
. Debug reset acknowledge.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 支持多个电源域,为可断电的调试组件提供支持。实现对三个电源域进行建模:
如有必要,可以细分系统和调试电源域。然而,要定义一个简单的调试接口,必须在顶层将设备划分为系统和调试电源域。任何更细粒度的控制都超出了此模型的范围。
在大多数情况下,调试器会启动整个 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
…
#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 Register
Mode: 读取或写入数据访问时的自动地址递增和打包模式。 仅当当前事务完成且没有错误时才会增加。
访问分组数据寄存器 0x10 - 0x1C 时不会执行自动地址递增和打包传输。 在这些情况下,这些位的状态将被忽略。
在 4 KB 地址边界内递增和回绕,例如对于从 0x1000 到 0x1FFC 的字递增。 如果从 0x14A0 开始,则计数器递增到 0x1FFC,回绕到 0x1000,然后继续递增到 0x149C。
0b00 自动增量 关闭
0b01 增量 单次。从相应的字节通道进行一次传输。
0b10 包 增量
使用这些寄存器直接将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] 如下:
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。
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, 自动增量关闭
type
类型字段一起使用,以定义总线访问保护控制。调试器可以使用这些字段来指定用于调试访问的标志。如果实现包括大物理地址扩展,则偏移量 0xD04 处的字表示传输地址的最低有效字,偏移量 0xD08 处的字表示最高有效字。
如果实现不包括大物理地址扩展,偏移量 0xD04 处的字表示传输地址,偏移量 0x08 处的字为 RES0
Tranfer Address:
Data Read/Write
NOTE
1. 请求
主机 HOST 发出的请求由 8bit 组成:
bit | name | note |
---|---|---|
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] 地址字段:
比如 DP_Select 的寄存器地址为 0x08
(即 0b1000
),显然A[2:3]就为 01
。
2. 响应
Target返回的ACK值由3bit组成:
ACK | note |
---|---|
ACK[0:2]==001 | FAULT |
ACK[0:2]==010 | WAIT |
ACK[0:2]==100 | OK response |
3. 数据
由32bit有效数据 + 1bit数据的奇偶校验位组成
注意:此时只能访问DP寄存器组,AP寄存器组还无法访问。
DP_CTRL/STAT
寄存器(addr=0x04
)数据为0x50000000
(第28位CDBGPWRUPREG
和第30位CSYSPERUPREQ
),开启Debug Port及其时钟.DP_SELECT
寄存器(addr=0x08
)数据为 0x000000F0
,AP_bank:0xF
AP_IDR
寄存器(addr = 0xFC
)识别数据并验证。读取IDR寄存器的数值时,需要两次,第一次是dummy read,第二次读取到的才是正确的数据。(第二次也可以读RDBUFF寄存器)DP_SELECT
寄存器数据为0x00000000
,bank:0x0
AP_CSW
寄存器数据为0x00000002
,data_size:32bit
0b010
,编程写入Flash的数据是16bit 0b001
。如果想要 写入/读出 MCU内部Flash的数值,需要用到两个AP寄存器
写操作
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只需要写一次即可写进去。
原文链接
ARM cortex -M0
理论值 - 0x0BB1_1477
Name | CPUID |
---|---|
MT304 | 0x412F_C23 1 |
MM0020 | 0x410C_C20 0 |
- LineReset(30+30)
- JTAG2SWD
- LineReset(30+30)
- 16b1110_1110_1110_1110(0xEEEE LSB)
- LineReset(30+30)
- R DP_IDCode(DP0)
- OK + 0x2ba01477
- delay 200us
- 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_001e
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 120us
- 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_001E
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_0000
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_001E
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 0x0000
- 418 us later.
- R AP_DRW(APc)
- OK+0x0003_0003
- send 3 ack clock, but not used
- **18 ms later.**
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_0003
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_0003