目前我在一款产品上同时用GD32F130和GD32F330,因此同时使用两个版本的固件库。原本产品使用GD32F130基于V2.0.0的固件库编写的,固件库风格与STM32的库相同,变量和函数的命名方式相同,绝大多数API也都一样,用着挺好。
后来由于某些原因,器件更换成了GD32F330,固件库版本V1.0.0,该固件库版本变化很大,变量和函数命名方式都变了,函数命名全小写加下划线,大量使用宏来定义寄存器地址(作者应该比较熟悉linux内核代码)。可能大量的宏对性能和代码尺寸有一些好处,但是带来的代码可读性不高的缺点很明显,相比之下我还是更喜欢STM32那种风格的固件库。
基于GD32F330 固件库V1.0.0将代码移植好,然后发现无法与GD32F130的V2.0.0固件库兼容,很多API接口都不一样,而且发现GD32F130 V3.0.0的库风格和GD32F330的V1.0.0固件库风格一样了,回头又将GD32F130的软件移植到V3.0.0的库,两个器件的代码基本上相同了。
使用中发现GD32F130 V3.0.0固件库和GD32F330 V1.0.0固件库虽然大部分API相同,但是仍然存在一些API有细微的差异,会给使用者带来很大的困扰。
比如ADC的API里面这个函数
void adc_regular_channel_config(uint8_t rank, uint8_t channel, uint32_t sample_time)
在gd32f3x0的V1.0.0库里面,rank范围是0-15,而在gd32f1x0的V3.0.0库里面,rank范围就是1-16,就是差一个下标而已,代码移植的过程中遇到问题查起来很困难,你说坑爹不坑爹?
|
在最新的gd32f1x0的V3.1.0库里面,adc_regular_channel_config函数的rank范围就是0-15了,和gd32f3x0 V1.0.0库保持一致。