前言介绍

OpenOCD开源项目与CH347 USB转多接口芯片简介可参考之前博客:

CH347应用
USB转JTAG/SWD功能之:开源项目OpenOCD实现对STM32固件下载

CH347使用笔记:开源项目OpenOCD添加CH347驱动在Windows平台下的编译

使用方法总结

基本原理

OpenOCD的命令有很多,如adapter driver adapter speedadapter 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)

转自 OpenOCD安装与使用(JTAG调试)

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调试命令可自行搜索。

Logo

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

更多推荐