用 WCH 做高速 DAPLink:从 HSLink Pro 到 CH32H417 PIOC


做多功能调试器时,我最初的问题很直接:能不能优先使用 WCH 的芯片,以较低成本做一个尽可能快的 DAPLink?

研究从 HSLink Pro 开始,先考虑 CH32H417 的 120 MHz 方案,最后收敛到 PIOC 实现 SWD,目标是 80 MHz。过程中最关键的一次修正,是发现不能把主核的 400 MHz 直接当成 PIOC 的工作时钟。

本文整理的是 2026 年 8 月 27—28 日的方案研究。记录结束时,已经有通过汇编的资格测试程序,但还没有完整链路的上板测速结果。因此这里的 80 MHz 是待验证目标,也没有足够证据把它称为“最快”的成品调试器。

先明确要做的调试器,以及“快”的含义

DAPLink 是具体的开源固件项目,CMSIS-DAP 则是调试器与上位机之间使用的协议。日常讨论里常把兼容 CMSIS-DAP 的探针都叫作 DAPLink;本项目实际要做的是基于 WCH 主控的 CMSIS-DAP 调试器,并不意味着直接移植原版 DAPLink 就能得到最高速度。

评估速度时,我把指标拆成了四层:

指标 实际衡量的内容
SWCLK / TCK 目标接口上的时钟频率
协议有效吞吐 扣除请求、方向切换、ACK、校验和等待后的有效数据
内存读写速度 经过调试端口和目标总线后的 SRAM 等存储器访问速度
完整烧录耗时 包含连接、擦除、写入、校验和结束操作的总时间

举例来说,假设一次 32 位 SWD 读传输使用 46 个时钟,忽略所有额外间隙,那么在 80 MHz 下的理论载荷速率约为:

80,000,000 × 32 ÷ 46 ÷ 8 ≈ 6.96 MB/s

这只是简化模型。实际还有 AP 访问、WAIT 重试、USB 调度以及目标芯片自身的处理时间,不能把这个数写成实测下载速度。

HSLink Pro 使用 HPM5301,官方说明给出的最高 SWD/JTAG 速率是 80 MHz,并提供 SPI 与 GPIO 两种输出方式。它的 Boost 设置会放大上位机请求的时钟值,再限制到 80 MHz;这个功能并不能保证每块目标板都能在最高档稳定工作。

当时分析它的代码,最值得借鉴的并不是单个频率数字,而是整条数据路径:USB High-Speed Bulk 接收命令,多包队列减少往返等待,线端使用硬件外设生成连续时序,并且正确处理 SWDIO 的输入、输出和方向切换。

因此,换成 WCH 主控后也不能只比较 CPU 主频。主机送包是否及时、固件是否能持续处理、目标是否经常返回 WAIT,都会影响最后的吞吐。

从 120 MHz 研究方案转向 PIOC

早期讨论过用 CH32H417 的 LTDC 输出波形,再由 UHSIF 回采数据,目标是 120 MHz。这利用了高速外设,但也引入了时钟门控、回采相位、ACK 后停钟判断,以及不同接口电气条件能否同时满足的问题。

那份方案后来已经停止,保留为研究记录。最终决定用 PIOC 负责 SWD 的位级动作,主核负责 USB、CMSIS-DAP 命令和调度。

这样分工后,PIOC 要完成的工作更明确:输出请求,释放 SWDIO,采集 ACK,发送或接收数据,处理奇偶校验,再把结果交回主核。需要判断 ACK 时,可以在合法的相位边界停钟,判断完成后继续下一个突发段。

这并不意味着 PIOC 天然更快,而是把实现重点收敛到了可以逐段测量的状态机上。

关键修正:PIOC 不是运行在 400 MHz

之前一度按“每 bit 使用 5 个 400 MHz 周期”估算,得到了 80 MHz。核对 CH32H417 的时钟树和外设时钟代码后,这个前提被推翻:PIOC 位于 HB/HCLK 域,不能直接使用 V5F 主核的频率。

按照当时核对的 CH32H417 数据手册 V1.8,HCLK 常规设计上限按 160 MHz;200 MHz 属于带适用条件的性能模式,限定商业级、环境温度不高于 70°C,并要求良好散热。

因此,同样的 5 周期预算应当是:

160 MHz ÷ 5 = 32 MHz
200 MHz ÷ 5 = 40 MHz

这次修正也说明了一个容易忽略的问题:外设手册中的“系统时钟”,必须放回具体芯片的时钟树里理解。CPU 的最大主频不能代替外设时钟,更不能直接换算成协议线速。

80 MHz 的候选路径:Timer0 出时钟,PIOC 处理数据

修正时钟预算后,主攻方向变成了由 PIOC Timer0 输出 SWCLK,让 PIOC 指令处理 SWDIO。按照研究记录中的定时器公式:

SWCLK = HCLK / [prescaler × 2 × (256 - TMR0_INIT)]

HCLK = 160 MHz
prescaler = 1
TMR0_INIT = 0xFF

SWCLK = 160 MHz / 2 = 80 MHz

这里的难点是 0xFF:计数区间只剩一个时钟。公式支持这个推导,并不代表启停波形已经得到验证。必须检查首个脉冲、最后一个脉冲、SWDIO 的建立保持时间,以及方向切换时是否出现总线争用。

当时保留的候选路径如下,表中的频率均为设计推导,不是已经测出的完整 SWD 速度:

路径 HCLK 突发线时钟 当前定位
Timer0,初值 0xFF 160 MHz 80 MHz 主攻方案,边界行为待验证
Timer0,初值 0xFE 160 MHz 40 MHz 较低速的定时器备选
3 周期软件收发原语 160 MHz 约 53.33 MHz 常规时钟范围内的备选
3 周期软件收发原语 200 MHz 约 66.67 MHz 受限性能模式下的备选

突发段之间仍然可能有停钟间隙。即使示波器显示段内是 80 MHz,整笔访问的等效吞吐也会更低,后续需要同时记录时钟、间隙和有效 MB/s。

怎样才能确认它真的实现了高速 SWD

现有记录里的 PIOC 程序已通过 WCH WASM53B 3.1 汇编,生成的镜像为 506 字节,零错误、零警告。它包含连续时钟、TX8、一个 turnaround 后的 ACK 采样,以及 RX32 和 parity 等资格测试原语。

这只能证明程序通过了汇编检查。完整的 SWD_TRANSFER、TX32、可配置 turnaround、WAIT/FAULT 路径、空闲周期和自动重试仍需继续实现,不能把资格测试程序当成完整调试器固件。

后续验证应按下面的顺序进行:

  1. 确认时钟域。 读取时钟配置,并用已知指令周期的波形核对实际 PIOC 频率。
  2. 检查时钟启停。 发送固定字节,确认恰好产生要求数量的完整脉冲,没有额外或过窄的首尾脉冲。
  3. 闭环验证收发。 用已知数据源检查 ACK、32 位数据和奇偶校验,逐步调整采样延迟,找出可用窗口。
  4. 连接真实目标。 从低频开始,测试调试端口识别、SRAM 读写、暂停、复位,以及 WAIT 和 FAULT 的处理。
  5. 加入完整电气链路。 依次加入电平转换、后端隔离、连接器和线缆,每加一级都重复测试。

尤其是后端隔离:隔离器能传某个频率的时钟,不代表整个双向 SWD 链路就能在同样频率下可靠收发。传播延迟、通道偏斜和方向切换都会占用时序余量。

这次研究最终留下的是一个有明确验证路径的 80 MHz 候选方案。下一步最有价值的结果,是在限定目标、电压和线缆条件下给出持续读写速度与错误统计,再决定可以对外承诺的档位。

资料与记录

本文依据此前的 HSLink Pro 分析、2026 年 8 月 28 日《CH32H417 PIOC 实现 80 MHz SWD:时钟核定、状态机与验证计划》以及配套程序的构建记录整理。HSLink Pro 的产品能力参考 CherryDAP 官方说明;DAPLink 名称参考 Arm 的 DAPLink 项目说明。

芯片规格依据为 WCH《CH32H417 数据手册》V1.8、《CH32H417 参考手册》V1.7,以及 EVT 中的 PIOC/RISC8B 手册。文中的性能模式条件和频率推导保留上述版本与研究阶段的边界,不代表已经完成硬件认证。