OpenOCD是一种开放式片上调试器,可为嵌入式设备提供编程,调试和边界扫描测试。OpenOCD作为服务器,并通过端口3333接受来自GDB的传入连接或通过端口4444接受来自telnet的传入连接。GDB用于源文件步骤调试。telnet连接用于刷新。OpenOCD连接到 DAPLINK仿真器。DAPLINK适配器连接到目标。
下载软件环境
软件名称 | 网站 |
---|---|
OpenOCD最新版 | http://www.gnutoolchains.com/arm-eabi/openocd/ |
OpenOCD 文件部署
解压OpenOCD文件夹到一个英文目录,并进入主目录,里面有bin、drivers、share文件
然后,可以通过”–help”命令可来调用OpenOCD的帮助服务,同时验证命令文件夹正确
- 通过CMD/PowerShell方式执行命令
- 在该目录打开CMD命令或PowerShell,打开方法:在文件空白处按
Shift+鼠标右键
- 输入”–help”命令并回车:
.\bin\openocd --help
- 在该目录打开CMD命令或PowerShell,打开方法:在文件空白处按
- 通过bat文件方式执行命令
- 在文件目录创建
.bat
执行文件”help.bat” - 编辑bat执行文件,跟CMD的
"--help"
命令对比,只需换号增加pause
即可:
.\bin\openocd --help pause
- 在文件目录创建
保存执行,OpenCOD服务将会打印以下说明,如果出现错误请更改正确的目录
G:\OpenOCD-20200530-0.10.0>.\bin\openocd --help
Open On-Chip Debugger 0.10.0 (2020-05-30) [https://github.com/sysprogs/openocd]
Licensed under GNU GPL v2
libusb1 09e75e98b4d9ea7909e8837b7a3f00dda4589dc3
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Open On-Chip Debugger
Licensed under GNU GPL v2
--help | -h display this help
--version | -v display OpenOCD version
--file | -f use configuration file <name>
--search | -s dir to search for config files and scripts
--debug | -d set debug level to 3
| -d<n> set debug level to <level>
--log_output | -l redirect log output to file <name>
--command | -c run <command>
OpenOCD Server部署运行
案例通过CMD方式操作(bat文件命令方式上面有说明)
- 在CMD夹输入OpenOCD Server命令 (案例为STM32F1X单片机)
- 通过运行
<scripts>
带参脚本命令运行Server,通用格式为"-f <interface> -f <target> "
<interface>
仿真器配置: 代表你的仿真器类型,DAPLINK就是"interface/cmsis-dap.cfg"
<target>
目标板配置: 代表你的烧录的单片机类型,如STM32F103C8就是"target/stm32f1x.cfg"
- 注:两个CFG配置文件都可以在\share\openocd\scripts目录找到
.\bin\openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg
- 执行命令(失败案例)
- 未检测到仿真器,请检查连接线和设备管理器驱动有没有问题
- 仿真器连接成功但未连接器件,请检查连接线问题
- 成功连接器件(成功命令)
连接成功,请不要关闭该窗口,否则OpenOCD将会关闭
如需要退出服务可按Ctrl+C
OpenOCD command 常用命令
这些命令都比较常用到,官方命令索引在这里
- 适配器命令
- “adapter driver ” 命令告诉OpenOCD您正在使用哪种类型的调试适配器,比如DAPLINK/cmsis-dap的驱动器名称是”cmsis-dap”;
-
“transport select “通信方式配置,声明使用SWD/JTAG或其他通信方式,例如为”swd”;
-
“adapter_khz ” 该命令设置时钟通信速率,例如5M的为”500″;
-
目标板状态处理命令(Target state handling)
- init 此命令终止配置阶段并进入运行阶段,如重置目标,编程闪存等需要执行该命令
- poll 查询目标板当前状态
- halt 中断目标板的运行
- resume
<address>
恢复目标板的运行,如果指定了<address>
,则从地址开始运行 - step
<address>
单步执行,如果指定了<address>
,则从地址开始执行一条指令 - reset [run|halt|init] run:复位并运行目标; halt:复位并停止目标运行; init:立即停止目标,并执行复位的init脚本
OpenOCD 命令实践
例程使用stm32f1x控制器,实际不同控制器可在\share\openocd\scripts\target找到
<NUM>
参数是flash banks,打印每个设备的闪存库声明摘要,从零开始编号。主要,编号是复数形式,单数形式是不同的命令。
编程一个文件默认情况下将执行以下操作:
1. 执行'init'
2. 调用"reset init"
来重置和停止目标
3. 调用"flash write_image"
给指定的文件名擦除和写入到Flash
4. 调用"verify_image "
对比下载文件是否有误
5. 调用"reset run"
复位运行程序
6. 退出OpenOCD服务
OpenOCD的FLASH命令在这里可以找到
检查可用的目标板
通过运行targets
命令检查可用的目标
.\bin\openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -c "init;targets;"
如果检测不到目标,建议检查target/xxx.cfg
是否错误,检查连接线是否错误
烧录编程固件
该命令简化使用Flash命令的方法,使用jimtcl脚本来处理编程和验证阶段
只需要"program <filename> [preverify] [verify] [reset] [exit] [offset]"
一个命令即可完成6上面步骤编程烧录
+ 必须指定<filename>
烧录文件名和地址,如"flash.bin 0x08000000"
+ 如果指定了[preverify]
烧录前校验目标是否相同
+ 如果指定了[verify]
烧录后校验目标,在失败时会有提示
+ 如果指定了[reset]
复位运行,在烧录校验完成后运行程序
+ 如果指定了[offset]
偏移地址,则会从偏移地址烧录
.\bin\openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -c "program flash.bin 0x08000000 verify reset exit;"
Flash擦除
init; reset init;
命令终止配置阶并执行复位init脚本;-
擦除指定地址
"flash erase_address [pad] [unlock] <address lengt>"
擦除从地址开始的长度字节的扇区。 除非指定填充选项,否则地址必须以闪存扇区开头,而地址+长度-1必须以扇区结尾;- 必须指定
<address lengt>
擦除地址和长度,例如"0x08000000 0x10000"
- 如果指定了
[pad]
填充选项,指定填充区可根据需要擦除指定区域的开始和/或末尾的额外数据,从而仅擦除整个扇区; - 如果指定了
[unlock]
解锁选项,则在擦除开始之前,FLASH将会被解锁;
- 必须指定
.\bin\openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -c "init;reset init;flash erase_address 0x08000000 0x10000;"
- 也可以整体擦除 STM32 Flash 命令是
"stm32f1x mass_erase <NUM>"
.\bin\openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -c "init;reset init;stm32f1x mass_erase;"
二进制文件与目标板Flash比较
该功能是验证你的烧录文件内容是否与目标板的Flash程序是否一致,一般烧录完成后需用到
- 比较Flash核心命令是
"flash verify_bank <NUM> <filename> [offset]"
,将二进制文件文件的内容与从offset(偏移量)开始的闪存库num的内容进行比较,如果内容不匹配,则失败。- 如果指定了
[offset]
偏移地址则从该地址开始; - 必须指定
<filename>
比较文件名,如"flash.bin"
- 如果指定了
.\bin\openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -c "init;reset init;flash verify_bank 0 flash.bin;"
Flash烧录写入
- 烧录Flash核心命令是
"flash write_image [erase] [unlock] <filename> [offset] [type]"
将烧录文件名写入当前目标的闪存地址,仅写入镜像中的可加载部分。
必须指定<filename>
烧录文件名和地址,如"flash.bin 0x08000000"
- 如果指定了
[erase]
擦除选项,则在编程之前将擦除相关闪存的整个扇区; - 如果指定了
[unlock]
解锁选项,则在擦除和编程之前将解锁闪存; - 如果指定了
[offset]
地址选项,则指定重定位偏移量; - 如果指定了
[type]
类型选项,则指定为bin (二进制), ihex (Intel hex), elf (ELF file), s19 (Motorola s19)文件;
- 如果指定了
- 警告:当闪存保存您要保留的数据时,请小心使用擦除标志。图像部分中未描述的部分闪光灯可能会被删除,恕不另行通知。
.\bin\openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -c "init;reset init;flash write_image erase flash.bin 0x08000000;"
STM32上锁/解锁
- STM32上锁命令是
"stm32f1x lock <NUM>"
,解锁命令是"stm32f1x unlock <NUM>"
.\bin\openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -c "init;reset halt;stm32f1x unlock 0;shutdown;"
OpenOCD文档
有关OpenOCD的信息:
+ http://openocd.org/
+ https://sourceforge.net/projects/openocd/
最新版本的文档位于:
+ http://openocd.org/doc/html/index.html
OpenOCD GIT存储库位于:
+ https://sourceforge.net/p/openocd/code/ci/master/tree/