Clion实现Stm32标准库开发
在网上搜索Clion开发Stm32,大部分教程都是关于hal库的,标准库的移植教程比较少,而我对标准库情有独钟,打出感情来了,只用Clion的hal库开发总感觉少了点什么。对于Clion标准库移植我只能说,我可以不用,但是我不能没有。
首先先对比一下标准库和hal库的区别。
标准库和hal库性能对比
标准库:偏向底层,操作繁琐,运行效率较hal库高,占用空间小,官方不更新了
hal库:更加抽象,操作简单,运行效率较标准库低,占用空间大,持续更新
不过对于stm32来说,如此高性能的芯片运行hal库基本不受性能影响,拿stm32f103c8t6来说,20KB的SRAM空间和64KB的Flash空间以及72mhz高主频,用hal库做一些中小型任务完全无压力。这是网上的一张Stm32标准库,hal库,ll库和寄存器运行效率对比图:
下面进入正题,本文包括两个部分,Clion中开发Stm32的环境搭建和标准库移植。请先确保已经安装好MAC Clion Stm32开发环境,不知道怎么安装的可以看我博客中的另一篇文章。
创建Stm32CubeMX工程
File->New Project->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关了就行。 由于此处不使用调试工具,直接把这窗口关了,也可选择自己的开发板
标准库移植:
由于我们不使用Hal库,所以先把他生成的Core和Drivers文件删除,然后从Keil标准库模板工程中导入这些文件,我使用的是嵌入式公开课里的模板工程
导入后我的目录机构为:
就是把.c文件和.h文件进行归类 标准库文件导入完毕后,最后一步就是编译,通过修改Cmake文件编译我们刚才导入的c文件和h文件。只需修改第40行和42行即可
把第40行修改成我们工程中的C文件位置:分别是CORE,SYSTEM,USER和STM32F10x_FWLib
file(GLOBRECURSE SOURCES "startup/*.*" "CORE/*.*" "SYSTEM/*.*" "STM32F10xFWLib/." "USER/.")
把第42行修改成我们工程中的H文件位置:分别是CORE/Inc,SYSTEM/Inc,USER/Inc和STM32F10x_FWLib/Inc
includedirectories(CORE/Inc SYSTEM/Inc STM32F10xFWLib/Inc USER/Inc)
最后点击右上角的Reload changes等待构建结束
编译工程
在编译前,我们需要打开stm32f10x.h,在里面加入两句话
#define STM32F10X_HD
#define USE_STDPERIPH_DRIVER
这两个宏定义在Keil里是在此处定义的,所以移植到Clion我们要手动加上
重点
再打开corecm3.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) );
终于所有代码全部修改完毕,可以编译了!
这里总结下,修改了哪些地方:
1.stm32f10x.h中加入了两句宏定义
2.core_cm3.c中第736行和753行修改了两句内联汇编
编译:
上面配置完毕后直接点击绿色三角编译工程,在编译之前我们main.c文件里一堆报错,编译之后就能正常使用了。编译完毕后,再看main.c文件,没有任何报错了,并可以直接调用标准库函数 很舒服,终于编译成功,不过还有个printf()函数,直接使用的话是无法输出到串口的,可以自己封装一个串口打印函数,十分简单。
至此,关于F103标准库的移植已经结束,对于f4系列的移植比f103简单很多,仅需要在stm32f4xx里添加宏定义即可。
#define USE_STDPERIPH_DRIVER
#define STM32F411xE 按照你芯片的需求定义
至于为什么要用Clion开发,首先是因为颜值和功能强劲,官方支持stm32cubemx工程和调试工具,其次Clion在许多平台上都能使用,Mac,Linux和Windows都可以使用。
至于为什么要用Clion移植标准库,hal库开发这么简单,非要用标准库呢?原因上面我已经说了,这功能我可以不用,但是我不能没有。
相信很多人都懒得按照我上面的步骤一步步操作,毕竟我自己看了都嫌烦,所以我直接把工程模板发出来 我用阿里云盘分享了「Clion Stm32标准库模板工程」,你可以不限速下载🚀 复制这段内容打开「阿里云盘」App 即可获取 链接:https://www.aliyundrive.com/s/idpBWXGkPW7
下载完成后直接用Clion的File->Open...打开,导入后他会报错,说路径不对,点击Tools->Cmake->Reset Cache and Reload Project,完成后就可以正常编译了
打开文件编码错误
如果打开文件提示file was loaded in the wrong utf-8 编码错误 如图
可以点击文件下面的编码修改GBK 然后重载reload即可
文档信息
版权声明:可自由转载(请注明转载出处)-非商用-非衍生
发表时间:2021年11月4日 15:28