嵌入式IDE:OpenOCD原理与STLink连接STM32板子

引言

我们做单片机开发,用得比较多的stm32f1xx,stm32f4xx等等,基本上都是用keil(或者说称为mdk)这个集成开发环境IDE比较多,插上调试器,连接板子,编译,下载,调试,方便得很。大家有没有想过一个问题,如果没有IDE了,我们还能做单片机开发吗???大家难道就不想知道IDE到底干了啥吗???

IDE运行过程

一个现代IDE,大致可以分为如下几个功能:

  1. 代码编码:IDE使用的是QScitinal这样的编辑器库
  2. 代码智能提示:后台调用clang软件
  3. 代码语法错误动态检测:后台调用gcc或者clang都可以
  4. 工程源码组织:IDE使用的是makefile,后台调用make软件
  5. 编译:IDE后台调用gcc编译器
  6. 连接硬件调试器:IDE通过后台软件OpenOCD连接调试器和板子
  7. 下载:IDE给OpenOCD发命令
  8. 调试:IDE后台调用gdb,给gdb发命令,gdb再给OpenOCD发命令,OpenOCD再指挥调试器,控制板子。实现单步执行,查看变量值,寄存器等。

我们可以发现,IDE所做的事,都是由已有软件来完成,其实就是组织这些已有的软件,让他们协同工作起来,方便了我们开发者使用嘛。所以嘛,IDE叫做集成开发环境。看完后,是不是觉得自己也能做一个IDE啦,哈哈哈~,我最近就在做这个事情,如果有志同道合的兴趣,可以交流讨论喔 qq:2488890051


这里看一下市面上非常常见的基于eclipse改造的嵌入式IDE都有哪些基本功能:

eclipse是一个支持插件的通用型IDE,啥程序都能开发,java,c/c++,网站开发,html等,无所不能。当然官方就为其开发了一个嵌入式开发的插件,来实现嵌入式开发功能,插件名字:Eclipse Embedded C/C++ Development Tools,Eclipse Embedded CDT | Eclipse Embedded CDT (C/C++ Development Tools)™

然后,其中包含如下几个exe,就实现了嵌入式开发功能了。

 很明显,需要make进行makefile执行(其实windows系统也有个叫mingw32-make.exe,我试了也行的),arm的gcc编译器,OpenOCD用于连接板子的硬件调试器,QEMU实现板子的纯软件模拟仿真功能。也就是说,自己搞嵌入式IDE(不是基于eclipse),也至少支持这几个exe即可,事实上我就是这样干的。


注意:OpenOCD只是通用的连接硬件调试器的工具而已,其实针对每一款调试器人家官方也都给出了对应的连接这个调试器的工具,比如st的stlink,就有stlink这个开源库(驱动单片机硬件调试器的一些开源库总结(包含stlink调试器)_标biao的博客-CSDN博客_stlink 开源),而且我在rtthread studio的使用中,发现它还有SDK包文件夹有 

  

而关于,jlink调试器,也有自己的:

 大家可以去研究研究。


这里重点介绍 OpenOCD 是什么

OpenOCD 是什么

从上面IDE的步骤中可以看出,OpenOCD 就是一个连通gdb和硬件调试器的工具,linux,macos,windows都可用。OpenOCD 支持大量的硬件调试器,常见的比如stm32常用的stlink,jlink调试器等。OpenOCD是一个运行于PC上的开源调试软件,最初是由Dominic Rath同学还在大学期间发起的(2005年)项目。OpenOCD旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。

这里演示如何在windows系统上利用 OpenOCD 实现正点原子stm32f407单片机开发板的调试。

我们可以下载 OpenOCD 的源代码,自己编译成exe。还可以下载编译好的exe,我们选这个。

1. 下载OpenOCD

https://gnutoolchains.com/arm-eabi/openocd/ 下载最新版即可。解压即可,不用安装。然后把这个bin文件夹路径添加到系统环境变量即可。

文件夹内容介绍: 

bin文件夹:openOCD.exe等可执行文件

drivers文件夹:常见的硬件调试器的驱动,这里要注意,硬件调试器第一步是需要安装驱动的,否则设备管理器识别不到的,那当然OpenOCD就压根没法驱动它了。硬件调试器插上电脑usb口,如果驱动安装的了,设备管理器会显示设备的,否则会有黄色感叹号。我这个就是驱动之前已经按照过了的。

 

 share文件夹:OpenOCD连接硬件调试器的一些脚本协议文件,不同调试器,不同板子,选择对应的即可。

2. 运行OpenOCD

由于是gdb给OpenOCD发调试命令的,先确保自己安装了 arm-none-eabi-gcc 编译器工具链(而且把bin文件夹路径添加到系统环境变量),里面会有arm-none-eabi-gdb.exe。

  • 打开powershell命令行窗口(因为cmd命令行窗口不太好用)输入 arm-none-eabi-gdb -v,有版本信息打印出来,说明gdb环境成功了。
  • 继续输入 openocd.exe,如果显示如下则说明 OpenOCD 环境也成功了。
  • 继续输入 
    openocd -f C:\Users\86132\Downloads\openocd-20211118\OpenOCD-20211118-0.11.0\share\openocd\scripts\interface\stlink.cfg -f C:\Users\86132\Downloads\openocd-20211118\OpenOCD-20211118-0.11.0\share\openocd\scripts\board\stm32f4discovery.cfg

    意思是
    通过 -f 选项 给 OpenOCD 指定硬件调试器的协议文件(虽然我的stlink调试器是v2版本,但是为什么这里命令是stlink.cfg文件,而不是stlink-v2.cfg呢,因为我打开stlink-v2.cfg看了,说已经摒弃了,都采用stlink.cfg文件了),

    第二个是板子信息(只要单片机名字相同就行了):

    我的是stm32f407xx板子,所以用的 scripts\board\stm32f4discovery.cfg
    如果是stm32f03zet6,就用 scripts\target\stm32f1x.cfg

    出现下面界面,说明 openocd 连结 硬件调试器stlink成功啦。正在等待gdb通过3333端口来连接它。

  •  

  •  此时再打开一个 powershell命令行窗口,输入 
     arm-none-eabi-gdb C:\Users\86132\Desktop\file\stm32f407\beep_openOCD\OBJ\BEEP.axf

    意思是gdb调试目标文件为 BEEP.axf,这个文件是我用keil编译生成的,网上有人生成的是xx.elf文件,都是一样的,都是包含了调试信息的目标文件。
  • 输入 target remote localhost:3333
    也就是连接刚刚 openocd那边等待的那个端口。如下,说明程序已经通过成功下载到板子了,运行到delay_xms函数里了
  • 3. 调试板子程序

    OpenOCD中,gdb常见的输入命令:

  • q:退出gdb调试环境
  • n:下一步,会跳过函数
  • finish:跳出当前函数
  • ctrl+c:在OpenOCD命令行窗口,这个快捷键可以结束OpenOCD调试
  • 还有更多,查看相关文档
  •  

    关于如何通过OpenOCD把程序下载到板子上,还没有研究,但是跟调试时候可能不一样了,猜测是不需要gdb了,直接命令行给OpenOCD发下载目标文件的命令即可。

    参考文章:

    使用GDB(二):调试程序常用命令_七妹要奈斯的博客-CSDN博客_gdb常用调试命令

    gdb调试常用命令_Zbb的笔记的博客-CSDN博客_gdb调试命令大全

    利用openocd 在windows环境下GDB调试(调试器 stlinkv2)STM32_春夜喜小雨的博客-CSDN博客_openocd windows

    OpenOCD用户指南 – whoisliang的个人空间 – OSCHINA – 中文开源技术交流社区

    OpenOCD的概念,安装和使用 – 走看看

    跟我一起学OpenOCD(一) – 知乎

    物联沃分享整理
    物联沃-IOTWORD物联网 » 嵌入式IDE:OpenOCD原理与STLink连接STM32板子

    发表评论