对比STM32和GD32固件库,你会发现其中的秘密!
关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏
嵌入式专栏
1
可能有些初学者对“固件库”的理解有误,比如:把固件库和“bin、hex”混为一谈,其实它们不是一个东西。
还比如:把固件库理解为类似Keil生成的“.lib”文件,其实它们也不是一个东西。
这里说的固件库,和我们说的STM32标准外设库是同一个东西,也就是以源代码形式提供的外设库。
你看命名:STM32F10x_StdPeriph_Lib、GD32F10x_Firmware_Library就知道,他俩虽然字面意思不一样,一个标准外设库一个固件库,但他俩就是“同一类”东西。
嵌入式专栏
2
STM32F10x_StdPeriph_Lib、GD32F10x_Firmware_Library官方都提供下载地址(直接去搜索都能找到)。
STM32F10x_StdPeriph_Lib下载地址:
GD32F10x_Firmware_Library下载地址:
额外说两点:
STM32的标准外设库,目前只有较早的系列有,这后面新出的芯片,只有HAL和LL库了。
标准外设库只有这几个系列:
GD32是以GD32F10x_Demo_Suites这种套件形式提供,套件包含了几类文件:
嵌入式专栏
3
下面正式进入主题,对比STM32和GD32的固件库(标准外设库)。
1.对标文件夹
图中两个文件夹几乎是一一对应的内容,GD32把USB的驱动库文件整理在一起了,STM32对应的USB驱动库是和其他系列整理在一起的,地址:
https://www.st.com/zh/embedded-software/stsw-stm32121.html
源文件和头文件也是一一对应,只是文件(夹)名不一样:
2.xx32f10x.h源代码对比
a.文件头描述
b.宏定义描述
c.中断向量表
d.地址定义
STM32和GD32基地址偏移地址使用方式有所不同,先看下定义:
e.外设相关宏定义
STM32外设相关宏定义更多是在stm32f10x.h文件:
而GD32更多是定义在外设对应的头文件(这里以ADC为例):
3.system_xx32f10x.c源代码对比
a.主频
GD32一个特点就是,具有更高的主频(系统时钟108M):
b.系统时钟申明和定义
c.系统初始化
4.startup_xx32f10x_hd.s启动源代码对比
这里以hd型号为例:
a.堆栈分配
GD32分配的空间比较多:
b.其他差不多
启动文件,对比一下,你会发现,其实大同小异。
5.外设源代码对比
这里以ADC为例(xx32f10x_adc.c):
a.STM32更多mask宏定义
b.一个用if else,一个用case
c.STM32有更多断言assert(参数检查):
d.函数、变量命名方式
一个大写开通,一个小写,用下划线分开:
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)
void adc_regular_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t adc_channel, uint32_t sample_time)
其他很多内容都具有相似之处,只是大同小异。
嵌入式专栏
4
上面对比了各种类型的固件库(源代码),你会发现一个什么问题?
能看懂其中一个固件库(源码),再去看另一个,是不是一点都不费力。它们几乎都差不多,可以拿“双胞胎”来形容。
因为基地址几乎一样(上面源码对比有提到),所以,它们的软件兼容性很好,甚至在一定情况下,可以做到“无缝替换”。
额外说一下,上面源码对比使用的是Beyond Compare比较工具,之前给大家分享过很多好用的对比工具《嵌入式软件工程师常用的代码比较工具》,感兴趣的可以看下。
后台回复『单片机』『嵌入式软件设计与开发』阅读更多相关文章。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。