OpenOCD笔记说明
现在我对OpenOCD有了一点了解后,我就想着针对入门级这个范围写下我的理解,分享一下有关于OpenOCD的使用方法,也算是总结和梳理。 查找相关的博客的时候,我看到的文章其实都比较浅,也有比较好的,但是非常少。不过据我观察没有一篇能够带着你读手册然后根据手册写教程的,好多都是人云亦云,也不知道为什么cfg文件要这么写,本文力在解决这一点。 本文的主要内容是编写cfg,并引申出与cfg文件相关的一些内容。侧重于理解和实践,希望能够帮助大家了解如下几点内容: - 能够独立地编写和使用cfg文件
- 能够阅读和参考其他的cfg文件
- 能够在IDE和命令行环境中使用OpenOCD
- Bootloader的例子
- 能够查阅相关文档
环境:Windows 11 CLion Windows Terminal OpenOCD0.12.0 ST-Link STM32H750VBT6
为什么没有Keil?因为Keil不用OpenOCD下代码。 OpenOCD的安装注意:Windows 安装很简单,到Github上去下载已经被编译过的压缩包即可。 拉到最底下点击方框内容即可下载。 将下载的压缩包解压到自己平常软件的安装位置,并将解压后的文件下的bin文件夹路径添加到环境变量中,如下: 最后保存打开控制台,输入openocd -v后能够得到如下输出: 如何使用OpenOCD基本的流程是这样的: - 创建并编写后缀为cfg的文件
- 通过控制台或者IDE使用该cfg文件将代码下载到单片机里
编写一个能用的cfg文件cfg文件是config的缩写,指的是配置文件。OpenOCD通过该文件中的内容来将bin文件下载到单片机的FLASH中去,也可以细致地指定代码在实际Flash中的位置,以及要不要在下载后复位等。 最简单的cfg文件代表仅仅只有下载需求,即代码能够下载到单片机的内部flash中去。 那只要确定好两个步骤即可: 然后就可以得到这样的cfg文件,简单的下载需求是没有问题的: source [findinterface/stlink.cfg]
source [find target/stm32h7x.cfg]
interface/stlink.cfg和stm32h7x.cfg处于OpenOCD的安装目录下面share\openocd 打开interface这个目录可以看到有很多的配置文件,比如jlink.cfgcmsis-dap.cfg等,我们要根据自己的下载器来引用不同的配置文件。 而target目录下面则是厂家的芯片配置文件,也是要根据具体的单片机来引用。
使用OpenOCD进行下载
在CLion下载CLion提供了相关的图形化的界面让你点击绿色的三角就可以编译代码并按照cfg文件的描述进行下载。 如何在CLion中搭建这样的开发环境呢?可以参考这一篇博客
在Terminal中下载
首先还是要输入openocd -v确保OpenOCD已经添加到了环境变量中,不然输入了半天发现没有添加到环境中就搞笑了。 然后执行类似于如下的命令即可将代码下载到单片机中去 openocd -f dmeo.cfg-c "program dmeo.bin 0x08000000 exit resert"
乍一看复杂得很,但其实每一个命令都是有意义的,下面会从这条命令入手,解读其意思,并制作cfg脚本。 上面的命令执行可能还是会有一点问题: - cfg文件路径要指明清楚
- 执行命令前,要确保电脑和下载器连接好了,下载器也要和单片机连接好
- demo.bin指的是你要下载到单片机里的文件,可能存在路径和权限问题
- 0x80000000可能并不适用于你的单片机,要根据实际情况修改
基本命令选项——file在解决以上问题之前,先大致了解一下-f和-c这两个基本的命令选项起到了一些什么样的作用: openocd -f path\to\xxx.cfg
这个命令选项可以给OpenOCD指定配置文件,比如我们的例子: openocd -f demo.cfg
可以使用多个-f联合使用多个cfg文件。比如上面的demo.cfg实际上是引用了stlink.cfg和stm32h7x.cfg这两个文件,因此也可以这样: openocd -finterface\stlink.cfg -f target\stm32h7x.cfg
去掉interface或者target行不行?回答是不行,OpenOCD会找不到文件而报错退出。
基本命令选项——command如果总结-f后面紧跟的是cfg文件的话,那-c后面紧跟着的就是命令。 -c后program是一条下载命令,它需要你提供文件地址以及下载偏移,文件地址好理解,你要下载某一份代码,总要给人家地址。而偏移则是指的是你要下载到单片机里的具体位置。可能你并不清楚应该要填什么,不过没关系,先缺省着不填下载试试,下面就是执行没有上述示例的0x080000000即 openocd -finterface\stlink.cfg -f target\stm32h7x.cfg -c "program demo.bin exitreset"
然后你会得到如下信息: 图片里的这个信息就告诉了你要下载的单片机的代码存放地址是哪里,然后按照它给的信息填写到上方的命令中即可。这里指的是芯片的Flash的起始地址。 除此之外,program命令还提供一些可选的需求:比如执行后命令后退不退出OpenOCD、程序下载到单片机以后单片机复位不复位,以及要不要对下载到单片机里边的数据和电脑上的bin文件进行校验等。一般来说reset、exit就足够,分别对应着单片机复位、退出OpenOCD。至于什么是退出OpenOCD,后面会有解释。
实际的用法展示
所以在E:\demo这个目录下,我实际要执行的命令是: openocd -finterface\stlink.cfg -f target\stm32h7x.cfg -c "programcmake-build-debug-arm/Bootloader.bin 0x08000000 exit reset"
其中cmake-build-debug-arm/为demo的子目录,编译后的文件就在其中,如果你的Terminal路径在C盘,并且想要下载其他盘符下的文件,那么就需要给出要下载的文件的完整路径,这一点十分重要。
如何编写更加复杂的cfg文件复杂这个概念是要根据需求来的,如果你觉得普通的下载不能满需求的时候,复杂就随之而来。 我有一个需求就是Bootloader,有两种情况,第一种较为简单,就是想要将代码下载到内部Flash中特定的位置上,相当于将内部Flash划分成两个部分。第二种则是要将代码下载到外部的Flash中。
内部FLASH的Bootloader在OpenOCD中实现很简单,按照上述的下载方式调用program命令,并指定你要下载的位置即可,比如上面写的是0x08000000,但是这是最开始的地址,如果你想把代码写入到128K的中间位置,前64KB给做跳转程序,后64KB来做跳转后的运行程序,那么就应该修改下载的地址,将0x08000000改为0x08010000: openocd -finterface\stlink.cfg -f target\stm32h7x.cfg -c "programcmake-build-debug-arm/Bootloader.bin 0x08010000 exit reset"
这就可以将代码下载到0x08010000这个位置,也就是64KB处。 这好像和cfg文件没有任何关系,仍然还是命令行的方式,但实际上,我们是可以将这些命令写入到cfg文件中的,最后能够得到的文件如下:
source [find interface/stlink.cfg]
source [find target/stm32h7x.cfg]
set FILENAME "E:/demo/cmake-build-debug-arm/Bootloader.bin"
program $FILENAME 0x08010000 exit reset
其中set代表给FILENAME这个变量设置值,对应着编程语言中的赋值。也要注意引用路径的时候,要使用斜杠,也就是\。
外部FLASH的Bootloader外部FLASH中考虑的东西相对较多,但从理解上讲无非只是步骤麻烦了点,但实际并非这样简单。我也写过针对STM32H750VBT6这款芯片的外部Bootloader的实现的文章,并提供了代码,放在了Github上。
查看已有的cfg文件示例cfg文件用到的是TCL脚本的语法,但也没有必要专门去学TCL脚本是怎么编写的,因为OpenOCD的文件里都自带了相当数量的cfg文件,有什么不会的可以直接进行参考。 你可能会问cfg文件那么多,要看哪个合适?我总结了两点: 1. 根据自己的芯片型号查看同型号的cfg文件。 2. 如果是某一个具体的命令的用法那就通过findstr或者grep命令查找对应的关键字。 比如在Windows下可以通过findstr进行字符串的查找write_image的用法,不会写findstr的查找内容也没关系,问问ChatGPT,它能给出很有用的回复。 findstr /s /c"write_image" *.cfg
同时也要理解一些TCL语法,比如proc、set等看多了就知道是什么意思了。proc声明函数,set声明变量… 如何查阅OpenOCD的文档但读手册是一定可以找到答案的。
当你需要使用OpenOCD查看单片机的更多信息,就不可避免的要查阅手册。比如不同命令的选项,比如执行flashwrite_image之前需要先执行halt,你需要查看flash的标定容量等…… 只有查手册你才可能知道原来OpenOCD的flash write_image命令可以支持bin(binary), ihex (Intel hex), elf (ELF file), s19 (Motorola s19). mem, builder这几种文件的下载。 可能有朋友比较了解会发出疑问,看别人都指定了下载速率以及下载的接口,你怎么不指定?
原因是openocd会帮我们做好这些,它会自动探测你的下载器的速率,并且为之选择一个合适的速率,然后会在输出的log信息里告诉你。下载的接口也是同理。
意思就是没有指定是jtag还是swd还是其他的,那么openocd会自动选择一个能用的。如果你知道你的下载接口,那你可以通过transport select直接指定,比如transport select jtag,tarnsport select hla_swd.那hla_swd和swd有何区别,其实文档里也说了:
如何查看手册呢?我的建议是 - 知道自己要了解什么样的内容和什么有关,然后直奔人家的目录。目录还是比较好懂的。
- 问ChatGPT自己应该去了解OpenOCD的哪个内容。但是并不推荐全部依靠ChatGPT,因为有些命令它也是乱给的。
- 关键词,这个很重要,浏览器中自己Ctrl+F呼出搜索面板然后查找关键词。(建议PDF,官网提供的HTML美观程度好点,但是他是一章一章的,导致关键词不能全局搜索)
- 英文不好利用插件来(其实更加推荐复制粘贴给ChatGPT)
- 查找相关的博客(会简单使用以后有时候不如看手册)
通过命令行查看更多的信息OpenOCD是支持远程调试的(虽然我没有试过),当然也可以使用本地进行调试,在执行下面的命令后,OpenOCD就会等待连接: openocd -finterface\stlink.cfg -f target\stm32h7x.cfg
所以之前提到的退出OpenOCD,指的是终止OpenOCD响应连接。 我们怎么连接呢?只需要重新打开一个终端,输入telnetlocalhost 4444可以进入到调试界面。如果报错,你可能需要在控制面板➡️程序与功能➡️启用和关闭Windows功能中打开Telnet客户端。 可以输入halt、reset、flashbanks等命令查看相应的信息,也可以使用flash write_image进行下载。 至于怎么知道这些命令,则需要查看OpenOCD的文档了。
其他问题单片机锁住了比如你可能需要按住reset才能下载。其实flashwrite_image这个命令也可以在下载时解锁意思就是说,如果单片机支持解锁flash,那么你又在使用flash write_image的时候启用了unlock这个选项,那么擦除flash和下载之前会解锁flash。 为什么要使用OpenOCD我觉得这也是一个需求的问题,如果你经常使用Keil做STM32芯片的相关开发,那么OpenOCD完全是没有必要的。因为资料相对比较全。但是如果你想在其他环境中,比如各种IDE或者命令行中开发ARM和非ARM芯片,应该或多或少会接触到OpenOCD。 最后本来要先发在安富莱这里的,结果写完发现欸,不支持Markdown,我看着满屏的纯文本顿时就泄了气。但是今天突然想起语雀不是可以导出word文档嘛,然后发现嗯,除了图片没有复制过来,其他的都还好,基本能看。 好了。发现帖子的图片显示不了,我贴上本文的PDF文档。
有什么问题,欢迎大家来讨论。
|