解决在clion下使用openOCD无法对stm32u0进行程序下载与调试的问题

本文最后更新于 2024年7月14日 下午

Open On-Chip Debugger

操作系统ubuntu24.04

开发板:STM32U0DK

调试工具:板载stlink调试器

想要节省时间直接看完整实现

问题描述

STM32U0是意法半导体今年推出的低功耗mcu,openocd最近的一次正式版本为0.12,推出时间是2023年,所以可想openocd而知是缺乏对这款muc的支持的,最近在尝试使用cmake加openocd进行stm32的开发,而恰好最近有项目想要尝试这款新出的低功耗MUC(目前使用的STM32U083DK官方的评估板),就想尝试如何在openocd还没有对芯片进行适配的情况下使用openocd对stm32u0进行程序下载与调试

碰壁过程

虽然正式版本没有对STM32U0的支持,但是我还是尝试在新的提交和openocd的预览版本中寻找相关的配置文件,也就是stm32u0x.cfg文件,最终尝试无果,于是我便尝试在各个不同的芯片的配置文件之间寻找突破点,想尝试自己通过少量的修改来编写cfg文件,但是吧,看不懂

心灰意冷之后我甚至想要放弃这个想法,并且我也已经开始寻找了新的调试stm32u0的解决办法,我就开始想要一个折中的办法,STM32cubeIDE是对所有的芯片都有适配的,我就想尝试使用STM32cubeIDE的调试功能,结合clion的代码编写…..,这有点像是windows上用vscode+keil5,虽是下策但是也一种方案,在研究cubeIDE的烧录的时候我突然发现cubeIDE自己集成了一个Openocd,然而这个Openocd支持用stlink对U0的烧录和调试,

如下图所示打开Debug configrations这里有三个选项,

Untitled

Untitled
这里STM32cubeIDE官方支持了OpenOCD,这里令我很意外,然后我就立马意识到既然它支持OpenOCD,那一定会有相关的OpenOCD配置文件,结果也如我所料,这里的路径指向了project路径下的一个cfg文件

Untitled
然后打开一看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# This is an STM32U083C-DK board with a single STM32U083MCTx chip
#
# Generated by STM32CubeIDE
# Take care that such file, as generated, may be overridden without any early notice. Please have a look to debug launch configuration setup(s)

source [find interface/stlink-dap.cfg]

set WORKAREASIZE 0x8000

transport select "dapdirect_swd"

set CHIPNAME STM32U083MCTx
set BOARDNAME STM32U083C-DK

# Enable debug when in low power modes
set ENABLE_LOW_POWER 1

# Stop Watchdog counters when halt
set STOP_WATCHDOG 1

# STlink Debug clock frequency
set CLOCK_FREQ 8000

# Reset configuration
# use hardware reset, connect under reset
# connect_assert_srst needed if low power mode application running (WFI...)
reset_config srst_only srst_nogate connect_assert_srst
set CONNECT_UNDER_RESET 1
set CORE_RESET 0

# ACCESS PORT NUMBER
set AP_NUM 0
# GDB PORT
set GDB_PORT 3333

# BCTM CPU variables

source [find target/stm32u0x.cfg]

注意这里的最后一行,已经指向了我所需要的文件。

到了这里了就长话短说了,因为如果我将我遇到的全部错误都写出来估计篇幅有点大了,我将这个stm32ux.cfg(路径在STM32cubeIDE安装路径下的插件文件夹中,我使用find指令查找到的)文件放在了openocd的target文件中,运行后会提示缺少某个脚本文件,这个脚本文件在STM32cubeIDE安装路径也有提供,在stm32ux.cfg的上一级目录中,我在openocd的路径下复制了一份过去,本以为应该都解决了,然后不出意外的出意外了,报错信息如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/usr/bin/openocd -s /usr/share/openocd/scripts -f "/home/shishengmi/code/STM32/U0_debug_test/U0_debug_test Debug.cfg" -c "tcl_port disabled" -c "gdb_port disabled" -c "tcl_port disabled" -c "program \"/home/shishengmi/code/STM32/STM32U0DK_Test/cmake-build-debug-arm_gcc/STM32U0DK_Test.elf\"" -c reset -c shutdown
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : STLINK V2J43M28 (API v2) VID:PID 0483:3752
Info : Target voltage: 3.208438
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : clock speed 4000 kHz
Info : stlink_dap_op_connect(connect)
Info : SWD DPIDR 0x6ba02477
Info : [STM32U083MCTx.cpu] Cortex-M0+ r0p1 processor detected
Info : [STM32U083MCTx.cpu] target has 4 breakpoints, 2 watchpoints
Info : gdb port disabled
Info : [STM32U083MCTx.cpu] external reset detected
[STM32U083MCTx.cpu] halted due to debug-request, current mode: Thread
xPSR: 0xf1000000 pc: 0x08001210 msp: 0x20008000
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
** Programming Started **
Warn : Cannot identify target as an STM32G0/G4/L4/L4+/L5/U5/WB/WL family device.
Error: auto_probe failed
embedded:startup.tcl:1516: Error: ** Programming Failed **
in procedure 'program'
in procedure 'program_error' called at file "embedded:startup.tcl", line 1581
at file "embedded:startup.tcl", line 1516

这里非常重要我们可以看到这里提示“Cannot identify target as an STM32G0G4/L4/L4+/L5/U5/WB/WL family device.”,就是说我本地全局安装的的OpenOCD还是识别不了STM32U0,但是为什么STM32的OpenOCD就可以识别并下载呢?我们来仔细看一下CubeIDE的OpenOCD开头,

Untitled

这里一看居然是一个Openocd的分支,是由ST公司维护的,GPL协议真棒

https://github.com/STMicroelectronics/OpenOCD

这应该能解决最后一块拼图了,在clion中设置,嵌入式开发中选择

/opt/st/stm32cubeide_1.15.1/plugins/com.st.stm32cube.ide.mcu.externaltools.openocd.linux64_2.3.100.202312181736/tools/bin/openocd

啪,又有问题了,clion无法识别,虽然在命令行中可以运行,但是在clion中无法识别,可能问题是openocd要处理环境变量,emmm,解决办法很简单,将

/opt/st/stm32cubeide_1.15.1/plugins/com.st.stm32cube.ide.mcu.externaltools.openocd.linux64_2.3.100.202312181736/tools/bin/openocd

替换掉/usr/bin/openocd,这样就可以解决openocd环境变量的问题,clion也可以正常的使用这个openocd,然后使用cubeide生成的cfg文件就可以下载和调试了。

完整实现

首先确保安装了cubeide和openocd !下面仅以Ubuntu24.04做演示,windows按照这个思路应该更加简单,主要涉及的就是

1、可执行文件的替换

2、将cubeide的openocd的部分文件移动到全局环境、

替换可执行文件

使用find指令找到cubeide下的openocd以及全局环境的opencod

1
sudo find / -name openocd
1
sudo cp /opt/st/stm32cubeide_1.15.1/plugins/com.st.stm32cube.ide.mcu.externaltools.openocd.linux64_2.3.100.202312181736/tools/bin/openocd /home/shishengmi/.local/share/Trash/files/bin

替换个文件应该都会吧

然后移植部分cfg文件和tcl脚本

需要移植的是stm32u0x.cfg,和gdb_helper.tcl 将这两个文件,使用全局查找可以找到

Untitled

将cfg文件放到全局openocd环境下的/scripts/target路径下,我这里是/usr/share/openocd/scripts/target

将tcl文件放在/scripts文件夹下也就是/usr/share/openocd/scripts

这里的路径因环境的差异而不同

做完这两步应该就可以正常使用openocd进行调试了

main.cfg文件的获取

我将这个cfg文件成为main,因为cfg文件之间可以相互调用,但是对clion来说需要一个最主要的cfg文件来进行命令的执行,

获取的方法也很简单,使用cubeide生成一个对应芯片的空白工程即可,然后这个cfg文件就会生成在工程根目录下,同样的芯片应该是通用的,然后将这个cfg文件移动到我们clion处理的cmake工程下,然后在“OpenOCD下载并运行”中将面板配置文件改为这个cfg文件,为了后面图省事也可以将这个工程文件放到board文件夹下,以后每次使用点击辅助即可直接调用这个文件

Untitled


解决在clion下使用openOCD无法对stm32u0进行程序下载与调试的问题
http://shishengmi.com/2024/06/04/2024/06/debug-stm32u0-with-openOCD/
作者
shishengmi
发布于
2024年6月4日
许可协议