之前笔者一直使用Keil
来做单片机工程的编译和调试,有时候觉得软件有点不那么友好,总结下来有以下几个缺点:
- 在看代码时,好像不支持跨文件浏览方法的调用和定义,似乎有时候又可以,但绝对不如
SourceInsight
这个软件方便 - 自动补全功能不是很强,在自己写代码时比较累而且容易出错
- 不支持插件,所以针对Keil的二次开发来提高生产力的尝试基本没有
- 总是忘记去设置
include
路径,编译的时候出错
当然Keil
优点也有很多,比较方便的Function浏览框,调试的功能还算完备等。
前几个月在B站看了“稚晖君”的视频,发现他没有用Keil做STM32的IDE,而是使用了比较高级的CLion
来作为单片机的IDE开发工具,也看了这个大牛在知乎上的扫盲贴,搞得我成功入坑,现在也把Clion
作为主力IDE来做开发了。
声明:这篇文章大部分内容都源自“稚晖君”的扫盲帖(地址:https://zhuanlan.zhihu.com/p/145801160),只是把他没讲的一部分补全
一、安装
要安装的软件有
STM32CubeMx
(这个基本都有)Clion
,我安装的是2019.3版本,因为某些众所周知的原因,没有装最新版本MinGW
,这是C/C++的编译器,开源的,下载MinGW Installation Manager
后根据扫盲贴上的指示下载即可openocd
,支持下载仿真用的,在使用ST-LINK
时有用arm-none-eabi-gcc
,这是ARM的交叉编译工具??讲真这块我没有怎么懂,也许之前的Keil
或者IAR
把这些都集成进去了,到Clion
就需要单独安装了??希望有高手能深入浅出的解释一下。
安装时要注意:arm-none-eabi-gcc
的下载版本问题,我第一次安装的时候就是下载了最新的,结果死活没有编译环境。这里推荐还是下载我亲测可用的gcc-arm-none-eabi-9-2019-q4-major-win32.zip
二、配置
按照稚晖君的介绍将Clion上的配置完成即可。有2点验证通过的
- 使用ST-LINK的需要按照指示写一个
stlink.cfg
文件放到工程根目录底下,在这里要定位好,这里就不如Keil
了,每个工程都要配置这么一下,不是那么方便
- 之前用的
printf()
和scanf()
重定向会失效,需要使用教程里面的retarget.c
和retarget.h
。编译的时候会出错,要进入syscall.c
里面注释掉重复的函数即可。以后每个工程都要加入这两个文件,加上调试用的*.cfg
文件。(这样想来也挺麻烦的啊)
三、实例
一个F103ZET
的开发板+ST-LINK+CLion,做一个比较简单的测试程序,功能是按下Key1,开发板的Beep响一下,按下Key2,两个LED灯闪灭。同时在按下的时候,串口给出通知是哪个键按下了。
- 在Clion里面新建工程,基于STM32CubeMX,再点击
Open with STM32CubeMX
,之后会弹出CubeMX的界面 - 这里要注意,我的CubeMX每次都是默认STM32F030F4Px这个芯片做的项目,和实际不一样,所以要重新建一个项目,基于自己的芯片,但是项目名称必须和CLion中新建的项目名称相同
- CubeMX中的操作和往常没有区别,唯一要注意的点是
Project Manager
里面的ToolChain/IDE
要选SW4STM32
配置完串口、GPIO、Debug后就可以直接Generate Code
了,之后进入IDE - 在
While(1)
循环中加入这段代码,应该很容易理解
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == RESET) {
HAL_Delay(50);
printf("KEY2 pressed \n");
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
}
else if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == RESET) {
HAL_Delay(50);
printf("KEY1 pressed\n");
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, SET);
HAL_Delay(500);
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, RESET);
然后编译,可能会出现一些错误,例如syscall.c
中有函数和retarget.c
重复定义等等,按照教程的说明注释掉重复的函数即可。
5. 接上ST-LINK,开始debug,点击小虫的图标即可开始调试。可以在变量窗口看到指定变量值的变化。其他按钮应该都很熟悉,就不展开讲了。
测试程序完成了预定功能,测试完毕。
相比Keil,感觉Clion的调试功能要强大一些,比如可以直接在代码编辑框看到变量的值,这点比较友好和方便。
另外我还测试了使用CLion直接打开Keil的工程文件,是直接无法编译,推测原因是gcc编译器无法编译。
其他的边学边记录吧。