你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

让你的 STM32Cube KEILV5 + HAL库工程支持C++开发

[复制链接]
byronsong 发布时间:2019-6-28 14:45
1.转载链接
. E) b, Y+ ]: d# h5 s转载自 http://blog.csdn.net/wmdscjhdpy/article/details/79354513% c, z7 Y% V6 p+ h% @6 x& P
2.原博文
( P# i" @: C( \6 g9 J, R5 x" R4 U
; m% M6 n! M& j/ Z* Y7 j" d/ W2 `#前言
7 d( T5 N; _' V最近这段时间在弄一个新的STM32F4的项目,因为工程比较庞大,然后各种类型也比较复杂,在封装整理的时候就非常头疼,很想通过C++的类,继承,多态的方式来让代码变得清晰简单。在网上翻阅了比较多的相关资料,发现很多博客所说的方法要么太复杂,要么不能完美兼容Cube。随着ST对HAL库的不断更新,各类驱动包其实都已经悄悄的在各种头文件上加入了 extern “C” 的宏定义,让C++移植更加方便。我也折腾了一段时间,终于成功的编译成功了一个带有C++特性的工程,故来分享一下自己的经验和一些值得注意的地方。因为我也在探索的过程中,如果大家在尝试的过程中有遇到其他问题的欢迎评论区讨论。
: K' I5 i2 z/ a; I4 P6 q. _
* s8 _$ E; R5 F+ }7 q#配置C++工程
. ]: ?3 D4 \7 J6 T$ i; \##配置Cube
! [8 L' ^9 \+ }8 A9 s其实在Cube的配置上没有多大改变,只建议尽量不要在生成工程的时候不要选中Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral选项。这个感觉像是cube的一个遗漏的地方,如果在此处勾选了这个选项的时候,有部分新增加的头文件没有extern “C” 的宏定义 会导致混合编译出错。
6 g% ?7 C0 J; m2 F' ~/ ^( ?$ t5 _' X. P$ [2 @
其他的地方没有什么特别的,直接生成工程即可。
, {3 U* t; c; T' {& e##配置Keil
/ v- Q6 T4 r0 N9 C) ~( C! F+ J. r###工程设置
- d/ W% ~  Z4 tKeilv5原生是支持C++的编译的,所以在keil里面我们只需要打开工程设置,在C/C++选项里的Misc_Controls里加入–cpp 当然如果原意使用C++11标准的话可以加入 --cpp11 即可./ s" \; W6 q6 [$ _+ j& p9 u# u8 O% W
然后我们还需要确认MicroLib已被禁用。该选项在工程设置中的Target栏的Code Generation里,取消勾选“Use Micro Lib”即可。1 G2 ?3 s% v9 h
###文件属性设置6 A. i4 r" `7 ?4 K8 u
经过上面的设置之后,我们就可以对cpp类文件使用C++编译器了,可是问题是,Cube给我们生成的都是.c文件,这就导致Keil会把它们当做c文件,使用C编译器编译,当我们在这些cube生成好的文件里面使用C++特性的时候就会报错了。所以我们需要把Cube给我们生成的文件改成C++文件。但是在此处不宜用更改文件名后缀的方法,因为这样的话会导致cube以后在修改的时候不会维护.cpp文件,而是重新给你生成一个.c文件。为了保证cube的维护性,我们在keil的工程目录中选中需要使用C++特性的文件,右键点击 “Options for File ‘xxx.c’”,打开后将File Type里设置为C++ Source File即可 这样即使是.c后缀 keil也会将它认为C++文件进行编译链接. 这样我们就可以将C++嵌入到工程里 并且cube更新的时候这些也不需要重新设置 cube之外的其他用户文件直接使用.cpp .hpp并做好extern “C” 的工作即可,不需要这样设置0 E. d/ p, r5 T/ E) E& G2 _$ b6 O2 [
: Y: H- c. w+ m. H( o
###一些注意事项. ?0 y4 I+ y& z/ }+ ]9 \
建议只把需要用到C++特性的cube文件设置为C++文件,不要把一些底层的驱动文件也设置成C++文件,因为不知道会有什么未知的影响。我亲身经历了一次把所有的.c文件改成c++源文件类型后编译时错误的绝望…
/ P& z) F, S" Q0 Q/ F9 d另外,所有涉及中断的服务函数必须用 extern "C"作前缀(包括定义),因为stm32的中断服务名是由汇编的启动代码内的向量表决定的,汇编不认得C++的函数名的链接符号。建议的方法是在中断配置文件里的开头和结尾(都含有cube的 "user code"段)加上extern "C"的标注。2 b6 t2 ^$ V: D9 N7 d

% _# |, r0 G- I6 {; S/------------------------------------------------------------------------------
5 o8 p& ?) Z4 u; I
5 N5 D5 i* q) G/ O8 m$ T2018年6月4日11:34:06后记:; M: ^" H2 R$ K
9 F  r. L5 b  D. @4 N7 ^% s
STM32Cube其实在悄无声息的对HAL逐渐完善C++的支持 自身体验F103的HAL库 生成工程后 只需要注意中断要extern "C"外 其他的HAL库都处理好了. 所以用C++开发的同学们可以尽量尝试新的库,对C++的支持更优!
( s5 ^9 f# c* {/ g' E2 ?" E--------------------- 0 [$ s) d0 q/ o6 j
作者:wmdscjhdpy / x) T) W5 B+ V$ H6 @8 r
来源:CSDN
1 }5 M& N8 a) P/ @% s( x原文:http://blog.csdn.net/wmdscjhdpy/article/details/79354513 " N0 p; J  m2 t% |
版权声明:本文为博主原创文章,转载请附上博文链接!* z# K/ n& e/ B; l9 ]
* g6 s7 d- l  d0 C) D7 o8 J
3.基于正点原子STM32F4探索者开发板的测试
; e7 ?) m- s. n9 F; I- s3 d  Y6 c1 C/ p9 k+ ?) R" w4 U
cubemx prj
# y# ~( r* Z" J9 } BOOT.zip (3.32 KB, 下载次数: 11)
赞 收藏 评论0 发布时间:2019-6-28 14:45

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版