ubuntu20.04 + arm-none-eabi-gdb + openocd + STlink调试STM32F103单片机。

目前大部分的单片机开发采用的时keil软件。一直以来我在开发stm32单片机用的也是keil软件。keil不是免费的软件,当然这个不是我不使用keil的原因。主要是keil的界面难看和编程十分难受。我比较喜欢使用vscode敲代码,插件丰富,对于嵌入式开发还可以在windows上的vscode上使用remote ssh插件连接到虚拟机。使用这个插件就和在ubuntu里面的终端操作一样。可谓是非常的方便。所以就探索在不适用keil的情况下,实现代码的编译下载和调试。

这里仅仅记录openocd配置过程和使用方法。以及gdb的调试环境。

openocd的使用主要是参考官方文档。

1.环境:

  1. ubuntu 20.04
  2. arm-none-eabi-
  3. openocd
  4. stlink
  5. stm32cubemx生成的makefile工程。

2.配置:

2.1.交叉编译工具链下载

写这篇文章时最新版本为11.2.1。下载完成后解压到自己想到保存的目录,并把bin文件设置在环境变量里。然后执行arm-none-eabi-gcc -v。看到如下结果说明gcc没有问题。就可以编译代码了。

2.2编译工程

在stm32cubemx工程中执行make命令生成 .elf .hex等文件。这里截取执行make命令的一部分,make命令编译了整个工程,生成很多中间文件,我们需要的是elf文件和hex文件: 

既然已经有了可执行文件,接下来就是download和debug了。这时候就用到了openocd了。

3.下载调试:

3.1.初始化连接

先看看官方教程怎么配置的:

通过看教程可以知道。第一个“.cfg”文件是仿真器,第二个“.cfg”文件是目标板。进入openocd的安装目录,我的机器上在/usr/share/openocd。进入script文件夹,

可以看到有interface文件夹(仿真器,我使用的是STlink-v2)和target文件夹(目标板,我是用的是stm32f103)。 

所以执行命令:

openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg

结果如下:

看到这个结果就说明启动了openocd启动了服务,跟板子连接正常。接下来就进入下载。

3.2 下载程序

先看看官方怎么说的:

下载程序就是flash命令,去擦除和写入程序到闪存。但是在使用flash命令之前。需要执行reset init。接下来才能使用flash的写入镜像命令。当然写入命令有很多,我用的是write_image这个命令写入。

在使用flash命令之前需要开启telnet 服务器,需要再开启一个终端,看官方教程:

所以基本的流程就是:

# 打开telnet 4444端口
$ telnet localhost 4444

############################################
# 初始化板子到一个状态。不执行这一条语句的话
# 板子可能在执行应用程序,PC指针和SP指针一直在变。
# 具体我也不知道初始化这个状态是什么状态。
############################################
$ reset init

# 写入镜像到flash
$ flash write_image erase filename

# 重启板子。相当于按了一下reset按钮
$ reset

  以下是我执行的结果:

 上述步骤执行完就已经烧录进去了。

3.3 GDB调试程序

先看看官方教程:

 这个教程已经说的很明白了。首先gdb加载elf文件。然后远程连接3333端口。接下来就进入GDB调试了。后面就不多说了。

 4.踩坑记录

看起来整个步骤并不难,但是在配置期间也踩了很多的坑。可能还是自己的基本功不扎实。说一下遇到的几个问题方便以后再遇到之后查看:

4.1 安装交叉编译工具链之后,执行arm-none-eabi-gdb -v命令失败。报错如下:

arm-none-eabi-gdb: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: no such file or directory

解决方式:下载这个动态库。我在自己ubuntu搜到了。使用find命令。

find / -name "libpython3.6m.so.1.0"

如果没搜到可以在网上下载。然后移动到这个文件夹里面: /usr/lib/x86_64-linux-gnu 

4.2 stm32cubemx默认的工程是不启动JTAG和SWD调试的。也就是说生成的工程关闭了调试的功能。我在这里卡了好久。下载程序时一直失败。。

解决方式:在debug选框里选择SW。

 对比一下加入和不加入debug功能的代码。src/stm32f1xx_hal_msp.c

//加入debug功能,sw
void HAL_MspInit(void)
{
  /* USER CODE BEGIN MspInit 0 */

  /* USER CODE END MspInit 0 */

  __HAL_RCC_AFIO_CLK_ENABLE();
  __HAL_RCC_PWR_CLK_ENABLE();

  /* System interrupt init*/

  /** NOJTAG: JTAG-DP Disabled and SW-DP Enabled
  */
  __HAL_AFIO_REMAP_SWJ_NOJTAG();

  /* USER CODE BEGIN MspInit 1 */

  /* USER CODE END MspInit 1 */
}


//不加入debug功能
void HAL_MspInit(void)
{
  /* USER CODE BEGIN MspInit 0 */

  /* USER CODE END MspInit 0 */

  __HAL_RCC_AFIO_CLK_ENABLE();
  __HAL_RCC_PWR_CLK_ENABLE();

  /* System interrupt init*/

  /** DISABLE: JTAG-DP Disabled and SW-DP Disabled
  */
  __HAL_AFIO_REMAP_SWJ_DISABLE();

  /* USER CODE BEGIN MspInit 1 */

  /* USER CODE END MspInit 1 */
}

可以看到不加入debug,JTAG和SW都给关闭了。这也是由于不熟悉STM32CubeMx导致的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值