[开发工具] Stm32CubeMX生成的hal库工程加入标准库的库函数的方法

[复制链接]
 楼主| seawind1986 发表于 2017-4-7 22:19 | 显示全部楼层 |阅读模式
本帖最后由 seawind1986 于 2017-4-7 22:30 编辑

第一步用Stm32CubeMX创建一个工程并生成Keil MDK的工程,不多赘述。
001.jpg
第二步将标准库的FWlib文件夹整个拷贝到刚才Stm32CubeMX生成的的工程路径下。
002.jpg
第三步将标准库USER文件夹中的stm32f10x_conf.h文件拷贝工程路径下的FWlib\inc下。
这只是为了方便管理标准库的头文件,其实你放到别的地方也可以,只要别忘把路径包含进来就行。
003.jpg
第四步 打开刚才生成的MDK工程,添加个Group 改名为FWLib,并将FWlib\src路径下的所有.c文件都包含进来。
005.jpg
第五步 添加宏USE_STDPERIPH_DRIVER,和标准库的头文件的路径。
006.jpg
这时候貌似已经移植完标准库的库函数了,但是是这样吗?我们点一下编译试试。
这时候会报一个错:
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库的,别杀错了)
007.jpg
替换完成以后,再点编译,OK通过了。
似乎我们已经成功了,接下来又是一盆凉水泼下来。
008.jpg

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

第七步 创建中间桥梁,我们创建一个Bridge.c和Bridge.h文件
009.jpg
Bridge.h文件中#include <stdint.h>,这个头文件主要是定义了一下数据类型,比如uint16_t之类的常用变量。
不包含它的话你声明函数的时候很不方便。
010.jpg
Bridge.c文件包含标准库的顶级头文件。

第八步 在main.c等需要调用标准库的c文件中包含Bridge.h文件
再点重新编译,发现编译通过, - 0 Error(s), 0 Warning(s).
011.jpg
恭喜你已经将两个库合并成功了。


下面举个例子:
我们在Bridge.c里面创建一个Fun_TestFWLib()的函数,函数的内容我们简单操作一下PA0引脚
012.jpg
并在Bridge.h中声明这个函数。
013.jpg
在main.c文件中定义一个全局变量Counter
014.jpg
在main函数的主循环里面插入如下代码:
015.jpg
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 | 显示全部楼层
改完宏定义以后,我这个标准库一堆错误怎么办

评论

第五步的时候  发表于 2022-4-6 21:12
芳心纵火犯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.
chenjun89 发表于 2022-4-7 08:10 来自手机 | 显示全部楼层
这是给自己找麻烦啊
Jacquetry 发表于 2022-10-5 21:17 | 显示全部楼层
不要找麻烦啊
Bblythe 发表于 2022-10-8 07:30 | 显示全部楼层

对于优秀程序员来说,这不是好代码
Pulitzer 发表于 2022-10-8 10:29 | 显示全部楼层

没有发现有哪本是介绍设计思想的
Uriah 发表于 2022-10-8 17:30 | 显示全部楼层

128以上的某些地址为特殊寄存器使用,不能给程序用
mmbs 发表于 2023-2-2 10:12 | 显示全部楼层
STM32Cube库和standard peripheral library有什么区别
rosemoore 发表于 2023-2-4 14:52 | 显示全部楼层
STM32 的 HAL 库好用吗
xiaoyaodz 发表于 2023-2-4 20:34 | 显示全部楼层
HAL库对比标准库,封装程度更高,更具有移植性。
bestwell 发表于 2023-2-5 12:48 | 显示全部楼层
STM32F4 hal库和标准函数库区别在哪?
wilhelmina2 发表于 2023-2-6 16:25 | 显示全部楼层
现在ST公司升级和维护的库主要就是STM32CubeMX的HAL库和标准外设库了吧。
AdaMaYun 发表于 2023-2-7 08:55 | 显示全部楼层
.HAL库可以用ST的软件CUBE生成初始化工程
deliahouse887 发表于 2023-2-7 20:57 | 显示全部楼层
如何把stm32cubemx的固件库更新  
uptown 发表于 2023-2-7 22:03 | 显示全部楼层
STM32的标准库和HAL(cubeMX)库是怎么回事  
软核硬核 发表于 2023-2-8 10:49 | 显示全部楼层
两个库混用问题还是比较多的。
LLGTR 发表于 2023-2-8 10:49 | 显示全部楼层
感觉HAL库还是会逐步取代库函数。
天天向善 发表于 2023-2-8 10:49 | 显示全部楼层
还是喜欢用HAL库,开始开发STM32的时候HAL就挺流行的了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部