专栏/Clion实现Stm32标准库开发

Clion实现Stm32标准库开发

2021年05月26日 05:17--浏览 · --点赞 · --评论
粉丝:1978文章:14

在网上搜索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配置环境变量:打开此电脑->系统属性->高级系统设置->环境变量

此电脑->系统属性
高级系统设置
环境变量
在系统变量栏找到Path然后点编辑

新建,分别输入你的安装路径即可

注意:Stm32CubeMX需要安装JDK,直接去官网下载安装就行了

至此,所有材料安装完毕。


Clion配置:

打开File->Settings->Build,Execution,Devlopment->ToolChains,输入Mingw的路径,Clion会自动识别,识别慢的话直接输入即可。

Clion配置

创建Stm32CubeMX工程

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

点Open with STM32CubeMX

然后通过CubeMX对芯片进行配置:

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

点此处修改芯片型号
输入你的芯片型号
选中后双击点进去
由于我们不使用Hal库,所以不对芯片做任何配置,直接点击Project Manager
工程配置

1.输入Project Name,注意一定要和你Clion的工程名一模一样,路径也需要一模一样,这样CubeMX生成的工程就会直接覆盖Clion工程。

2.选择Toolchain/IDE为SW4STM32

3.根据需求选择堆栈大小,默认给的特别小,堆512B,栈1024B,要知道Stm32f103c8的SRAM有20KB=20480B,完全足够使用。

最后点击顶上的GENERATE CODE按钮项目就创建完毕了。直接把CubeMX关了就行。

Clion工程构建完毕后弹出这个窗口,直接关了

由于此处不使用调试工具,直接把这窗口关了,有需求者可以看我上面发的带佬写的博客进行配置。

打开main.c可以看到成功生成了hal库的代码,所有准备工作完成。

hal库工程生成完毕


标准库移植:

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

删掉这两个

KeilF103模板工程

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

工程目录

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


删掉这些
删除后

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


归类后



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


工程目录
Stm32废物(Firm Ware)库



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

仅需修改第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等待构建结束

Cmake文件


编译工程:

在编译前,我们需要打开stm32f10x.h,在里面加入两句话

#define STM32F10X_HD
#define USE_STDPERIPH_DRIVER

这两个宏定义在Keil里是在此处定义的,所以移植到Clion我们要手动加上


Keil宏定义
在此处加上宏定义


重点

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

core_cm3.c未修改


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) );
core_cm3.c修改后

最后打开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");
}
sys.c修改后



终于所有代码全部修改完毕,可以编译了!

这里总结下,修改了哪些地方:

1.stm32f10x.h中加入了两句宏定义

2.core_cm3.c中第736行和753行修改了两句内联汇编

3.sys.c中修改了内联汇编



编译:

上面配置完毕后直接点击绿色三角编译工程,在编译之前我们main.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,完成后就可以正常编译了

先点这个
导入工程后点击编译即可


投诉或建议