CH347应用 USB转JTAG/SWD功能之:开源项目OpenOCD使用方法总结
CH347应用 USB转JTAG/SWD功能之:开源项目OpenOCD使用方法总结
前言介绍
OpenOCD开源项目与CH347 USB转多接口芯片简介可参考之前博客:
使用方法总结
基本原理
OpenOCD的命令有很多,如adapter driver
adapter speed
、adapter speed
等等。这些命令均可以写在文件中,通常后缀命名为cfg,通常下载调试MCU等target需要两个cfg文件,例如ch347.cfg
#指定adapter型号为CH347
adapter driver ch347
#指定adapter的VID PID
ch347 vid_pid 0x1a86 0x55de
#指定当前使用的接口为JTAG,如需SWD,改为transport select swd
transport select jtag
# 设置TCK时钟频率,单位为KHZ
adapter speed 1000
以及 stm32f1x.cfg
source [find target/swj-dp.tcl]
source [find mem_helper.tcl]
if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME stm32f1x
}
set _ENDIAN little
.....
由stm32f1x.cfg
可以看出,cfg中仍会通过source
命令嵌套使用其他文件,如遇Error: Can't find xxx
的报错,可用-s命令去指定share\openocd\scripts
目录。如
openocd.exe -s ../share/openocd/script -f ch347.cfg -f stm32f1x.cfg
举一反三,如需要下载其他目标设备,可在share\openocd\scripts\target
找到以支持的目标设备cfg文件,此文件通过命令给openocd提供了很多目标设备的信息,如RAM、大小端格式等信息。
如果openocd本身没有匹配的目标设备cfg文件,则需要参考类似设备去自行书写。
命令总结
# 仍以stm32f1x作为目标板为例
# -c后接命令,当然命令如果比较多可以写成cfg文件
./openocd -f ch347.cfg -f stm32f1x.cfg -c "program test.hex verify reset"
基础下载:
# 指定要下载到目标设备的文件,如.elf、.bin、.hex 等格式的文件
program <filename> [<start-address>] [verify] [run] [reset]
# 下载test.hex文件,下载完后进行校验并重启目标设备
program test.hex verify reset
# 将test.bin文件烧录到目标设备的地址 0x08000000,并在烧录完成后进行验证并重启目标设备。
program test.bin 0x08000000 verify reset
一些常用命令
halt -暂停CPU
reset -复位目标板
resume -恢复运行
resume 0x123456 -从0x123456地址恢复运行
reg <register> -打印register寄存器的值
load_image <File Name> <Addr> -烧写二进制文件到指定地址
例: load_image image.bin 0x4000000 -烧写image.bin到0x4000000
dump_image <File Name> <Addr> <Size> -将内存从地址Addr开始的Size字节数据读出,保存到文件File Name中
verify_image <File Name> <Addr> [bin|ihex|elf] -将文件File Name与内存Addr开始的数据进行比较,格式可选,bin、ihex、elf
step [Addr] -不加地址:从当前位置单步执行; 加地址:从Addr处单步执行
poll -查询目标板当前状态
bp <Addr> <Length> [hw] -在Addr地址设置断点,指令长度为Length,hw代表硬件断点
rbp <Addr> -删除Addr处的断点
mdw <Addr> [Count] -显示从物理地址Addr开始的Count(缺省则默认为1)个字(4Bytes)
mdh <Addr> [Count] -显示从物理地址Addr开始的Count(缺省则默认为1)个半字(2Bytes)
mdb <Addr> [Count] -显示从物理地址Addr开始的Count(缺省则默认为1)个字节(1Byte)
mww <Addr> <Value> -向物理地址Addr写入Value,大小:一个字(4Bytes)
mwh <Addr> <Value> -向物理地址Addr写入Value,大小:一个半字(2Bytes)
mwb <Addr> <Value> -向物理地址Addr写入Value,大小:一个字节(1Bytes)
Telnet功能
如有多个命令不需要一次运行,可借助telnet完成,首先开启OpenOCD的polling
openocd.exe -s ../share/openocd/script -f ch347.cfg -f stm32f1x.cfg
新开一个控制台去连接OpenOCD,Windows中telnet默认是关闭的,在启用或关闭Windows功能中开启:
#OpenOCD telnet连接
telnet localhost 4444
#出现
Open On-Chip Debugger
>
#则说明连接成功,此时就可以正常使用program等命令了
GDB调试
首先下载arm-none-eabi-gdb.exe调试工具,开启OpenOCD的polling,
D:\bin>openocd.exe -f ch347.cfg -f stm32f1x.cfg
Open On-Chip Debugger 0.12.0+dev (2023-12-29-10:53)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : CH347 SWD mode enabled
adapter speed: 1000 kHz
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : CH347 Open Succ.
Info : clock speed 1000 kHz
ch347_swd_switch_seq 1
Info : SWD DPIDR 0x1ba01477
Info : [stm32f1x.cpu] Cortex-M3 r1p1 processor detected
Info : [stm32f1x.cpu] target has 6 breakpoints, 4 watchpoints
Info : starting gdb server for stm32f1x.cpu on 3333
Info : Listening on port 3333 for gdb connections
根据信息可知,openocd已在端口3333开启了GDB Server。
运行GDB调试arm-none-eabi-gdb.exe main.elf
,main.elf为需要调试的程序,然后连接OpenOCD的GDB服务器,执行target remote localhost:3333
命令
此时可以进行GDB调试了。
常用的GDB调试指令
在 GDB 中,可以使用 load 命令将程序加载到目标设备的内存中:
#加载程序到目标设备,将调试符号和程序代码上传到目标设备。
load
#设置断点,在 main 函数处设置断点,程序会在执行到该位置时暂停。
break main
#在main.c的15行打断点
break main.c:15
#使用 continue 命令运行程序,直到遇到断点。
continue
#单步运行
step
#查看寄存器
info registers
更多GDB调试命令可自行搜索。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)