通过SWD下载程序的ARM相关寄存器

SWD的时序图:

  1. start单个起始位,值为1(HIGH)
  2. APnDPA单比特,指示要访问DP还是AP。0用于访问DP(DPACC),1用于访问AP(APACC)
  3. RnWA单个位,指示访问是读(1)还是写(0)
  4. A[2:3]2位,给出DP或AP寄存器地址的A[3:2]地址字段。对于DPACC,是SW-DP中寄存器的地址;对于APACC,被寻址的寄存器取决于A[3:2]值和DP的SELECT寄存器中的值。注:[3:2]值首先传输LSB,这就是它显示为“A[2:3]”的原因。
  5. Parity 前一个数据包的单个奇偶校验位。使用偶数奇偶校验:如果设置为1的位数为奇数,则奇偶校验位设置为1。对于数据包请求,将对APnDP、RnW和A[2:3]位进行奇偶校验。对于数据传输(RDATA和WDATA),奇偶校验是在32数据位。
  6. stop 单个停止位,始终为0
  7. Park 1位。调试主机不驱动此位的线路,并且线路被DP拉高。目标将此位读取为1。
  8. Trn Turnaround。这是一段时间,在此期间线路未被驱动,线路的状态未定义。周转周期的默认长度为一个时钟周期,可以通过在SW-DP的线路控制寄存器中写入TURNROUND字段来更改(通常不需要)
  9. ACK[0:2]3位目标到主机响应。ACK值首先在线路上传输LSB,因此它显示为ACK[0:2]
  10. 32位写入数据,从主机到目标。WDATA值首先在导线上传输lsb,因此它显示为WDATA[0:31]。
  11. RDATA[0:31]从目标到主机的32位读取数据。RDATA值首先在导线上传输lsb,因此它显示为RDATA[0:31]。

电源控制:

DAP模型支持多个功率域;可以有三个电源域:

•常开域

•系统电源域

•调试电源域

DP寄存器位于常开域中,CTRL/STAT寄存器中有两个控制位:

•Bit[28],CDBGPWRUPREQ,用于请求系统电源管理器在调试电源域中完全通电并启用时钟。

•Bit[30],CSYSPWRUPREQ,用于请求系统电源管理器完全通电并启用系统电源域中的时钟。

初始化期间需要设置这两个位,以确保MCU完全通电并启用时钟

DP 寄存器:

AP 寄存器:

ABORT寄存器:

ABORT:AP中止寄存器始终存在于所有DP实现中,仅写,始终可访问。它的主要目的是强制DAP中止,也用于清除错误和粘性标志条件。当APnDP位=0时,它在写入操作时处于地址0x0。对AP中止寄存器的访问不受选择寄存器中CTRLSEL位值的影响。

当调试器发现错误标志被设置为1,或者粘性比较标志被设置成1时,它必须写入AP中止寄存器以将错误或粘性比较标志清除为0。如果有必要,可以使用对AP中止寄存器的一次写入来将多个标志清除为0

IDCODE寄存器:

标识码寄存器是只读的,并且始终可以访问,存在于所有调试端口实现中。它提供有关ARM调试接口的标识信息。当APnDP位=0时,它在读取操作时位于地址0b00

Bits

Function

Description

[31:28]

Version

Version code, implementation defined.

[27:12]

PARTNO

0xba10 for SW-DP

[11:1]

DESIGNER

Defaults to 0x23b

[0]

-

Always 1

Control/Status寄存器:

这个重要的寄存器提供DP的控制和状态。当APnDP位=0并且选择寄存器中的CTRLSEL位设置为0时,它在读写操作中处于地址0x4

SELECT寄存器:

AP选择寄存器始终存在,其主要目的是选择当前访问端口和该访问端口中的活动4字寄存器窗口,它还选择调试端口地址组。当APnDP=0时,它在写入操作时位于地址0b10,并且仅写入。对AP选择寄存器的访问不受CTRLSEL位值的影响

Bits

Function

Description

[31:24]

APSEL

Selects the current AP.0x00 = AHB-AP (We use this!)0x01 = APB-AP 0x02 = JTAG-AP 0x03 = Cortex-M3 if present.Reset to Unpredictable.

[23:8]

Reserved. Should be 0, read as 0.

[7:4]

APBANKSEL

Selects the active 4-word register window on the current AP. Reset to Unpredictable

[3:1]

Reserved. Read as 0, Should be 0.

[3:0]

CTRLSEL

(As mentioned many times above) SW-DP Debug Port address bank select. Reset to 0. However the register is WO, so we can’t201430of61read its value.

RDBUFF寄存器:

当APnDP位=0时,RDBUFF在读取操作中位于地址0b11,并且是只读寄存器。对读取缓冲区的访问不受SELECT寄存器中CTRLSEL位的值的影响。

执行读取读取缓冲区从访问端口捕获数据,该数据是上一次读取的结果,而无需启动新的访问端口事务。这意味着读取读取缓冲区将返回上次访问端口读取访问的结果,而不会生成新的AP访问。读取“读取缓冲区”后,其内容将不再有效。读取缓冲区的第二次读取结果未定义。如果需要读取访问端口寄存器的值,则该读取之后必须是以下其中之一:

•第二个访问端口寄存器读取。可以读取控制/状态寄存器(CSW),以确保第二次读取没有副作用。

•对DP读取缓冲区的读取。

根据使用的选项,对访问端口或调试端口的第二次访问将暂停,直到恢复

WCR寄存器:

有线控制寄存器的目的是选择与SW-DP的物理串行端口连接的操作模式。当选择寄存器中的CTRLSEL位设置为b1时,在读写操作中,它是地址为0b01的读/写寄存器。线控寄存器的许多功能都是由实现定义的。

对于SWD编程,不需要配置此寄存器。

RESEND寄存器:

读取重新发送寄存器使读取数据能够从损坏的调试器传输中恢复,而无需重复原始AP传输。它是一个32位只读寄存器,在读取操作时位于地址0b10。对读重新发送寄存器的访问不受SELECT寄存器中DPBANKSEL位值的影响。对RESEND寄存器执行读取不会从访问端口捕获新数据。它返回上次AP读取或DP RDBUFF读取返回的值。读取RESEND寄存器可以从损坏的传输中恢复读取数据,而无需重新发出原始读取请求或生成新的DAP或系统级访问。RESEND寄存器可以被多次访问。它总是返回相同的值,直到对DP RDBUFF寄存器或访问端口寄存器进行新的访问

MEM-AP的访问:

MEM-AP寄存器:

CSW寄存器:

CSW寄存器通过MEM-AP配置和控制对连接的存储器系统的访问或从连接的存储系统的访问。CSW是一个R/W寄存器,但有些位是只读的。CSW位于MEM-AP寄存器空间中的偏移0处,因此它是第一寄存器组中的第一个寄存器。对于SWD编程,我们可以将CSW设置为(2<<0|1<<4|1<<24|1<<25),使其访问为32位,递增单个,特权访问,作为调试器访问。

TAR寄存器:

该R/W寄存器保存要访问的32位系统存储器地址;它在MEM-AP寄存器空间中处于偏移0x04。当使用数据读/写寄存器(DRW)时,TAR指定要访问的内存地址,并且在成功访问DRW时可以自动递增

DRW寄存器:

这个R/W寄存器保存一个32位的数据值。在写入模式下,DRW将当前传输要写入的值保存到TAR中指定的地址;在读取模式下,DRW保持从TAR中指定的地址在当前传输中读取的值。DRW寄存器将AP访问直接映射到一个32位内存访问:对DRW的写入命令MEM-AP启动对内存系统的写入访问DRW的读取命令MEM-AP启动对内存系统的读取访问。请注意,在内存访问完成之前,AP访问不会完成

CORE DEBUG:

DCRDR寄存器:

DCRDR寄存器是一个数据临时缓存,用于读取和写入ARM核心寄存器、专用寄存器和浮点扩展寄存器。DCRDR也可以单独使用,在外部调试器和处理器上运行的调试代理之间提供消息传递资源

DHCSR寄存器:

这个寄存器有两个字段排列视图:当读取时,[31:16]是一些状态位;写入时,[31:16]是一个“调试密钥”值,必须将其设置为0xA05F才能更新[15:0]。

DCRSR寄存器:

使用DCRDR,此寄存器提供对ARM核心寄存器、专用寄存器和浮点扩展寄存器的调试访问。对DCRSR的写入指定要传输的寄存器、方向(读/写)并开始传输。

### 实现多块正泰DDSU666电表通信的方法及协议 对于正泰DDSU666电表,由于其基于Modbus通信协议工作,并且无法通过按钮设置通讯参数[^2],因此实现多个电表之间的通信主要依赖于外部编程配置以及遵循特定的通信标准。 #### 1. 使用RS485总线构建网络拓扑结构 为了使多台DDSU666电表能够相互通信,通常采用RS485接口来建立连接。根据DL/T645 - 2007《多功能电能表通信协议》,RS485端口默认使用的波特率为2400bps[^1]。这意味着所有接入同一RS485链路中的设备都应保持一致的数据传输速率以确保正常交互。 #### 2. 配置每一块电表地址唯一性 在同一个物理介质上的各个节点之间要区分彼此,则需给定唯一的站址(Slave ID)。这一步骤往往需要借助专门开发的上位机软件完成初始化设定;当涉及到大量相同型号仪表时尤为必要。具体来说: - 开发者可以利用PC或者其他控制单元作为主站(master),向各子站(slave)发送命令帧; - 子站在接收到合法请求后返回响应数据包; - 主站依据预先定义好的逻辑解析这些反馈信息并作出相应处理。 #### 3. 编写适用于批量修改的操作程序 针对大规模部署场景下可能存在的效率问题,建议编写自动化脚本来简化重复性的配置任务。该工具应当具备如下功能特性: - 支持自动扫描在线状态下的目标设备列表; - 提供图形界面让用户直观地查看当前已连入系统的全部成员及其属性详情; - 可自动生成用于更改指定项(如波特率、校验方式等)所需的标准报文格式; ```python import minimalmodbus as mm def set_device_address(port, old_addr, new_addr): instrument = mm.Instrument('/dev/ttyUSB' + str(port), int(old_addr)) instrument.serial.baudrate = 2400 instrument.write_register(0x0100, new_addr) for i in range(start_port_number, end_port_number+1): try: set_device_address(i, initial_address_value, desired_new_address) print(f"Successfully updated address of device on port {i}") except Exception as e: print(e) ``` 上述Python代码片段展示了如何使用`minimalmodbus`库改变单个或一系列相连电表的从站ID号。实际应用过程中可根据项目需求调整函数内部细节部分。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值