全部例程

OpenOCD:必备的嵌入式调试工具

W55MH32

更新于 2026年8月13日

本篇总结

介绍 OpenOCD 调试工具,通过 CMSIS-DAP 烧录 MicroPython 固件,并与 DFU 方案对比。

🔑 KEIL MDK

对于 W55MH32L 芯片,OpenOCD 通过标准化的调试接口提供专业的调试、编程和测试工具。与 DFU 方案不同,OpenOCD 通过 CMSIS-DAP 调试接口进行烧录,可同时提供编程和调试能力。

前置工具准备

  • W55MH32L 开发板 + USB Type-C 数据线(DAPLink 端口)
  • WSL2 (Ubuntu):Linux 构建环境,需安装 OpenOCD、GNU 工具链、git、make
  • usbipd-win:将 USB 设备从 Windows 转发到 WSL
  • 串口终端(Tera Term / PuTTY):MicroPython REPL 验证

硬件连接

接口/引脚功能说明
DAPLink USBCMSIS-DAP 调试/烧录口连接主机,设备管理器显示 "CMSIS-DAP v2"
UART TX/RX串口控制台MicroPython REPL 交互(115200 baud)
RESET复位按键触发固件重启

OpenOCD 特性与应用

特性说明
多协议支持JTAG、SWD、cJTAG、CMSIS-DAP 接口
跨平台Windows、Linux、macOS
生产就绪自动化烧录、批量编程、验证
开源无厂商锁定,社区驱动开发
可扩展基于插件的接口驱动器和目标支持

应用领域覆盖工业制造(生产线编程、工厂测试)、汽车电子(ECU 调试、ADAS 开发)、消费电子与 IoT(智能家居、可穿戴设备)、医疗设备(诊断设备、病人监护)以及教育研究(嵌入式课程、原型开发)。

工作原理:三层架构

层级功能端口/接口
命令接口层Telnet / GDB 协议服务器Telnet: 4444, GDB: 3333
核心层目标状态管理、闪存算法
驱动层接口驱动器、传输协议CMSIS-DAP

分层配置系统

OpenOCD 使用分层配置:接口配置(调试适配器设置)→ 目标配置(MCU/CPU 特定)→ 板级配置(开发板连接)→ 用户脚本(自定义初始化序列)。针对 W55MH32L,OpenOCD 通过 CMSIS-DAP 识别 ARM Cortex-M3 内核,使用芯片特定算法进行闪存编程。

步骤1:USB 设备转发到 WSL

将开发板的 CMSIS-DAP USB 接口从 Windows 转发到 WSL。以管理员权限打开 PowerShell:


# 1. 列出 USB 设备,找到 W55MH32L 的总线 ID(如 4-3)
usbipd list

# 2. 绑定 USB 设备
usbipd bind --busid 4-3

# 3. 附加到 WSL
usbipd attach --wsl --busid 4-3

# --- WSL 中验证 ---
lsusb  # 输出应包含 CMSIS-DAP 设备

确认设备

Windows 设备管理器 → "通用串行总线设备" 中应出现 "CMSIS-DAP v2"。将 4-3 替换为实际总线 ID。

步骤2:构建并烧录 MicroPython

确保 DFU 引导加载程序已安装、USB 设备已转发到 WSL 后,在 WSL 终端中编译并烧录。


# 切换到 MicroPython W55MH32L 端口目录
cd /home/你的用户名/micropython/ports/w55mh32

# 清理构建环境
make clean

# 编译并烧录固件(通过 OpenOCD + CMSIS-DAP)
make flash

链接器脚本 (w55mh32.ld)

与 DFU 方案不同,OpenOCD 方案中中断向量表从 0x08000000 开始,不需要为引导加载程序预留前 20KB。


MEMORY
{
    FLASH (rx)          : ORIGIN = 0x08000000, LENGTH = 1024K  /* 整个 FLASH */
    FLASH_ISR (rx)      : ORIGIN = 0x08000000, LENGTH = 16K    /* sector 0 */
    FLASH_FS (rx)       : ORIGIN = 0x08004000, LENGTH = 0K     /* sectors 1,2,3 */
    FLASH_FIRMWARE (rx) : ORIGIN = 0x08010000, LENGTH = 972K   /* 用户固件 */
    RAM (xrw)           : ORIGIN = 0x20000000, LENGTH = 96K
}

OpenOCD vs DFU 地址差异

DFU 方案中 FLASH_ISR 从 0x08005000 开始(为 BOOT 预留 20KB);OpenOCD 方案中 FLASH_ISR 从 0x08000000 开始,固件直接覆盖整个 FLASH。

OpenOCD 烧录命令 (Makefile)

make flash 调用 OpenOCD,将 firmware.bin 从 0x08000000 开始写入,一次完成中断向量表和主程序代码的烧录。


flash: $(BUILD)/firmware.bin
    $(ECHO) "Writing firmware.bin to the board via CMSIS-DAP using OpenOCD"
    $(Q)$(OPENOCD) -f $(OPENOCD_CONFIG) -c "w55mh32_flash $(BUILD)/firmware.bin 0x08000000"
    @echo "Flash complete!"

TCL 烧录脚本 (board.cfg)

OpenOCD 运行 w55mh32_flash TCL 脚本,通过 CMSIS-DAP 调试接口对芯片进行编程:


proc w55mh32_flash { BIN0 ADDR0 } {
   reset halt                  # 停止 CPU 执行
   sleep 100                   # 等待 100ms 稳定
   flash write_image erase $BIN0 $ADDR0  # 擦除并写入二进制
   sleep 100                   # 等待 100ms 完成
   reset run                   # 重启 CPU
   shutdown                    # 关闭 OpenOCD 连接
}

TCL 脚本五步流程

reset halt 暂停 CPU → sleep 等待稳定 → flash write_image erase 擦除并写入 → sleep 等待完成 → reset run 重启执行。整个过程自动完成,适合 CI/CD 自动化。

步骤3:串口终端验证

烧录完成后,通过串口终端验证 MicroPython 固件功能:

参数
波特率115200
数据位8
校验位
停止位1
流控制

选择对应 COM 端口,按下开发板 RESET 按键,MicroPython 固件重启并显示 REPL 交互界面。

常见问题

Q: OpenOCD 报 "CMSIS-DAP not found"

WSL 中 USB 未正确转发。在 PowerShell 重新执行 usbipd attach --wsl --busid X-X,然后 lsusb 确认 CMSIS-DAP 设备可见。每次重新插拔 USB 需重新 attach。

Q: make flash 报 "Error: connection failed"

CMSIS-DAP 设备被其他程序占用(如 Keil)。关闭 Keil MDK 和其他可能占用调试器的程序后重试。也可手动运行 openocd -f board/w55mh32.cfg 查看详细错误信息。

Q: OpenOCD 和 DFU 该选哪个

OpenOCD 通过 CMSIS-DAP 烧录,固件从 0x08000000 开始,覆盖整个 FLASH,适合开发和调试(可设断点)。DFU 通过 USB Device 端口烧录,固件从 0x08005000 开始,保留 BOOT 引导程序,适合生产部署和现场更新。

Q: flash write_image 后固件不运行

检查链接器脚本 FLASH_ISR 的 ORIGIN 是否为 0x08000000。若从 DFU 方案切换到 OpenOCD 方案,需修改链接器脚本地址。确认 TCL 脚本最后执行了 reset run 重启 CPU。

Q: 如何用 OpenOCD 进行在线调试

启动 OpenOCD 后,它会在 3333 端口监听 GDB 连接。用 arm-none-eabi-gdb 连接 target remote localhost:3333,即可设断点、单步执行、查看寄存器和内存。Telnet 4444 端口可直接发送 OpenOCD 命令。

总结

  • 三层架构:命令接口层(Telnet 4444 / GDB 3333)→ 核心层(状态管理/闪存算法)→ 驱动层(CMSIS-DAP)
  • 烧录流程:USB 转发(usbipd)→ make flash → TCL 脚本(reset halt→flash write→reset run)
  • 与 DFU 的区别:OpenOCD 从 0x08000000 烧录(覆盖全 FLASH),DFU 从 0x08005000 烧录(保留 BOOT)
  • 优势:开源无锁定、可脚本化自动化(CI/CD)、调试与编程并行、跨平台支持
  • 验证:串口 115200 连接 REPL,按 RESET 触发 MicroPython 重启

Administrator

Wiznet 雇员