打印
[开发工具]

Stm32CubeMX生成的hal库工程加入标准库的库函数的方法

[复制链接]
12255|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 seawind1986 于 2017-4-7 22:30 编辑

第一步用Stm32CubeMX创建一个工程并生成Keil MDK的工程,不多赘述。

第二步将标准库的FWlib文件夹整个拷贝到刚才Stm32CubeMX生成的的工程路径下。

第三步将标准库USER文件夹中的stm32f10x_conf.h文件拷贝工程路径下的FWlib\inc下。
这只是为了方便管理标准库的头文件,其实你放到别的地方也可以,只要别忘把路径包含进来就行。

第四步 打开刚才生成的MDK工程,添加个Group 改名为FWLib,并将FWlib\src路径下的所有.c文件都包含进来。

第五步 添加宏USE_STDPERIPH_DRIVER,和标准库的头文件的路径。

这时候貌似已经移植完标准库的库函数了,但是是这样吗?我们点一下编译试试。
这时候会报一个错:
Error: L6200E: SymbolFLASH_WaitForLastOperation multiply defined (by stm32f1xx_hal_flash.o andstm32f10x_flash.o).
这是因为hal库和标准库的Flash库里面有个重名函数。因此需要修改其中一个函数的名称。
hal库原则上不要进行任何改名,因为一旦重新使用Stm32CubeMX重新配置工程,Cube将会复原被修改的hal库。
对于这个hal库工程,标准库的文件相当于用户文件,Cube不会对其做任何修改。所以就拿标准库的函数开刀吧。

第六步 替换标准库中重名函数,我的重命名技巧是用替换命令Find栏填上旧函数名加半个括号“(”,Replace栏填旧函数名+“_FW(”。
这样相当于找指定的字符串后在中间插入几个字符串,这样即使你误按了几次Replace也不至于替换错。
需要替换的是标准库的Flash的c文件和h文件,当然如果你其他地方也用到了这个函数那也要替换掉它(请确保是引用的标准库的而不是hal库的,别杀错了)
替换完成以后,再点编译,OK通过了。
似乎我们已经成功了,接下来又是一盆凉水泼下来。

我们要想在c文件中引用标准库的函数,那么就必须将标准库的顶级头文件stm32f10x.h引用进来。
可是我们将它与hal库的顶级头文件stm32f1xx_hal.h同时放到main.c文件中发现有提示错误的下滑波浪线。
肯定是又错了,当然如果你不信也可以点编译试试,会报一大堆错误,这里也就不啰嗦了。
究其原因好像是两个库定义了不少重名的宏。修改这些重名的宏的工作量比较大,如果你愿意一个一个改,我挺佩服你的。
如果不改呢,那么标准库和hal库楚河汉界划分的太清楚了,怎么办?

第七步 创建中间桥梁,我们创建一个Bridge.c和Bridge.h文件

Bridge.h文件中#include <stdint.h>,这个头文件主要是定义了一下数据类型,比如uint16_t之类的常用变量。
不包含它的话你声明函数的时候很不方便。

Bridge.c文件包含标准库的顶级头文件。

第八步 在main.c等需要调用标准库的c文件中包含Bridge.h文件
再点重新编译,发现编译通过, - 0 Error(s), 0 Warning(s).

恭喜你已经将两个库合并成功了。


下面举个例子:
我们在Bridge.c里面创建一个Fun_TestFWLib()的函数,函数的内容我们简单操作一下PA0引脚

并在Bridge.h中声明这个函数。

在main.c文件中定义一个全局变量Counter

在main函数的主循环里面插入如下代码:

HAL_Delay()函数是hal库的函数,而Fun_TestFWLib()函数内部是调用的标准库。
点重新编译 - 0 Error(s), 0 Warning(s).可以仿真一下试试了。

如果有些时候hal库需要调用的标准库函数的形参类型是hal库中所不存在的,那么你可以在Bridge.h中重新定义一遍这个数据类型。因为这个Bridge.h文件不被标准库引用,所以不会报重复定义的错误。


本人现在出差中……
由于手头没有开发板,所以没法进行硬件仿真,软件仿真测试通过。
如果硬仿无法通过还请不要扔砖头。

沙发
吕孟伟| | 2019-4-18 15:44 | 只看该作者
大哥,我现在正在按照您的步骤完将标准库融入Hal库,但是遇到这个问题,stm32f10x.h中的函数与stm32f1xx_hal_conf.h重复定义。
具体警告是:D:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.0.5\Device\Include\stm32f10x.h(128): warning:  #47-D: incompatible redefinition of macro "HSE_STARTUP_TIMEOUT" (declared at line 105 of "../Inc/stm32f1xx_hal_conf.h")。
还有就是:D:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.0.5\Device\Include\stm32f10x.h(158): warning:  #47-D: incompatible redefinition of macro "__MPU_PRESENT" (declared at line 69 of "../Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xe.h")等一系列问题。
您可以帮助下我吗?

使用特权

评论回复
板凳
芳心纵火犯XD| | 2022-4-6 21:07 | 只看该作者
改完宏定义以后,我这个标准库一堆错误怎么办

使用特权

评论回复
评论
芳心纵火犯XD 2022-4-6 21:12 回复TA
第五步的时候 
地板
芳心纵火犯XD| | 2022-4-6 21:09 | 只看该作者
芳心纵火犯XD 发表于 2022-4-6 21:07
改完宏定义以后,我这个标准库一堆错误怎么办

"no source": Error: command-line:  #992: invalid macro definition: STM32F103xB.STM32F10X_HD
..\STM32F10x_FWLib\src\stm32f10x_tim.c: 0 warnings, 1 error
compiling stm32f10x_usart.c...
"no source": Error: command-line:  #992: invalid macro definition: STM32F103xB.STM32F10X_HD
..\STM32F10x_FWLib\src\stm32f10x_usart.c: 0 warnings, 1 error
compiling stm32f10x_wwdg.c...
"no source": Error: command-line:  #992: invalid macro definition: STM32F103xB.STM32F10X_HD
..\STM32F10x_FWLib\src\stm32f10x_wwdg.c: 0 warnings, 1 error
"pulsesensor_test\pulsesensor_test.axf" - 42 Error(s), 0 Warning(s).
Target not created.

使用特权

评论回复
5
chenjun89| | 2022-4-7 08:10 | 只看该作者
这是给自己找麻烦啊

使用特权

评论回复
6
Jacquetry| | 2022-10-5 21:17 | 只看该作者
不要找麻烦啊

使用特权

评论回复
7
Bblythe| | 2022-10-8 07:30 | 只看该作者

对于优秀程序员来说,这不是好代码

使用特权

评论回复
8
Pulitzer| | 2022-10-8 10:29 | 只看该作者

没有发现有哪本是介绍设计思想的

使用特权

评论回复
9
Uriah| | 2022-10-8 17:30 | 只看该作者

128以上的某些地址为特殊寄存器使用,不能给程序用

使用特权

评论回复
10
mmbs| | 2023-2-2 10:12 | 只看该作者
STM32Cube库和standard peripheral library有什么区别

使用特权

评论回复
11
rosemoore| | 2023-2-4 14:52 | 只看该作者
STM32 的 HAL 库好用吗

使用特权

评论回复
12
xiaoyaodz| | 2023-2-4 20:34 | 只看该作者
HAL库对比标准库,封装程度更高,更具有移植性。

使用特权

评论回复
13
bestwell| | 2023-2-5 12:48 | 只看该作者
STM32F4 hal库和标准函数库区别在哪?

使用特权

评论回复
14
wilhelmina2| | 2023-2-6 16:25 | 只看该作者
现在ST公司升级和维护的库主要就是STM32CubeMX的HAL库和标准外设库了吧。

使用特权

评论回复
15
AdaMaYun| | 2023-2-7 08:55 | 只看该作者
.HAL库可以用ST的软件CUBE生成初始化工程

使用特权

评论回复
16
deliahouse887| | 2023-2-7 20:57 | 只看该作者
如何把stm32cubemx的固件库更新  

使用特权

评论回复
17
uptown| | 2023-2-7 22:03 | 只看该作者
STM32的标准库和HAL(cubeMX)库是怎么回事  

使用特权

评论回复
18
软核硬核| | 2023-2-8 10:49 | 只看该作者
两个库混用问题还是比较多的。

使用特权

评论回复
19
LLGTR| | 2023-2-8 10:49 | 只看该作者
感觉HAL库还是会逐步取代库函数。

使用特权

评论回复
20
天天向善| | 2023-2-8 10:49 | 只看该作者
还是喜欢用HAL库,开始开发STM32的时候HAL就挺流行的了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

17

帖子

0

粉丝