下文提到的资源链接
需要准备的软件有arm-none-eabi-gcc编译器,CLion,STM32CubeMX,OpenOCD
还有可选的JLink驱动套件
/etc/profile
中设置PATH环境变量即可sudo apt install openocd
sudo apt install default-jre
,运行其中的SetupSTM32CubeMX-****.linux
按照图形界面安装即可,操作与Windows大同小异,就是不会自动创建桌面图标安装好STM32CubeMX之后第一次启动需要设置固件库的路径并下载固件库。
点击右侧第二个按键INSTALL/REMOVE
打开固件库列表
勾选需要的固件库下载安装。我已经装过了。(这个仅需设置一次)
安装完成后回到主界面,点击中间深蓝色框内的第一个按键ACCESS TO MCU SELECTOR
打开MCU列表,如果出现一个进度条没完没了可以直接关闭,不影响。
选择MCU,通过左侧上方的搜索框可以快速找到需要的MCU,我使用STM32F103C8T6为例。
双击列表的那一栏选择。
设置PC13引脚为输出,来一个点灯,RCC中的外部高速时钟为图片中的,SYS的debug为Serial Wire。
其他的都可以不设置,SYS的debug是一定一定要设置的,否则下一次下载程序的时候会因为调试接口关闭无法下载,如果还是忘记了可以在下载开始的一瞬间按下复位键手动复位,时机自己摸索去吧,多试几次就能成功,问题不大。
转到第二个选项卡,时钟设置直接把HCLK输入最高的72M然后回车让它自动设置。
给自己的工程起个名字,选择一个路径,Toolchain/IDE选择SW4STM32,这是CLion能够解析的。
转到左侧第二个选项卡,的第二个框的第一个选项,这个选项能把每一个外设的初始化代码分别写在独立的.c/.h文件里,更加整洁。
Cube的配置到此结束,点击右上角的GENTER CODE
来生成你的工程。完事后直接关掉弹窗
打开CLion。
CLion打开,找到工程文件夹里的ioc文件然后作为一个工程打开。
打开CLion的设置,找到Build,Execute,Deployment->Embedded Development选项,填入OpenOCD的路径和Cube的路径并测试,如果是apt安装的openocd路径应该是一样的,Cube自己找,完成后保存。(这个仅需设置一次)
还是Build,Execute,Deployment,找到第一个Toolchain选项,点击加号选择System新建一个工具链,按照arm-none-eabi-gcc编译器的路径分别找到bin/arm-none-eabi-gcc
, bin/arm-none-eabi-g++
,bin/arm-none-eabi-gdb
作为C编译器,C++编译器,调试器。CMake和make自动就好。(这个仅需设置一次)
转到Toolchain下方的CMake选项卡,把右侧焦点的工具链选项设置为刚刚新建的工具链到此,工程的编译工具就设置完了。
回到CLion主界面,CMake已经自动运行一次了配置成功了。
右上角的生成目标选择***.elf
然后点击旁边的锤子进行编译,可以看见已经编译成功了。
自己在Src/main.c的主循环里写两行点灯代码再编译一遍。
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
HAL_Delay(300);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
一定要写在 USER CODE BEGIN 注释和USER CODE END注释之间,否则Cube重新生成的时候会抹掉。
右上角的生成目标打开第一个配置选项,第一行的Target点击,选中****.elf
然后第二行的也自动配置了。
找到配置的第三行Board config file,点最后面的Assist。在弹窗中随便找一个,然后点击下方中间的Copy to Project & Use
复制到自己的工程里,然后把原文删掉,替换成如下的。
interface jlink #使用JLink
transport select swd #SWD接口
source [find target/stm32f1x.cfg] #stm32f1x的配置文件
如果嫌麻烦的可以找到模板的目录,把自己改好重命名的放进去,这样就可以直接选择不用改动了。
三行改完之后看见最下面的error消失了,OK关闭。
现在就可以点击运行箭头进行程序下载或者debug了。
在CMakeLists_template.txt的40、42、44行分别是添加全局宏定义,添加源文件,添加include路径的位置,不要更改原来的的,往里填自己的文件就行了,在源文件使用的file函数中也可以使用*.c
这样的通配符,宏定义要在前面加-D,就像-DUSE_HAL_DRIVER
,中间没有空格,添加完后在Project栏中对ioc文件右键,选择Update CMake Project with STM32CubeMX
来更新CMake。CMake就配置成功了。这样就能实现基本的添加文件和宏的操作了。
Cube不自动生成DSP库的文件,需要自己添加,可以在Keil的CMSIS库中找到也可以直接在我这里下载。
复制DSP文件夹到工程根目录里,然后在CMakeLists_template.txt第44行的include_directories和add_executable之间插入下面四行,重新生成CMakeLists.txt编译就可以了。
#DSP
add_definitions(-DARM_MATH_CM3 -DARM_MATH_MATRIX_CHECK -DARM_MATH_ROUNDING)
include_directories("DSP/Include")
link_directories(DSP/Lib/GCC)
link_libraries(libarm_cortexM3l_math.a)
这个是F1的,没有FPU,如果是F4的有FPU的话在22,23行有注释Uncomment for hardware floating point
取消注释就能启用FPU,库libarm_cortexM3l_math.a
也要换成对应的,然后自己添加的add_definitions
就和他的重复了可以注释掉了,关于F7,H7那种有双精度FPU的没有试过,应该还要改FPU_FLAGS的内容。
在OCD调试控制台的第三个选项卡有一个Peripherals
选项,显示它需要对应芯片的svd文件,在我的wj中有SVD文件夹,里面有F1和F4的芯片的svd文件选择对应的复制到工程里然后Load,弹出的外设选择需要的,不嫌乱就全选,反正还可以点击旁边的小漏斗再筛选。
最终的效果就是这样的,CLion不像Keil,它不能事实更新观察变量或者寄存器的值,只有出现暂停的时候才能刷新,除了配置麻烦点这是唯一的不足,但是看在CLion其他优秀的功能上可以忍(手动滑稽)。
还是选择目标的下拉框,配置,添加一个Embedded GDB Server,如图配置一下就可以用了,实际上使用效果不如OpenOCD。
JLinkGDBServer的GDB端口默认是2331,-device
后面的是芯片名字,剩下的照抄就行。
localhost:2331
/usr/bin/JLinkGDBServer
-select USB -device STM32F103C8 -if SWD -speed 4000 -noir
Linux上使用CLion开发STM32应该是最好的选择了,win上面OpenOCD的驱动问题实在恶心,JLinkGDBserver只能调试又不能下载程序。所以CLion还是再Linux上好使。JLinkGDBServer因为我是JLinkOB,JLink驱动版本过高没有办法用,如果是V9或者更高的是完全没有问题的,JLink驱动套件中还是有很多强大的工具的,所以带上它了。CLion一些“过分细心”的错误提示高亮在设置里面关一关就行,总体是使用体验还是不错的,这样在Linux下开发单片机和其他Linux程序就不用频繁切换系统了,还不错的选择。