首先,关于OpenOCD的入门介绍,以及如何调试,看我这篇文章:

嵌入式IDE原理 OpenOCD介绍 以及stlink如何连接stm32板子_标biao的博客-CSDN博客

由于OpenOCD一旦连接上,会自动进入3种端口监听模式(其中就包括了gdbserver端口,其实OpenOCD本质上是一个gdbserver),所以进行调试(选择gdb端口即可,上面那个文章有讲),还是比较容易的。但是本文要讲的是如何直接下载程序,而不是调试。

 

已有的不错参考博客如下(这两博客讲得差不多):

Windows上使用 OpenOCD 给 STM32 下载程序_MCUlover666的技术博客_51CTO博客

【STM32开发环境】Linux下开发stm32(二) | 使用openocd下载程序_Mculover666的博客-CSDN博客_openocd

其中有两种把程序下载到板子上的方法:

(win10,stm32f103ZET6单片机,st-link v2硬件调试器,OpenOCD版本 OpenOCD-20211118-0.11.0)

1. 使用端口连接模式

先连接OpenOCD到硬件调试器,打开powershell命令行窗口

命令行:openocd -f <接口配置文件> -f <目标芯片配置文件>

例如我的stm32f103zet6板子:openocd -f  scripts/interface/stlink.cfg -f scripts/target/stm32f1x.cfg

 所以可以有三种端口连接协议方式:tcl 、 telnet  、gdb(调试功能使用,我这篇博客就是用的这个 嵌入式IDE原理 OpenOCD介绍 以及stlink如何连接stm32板子_标biao的博客-CSDN博客)。

假如选择 telnet端口连接,然后再打开另一个powershell命令行窗口,

输入命令行:telnet localhost 4444连接到openocd

  1. 输入命令:halt,目标芯片挂起,相当于关机
  2. 输入命令:flash write_image erase <要下载的文件>,将文件下载到目标芯片flash
  3. 输入命令:reset,目标芯片复位

 同理,tcl端口连接也是类似的。

但是下载程序都感觉太麻烦,能不能不连接端口,一行命令行,直接下载完成呢?可以的,如下

2. 使用直接下载方式

一行命令行:

openocd -f scripts/interface/stlink.cfg -f scripts/target/stm32f1x.cfg -c init -c "reset halt; wait_halt; flash write_image erase build/项目15.bin 0x08000000" -c reset -c shutdown

解释:

  • openocd -f scripts/interface/stlink.cfg -f scripts/target/stm32f1x.cfg 用于连接OpenOCD
  • -c表示要执行的选项,-c init 用于初始化
  • -c "reset halt; wait_halt; flash write_image erase build/项目15.bin 0x08000000" 表示执行命令,其中 reset halt; wait_hal 先停止单片机 (分号不能少),这句非常重要
  • -c reset -c shutdown,表示复位单片机,且退出OpenOCD

 

注意:

reset halt; wait_hal ,这句必不可少,否则第一次下载能成功,但是第二次下载就会报错:timeout waiting for algorithm, a target reset is recommended,比如下面的博客就有这样的问题: 
Windows上使用 OpenOCD 给 STM32 下载程序_MCUlover666的技术博客_51CTO博客 STM32开发环境】Linux下开发stm32(二) | 使用openocd下载程序_Mculover666的博客-CSDN博客_openocd

 

 Thread: [OpenOCD-devel] J-TAG flash programming issues STM32F7 | OpenOCD - Open On-Chip Debugger

我猜测原因:

  • 第一是我的OpenOCD版本跟他们不一样,我这个是最新版。
  • 第二,因为连接上了OpenOCD,这个的gdbserver没有正常退出啥的
  • 第三,直接写的命令 -c halt 没有生效,必须按照我那种写法。

网上也有人是这样写的命令行:(我就是从这儿得到的启发,大家也可以自己启发一下)

openocd -f interface/ftdi/jtagkey.cfg -f myboard_EK390.cfg -c "init; targets; reset halt; wait_halt; poll; flash write_image erase unlock Debug-EK390-0/FirmwareEK390_caffe.elf; flash erase_check 0; reset run; shutdown"

OpenOCD参考手册:

  • 使用openocd的一些技巧:OpenOCD使用指南-oceanhehy-ChinaUnix博客
    使用jtag时,最好使的cpu复位后不执行任何指令直接halt,相关指令为:reset halt,另外还有类似指令reset run、reset init,这些指令在openocd手册中都有说明。

    Openocd的配置文件为tcl脚本,所以使用proc可以定义一个类似函数的接口。通过使用proc,可以省去不少麻烦。

    在MinGW编译出的openocd可以在windows的cmd中直接运行,可是如果jtag接口没有和板子接口,会出现程序死掉的情况,而且退不掉。此时重新在板子带电情况下拔插一下openjtag,然后重新打开新的cmd运行openocd即可。不过,此时必须更改telnet_port,因为,刚才死掉的openocd占用着原先的端口。
  • 官方文档 OpenOCD用户指南_子曰小玖的博客-CSDN博客_openocd

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐