在网上搜索Clion开发Stm32,大部分教程都是关于hal库的,标准库的移植教程比较少,而我对标准库情有独钟,打出感情来了,只用Clion的hal库开发总感觉少了点什么。对于Clion标准库移植我只能说,我可以不用,但是我不能没有。
首先先对比一下标准库和hal库的区别。
标准库和hal库性能对比
标准库:偏向底层,操作繁琐,运行效率较hal库高,占用空间小,官方不更新了
hal库:更加抽象,操作简单,运行效率较标准库低,占用空间大,持续更新
不过对于stm32来说,如此高性能的芯片运行hal库基本不受性能影响,拿stm32f103c8t6来说,20KB的SRAM空间和64KB的Flash空间以及72mhz高主频,用hal库做一些中小型任务完全无压力。这是网上的一张Stm32标准库,hal库,ll库和寄存器运行效率对比图:

下面进入正题,本文包括两个部分,Clion中开发Stm32的环境搭建和标准库移植。
环境搭建:
网上教程比较多,我就不写那么细节了,我这边放一篇带佬写的文章给大家参考:
https://www.bilibili.com/read/cv6308000/
首先先把环境搭建的材料发一发,链接如下:
Clion2020破解版:
链接:https://pan.baidu.com/s/1HKE8WZEB5zeC8yuGSdraIg
提取码:ALYA
环境搭建材料:
gcc-arm-none-eabi 交叉编译器
MinGW CLion配置工具链的环境
STM32CubeMX STM32自动化配置和代码生成工具
链接:https://pan.baidu.com/s/1POex4nDKzCnWCc2ZA1g8zg
提取码:ALYA
关于安装,十分简单,下一步操作按到底即可。其中gcc-arm和MinGW安装完毕后需要配置一下环境变量,配置完毕后重启电脑,然后打开CMD输入arm-none-eabi-gcc -v和gcc -v验证是否安装成功,有返回信息就安装成功了。
Win10配置环境变量:打开此电脑->系统属性->高级系统设置->环境变量





新建,分别输入你的安装路径即可
注意:Stm32CubeMX需要安装JDK,直接去官网下载安装就行了
至此,所有材料安装完毕。
Clion配置:
打开File->Settings->Build,Execution,Devlopment->ToolChains,输入Mingw的路径,Clion会自动识别,识别慢的话直接输入即可。

创建Stm32CubeMX工程
File->New Project->Stm32CubeMX,点击创建,创建完成后点击Open with Stm32CubeMX对芯片进行配置。

然后通过CubeMX对芯片进行配置:
先选择芯片型号,默认给的Stm32F0芯片,点击更改成你自己的芯片型号,CubeMX会根据对应的芯片生成对应的启动文件,到时候工程就使用它生成的启动文件。





1.输入Project Name,注意一定要和你Clion的工程名一模一样,路径也需要一模一样,这样CubeMX生成的工程就会直接覆盖Clion工程。
2.选择Toolchain/IDE为SW4STM32
3.根据需求选择堆栈大小,默认给的特别小,堆512B,栈1024B,要知道Stm32f103c8的SRAM有20KB=20480B,完全足够使用。
最后点击顶上的GENERATE CODE按钮项目就创建完毕了。直接把CubeMX关了就行。

由于此处不使用调试工具,直接把这窗口关了,有需求者可以看我上面发的带佬写的博客进行配置。
打开main.c可以看到成功生成了hal库的代码,所有准备工作完成。

标准库移植:
由于我们不使用Hal库,所以先把他生成的Core和Drivers文件删除,然后从Keil标准库模板工程中导入这些文件,我使用的是正点原子F103模板工程。


KeilF103模板工程
我们需要导入上面四个文件夹中的.c和.h文件,导入后的效果如下:

把导入的文件夹里无用的东西全部删除


再把.c文件和.h文件进行归类

注意:上面项目目录中没有导入STM32F10x_FWLib是因为里面东西太多了不好截图,我是最后导入的,最终效果如下:


标准库文件导入完毕后,最后一步就是编译,通过修改Cmake文件编译我们刚才导入的c文件和h文件。只需修改第40行和42行即可。

把第40行修改成我们工程中的C文件位置:分别是CORE,SYSTEM,USER和STM32F10x_FWLib
file(GLOB_RECURSE SOURCES "startup/*.*" "CORE/*.*" "SYSTEM/*.*" "STM32F10x_FWLib/*.*" "USER/*.*")
把第42行修改成我们工程中的H文件位置:分别是CORE/Inc,SYSTEM/Inc,USER/Inc和STM32F10x_FWLib/Inc
include_directories(CORE/Inc SYSTEM/Inc STM32F10x_FWLib/Inc USER/Inc)
最后点击Reload changes等待构建结束

编译工程:
在编译前,我们需要打开stm32f10x.h,在里面加入两句话
#define STM32F10X_HD
#define USE_STDPERIPH_DRIVER
这两个宏定义在Keil里是在此处定义的,所以移植到Clion我们要手动加上


重点
再打开core_cm3.c修改第736行和753行,如果不改编译直接报错Assembler messages:Error

736行改成:
__ASM volatile("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
753行改成:
__ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );

最后打开sys.c,把里面的代码改成:
#include "../Inc/sys.h"
//THUMB指令不支持汇编内联
//采用如下方法实现执行汇编指令WFI
void WFI_SET(void)
{
__ASM volatile("wfi");
}
//关闭所有中断
void INTX_DISABLE(void)
{
__ASM volatile("cpsid i");
}
//开启所有中断
void INTX_ENABLE(void)
{
__ASM volatile("cpsie i");
}

终于所有代码全部修改完毕,可以编译了!
这里总结下,修改了哪些地方:
1.stm32f10x.h中加入了两句宏定义
2.core_cm3.c中第736行和753行修改了两句内联汇编
3.sys.c中修改了内联汇编
编译:
上面配置完毕后直接点击绿色三角编译工程,在编译之前我们main.c文件里一堆报错,编译之后就能正常使用了。


编译完毕后,再看main.c文件,没有任何报错了,并可以直接调用标准库函数

很舒服,终于编译成功,不过还有个printf()函数,直接使用的话是无法输出到串口的,可以自己封装一个串口打印函数,十分简单。
可以清晰地看到,printf()是无法打印到串口的

至此,关于F103标准库的移植已经结束,对于f4系列的移植比f103简单很多,仅需要在stm32f4xx里添加宏定义即可。
#define USE_STDPERIPH_DRIVER
#define STM32F411xE
按照你芯片的需求定义,参照此处

至于为什么要用Clion开发,首先是因为颜值和功能强劲,官方支持stm32cubemx工程和调试工具,其次Clion在许多平台上都能使用,Mac,Linux和Windows都可以使用。
至于为什么要用Clion移植标准库,hal库开发这么简单,非要用标准库呢?原因上面我已经说了,这功能我可以不用,但是我不能没有。
相信很多人都懒得按照我上面的步骤一步步操作,毕竟我自己看了都嫌烦,所以我直接把工程模板发出来,目前只有F1和F4系列(我给的是F411的,其他型号直接按需求改stm32f4xx.h宏定义就行,F1不用管)的,其他系列标准库移植同理。
工程模板链接:
链接:https://pan.baidu.com/s/1gGvMgvZ2yIfCpolGt2HNWA
提取码:ALYA
下载完成后直接用Clion的File->Open...打开,导入后他会报错,说路径不对,点击Tools->Cmake->Reset Cache and Reload Project,完成后就可以正常编译了

