STM32的开发工具相对来说还是不少的,从STM32CubeMX支持生成的工程就能看出来。但是他们都基于Eclipse的,实际使用遇到过各种问题。
嵌入式开发工具都很原始,Keil、IAR、Eclipse,都算不上方便!是不是很羡慕Android开发者、QT开发者、前端开发者、后端开发者… …都有一个强大的IDE?
这里推荐使用CLion进行C/C++相关开发,这算得上目前C/C++最好的IDE了。
CLion从2019版本开始官方支持嵌入式开发,在低版本可搜索OpenOCD插件(不推荐),2019也就是把这个插件并入了。
本文介绍如何配置CLion用来开发和调试STM32。其他嵌入式项目也可作为参考。
注:
- 测试环境是macOS,Ubuntu也是可以的,基本上一样。
- 需使用CLion2019
这里有个例子,可参考:GitHub Repository
所需的软件和工具
- STM32CubeMX
- SW4STM32
- CLion 2019
- stlink调试器
生成项目
使用CubeMX生成SW4STM32的工程,用CLion直接打开项目目录即可。
编译
基本原理/过程:
CLion的插件根据SW4STM32项目生成CMake文件,这个cmake文件就是配置使用交叉编译器进行编译。
交叉编译器我们需要自行下载,如gcc-arm-none-eabi-8-2018-q4-major
,然后把bin目录加入环境变量。
- 安装交叉编译器
三种方式:
- 使用SW4STM32自带的,请在安装目录找。对于macOS它在
/Applications/Ac6/SystemWorkbench.app/Contents/Eclipse/plugins/fr.ac6.mcu.externaltools.arm-none.macos64_1.17.0.201812190825/tools/compiler
- 在官网下载:https://developer.arm.com/tools-and-software
- 使用包管理器
brew cask install gcc-arm-embedded
- 配置环境变量
把交叉编译器的bin目录加入环境变量:
PATH=$PATH:交叉编译器路径/bin
运行和调试:
用CLion这个插件/功能目前问题多多,直接使用是不行的,以下是解决方法。
- 准备工具
烧写和调试芯片使用openocd和stlink。在macOS下,可使用下面的安装步骤。ubuntu下吧brew安装的包换成apt应该就可以。
brew install openocd
brew install stlink
创建配置文件:
新建config.cfg内容如下:
source [find interface/stlink-v2.cfg]
source [find target/stm32f1x.cfg]
其中第一行目前有三种stlink,对应的文件名为:
stlink-v1.cfg
stlink-v2.cfg
stlink-v2-1.cfg
第二行stm32f1x.cfg必须取自于openocd安装目录(mac下:/usr/local/Cellar/open-ocd/0.10.0/share/openocd/scripts/target)里有的。
基本上是类似如下:
stm32f0x.cfg
stm32f1x.cfg
stm32f2x.cfg
stm32f3x.cfg
stm32f4x.cfg
stm32f7x.cfg
stm32l0x.cfg
stm32l1x.cfg
stm32l4x.cfg
… …
配置cfg文件:
关于上图的ASSIST按钮:CLion会自动检测这个目录下的cfg:/usr/local/Cellar/open-ocd/0.10.0/share/openocd/scripts/board
,这个目录里是一些board的配置,我们一般用不到。为了以后使用方便,建议把他们删除或备份,清空目录后添加几个自己常用的放在上面,比如根据以上组合:stm32f1x-stlink-v2.cfg。这样就不用每次配置了。
配置调试器为GDB:
完成以上设置后,设置任意断点,然后点击debug就能正常调试了~
如图:
其他
SW4STM32无法烧写和调试
这是因为默认的配置需要我们手动复位,而且手动复位的时间很微妙,很不容易成功。需要设置如下即可:
PS:
新版本的openocd和clion有所变化。但是整体流程差不多:
找到openocd的scripts目录:
比如:/opt/homebrew/share/openocd/scripts/
board里有很多一般用不到,为了方便后续在IDE定位,先移动:
mv board board_backup
新建board文件夹并在里面创建一些自己使用的cfg(从board_backup复制修改):
比如:
stm32f1x-stlink.cfg
内部是:
source [find interface/stlink.cfg]
source [find target/stm32f1x.cfg]
后续使用它就可以了
PS:
对于jlink,类似上述过程,创建stm32f1x-jlink-swd.cfg
内容为:
source [find interface/jlink-swd.cfg]
source [find target/stm32f1x.cfg]
其中interface/jlink-swd.cfg来自于interface/jlink.cfg,在原有基础上修改成为:
adapter driver jlink
transport select swd