当前位置:首页 > > 嵌入式技术开发
[导读]​GD32作为国产MCU里的佼佼者,产品线也比较丰富,是替代STM32的一个很好的选择。前段时间有个项目用到GD32的单片机,今天来说说使用的一些体会。

GD32作为国产MCU里的佼佼者,产品线也比较丰富,是替代STM32的一个很好的选择。前段时间有个项目用到GD32的单片机,今天来说说使用的一些体会。

1.硬件我用的单片机型号为GD32F405RGT6,对应STM32F405RGT6。首先,硬件上基本兼容,有一点不同的是GD32的31和47脚为NC,STM32的为VCAP。STM32这两个引脚需要分别连接一个电容到GND,而GD32则不需要。当然,有这两个电容也无所谓,所以,硬件上GD32可以直接替换STM32。仿真器可以使用Jlink,也可以使用STLink,但是下载程序时会弹框提示,非ST芯片。
2.软件软件上,前期为了快速实现功能,直接使用ST的HAL库开发(版本为V1.27.0)。用到的外设有:外部高速时钟、Systick定时器、GPIO、串口1(DMA、中断)、SPI1、SPI2、I2C1、外部中断。用STM32CubeMx生成代码,不做任何改动,直接当做ST的芯片使用,上述外设功能都正常。说明两者的兼容性还是不错的。其它外设基本上也都是兼容的(未做测试),但USB部分貌似只能用GD官方提供的USB库。


但是,用别人的库文件,总觉得不太可靠,最后还是改成了GD官方的库,版本为GD32F4xx_Firmware_Library_V3.0.0。总结一下修改过程中的一些体会:首先,GD的库跟ST之前的标准库很类似,很多功能使用起来不如ST的HAL库方便。比如,串口DMA发送数据,用HAL库,只需调用一个函数就行:
HAL_UART_Transmit_DMA(&huart1,tx_buffer,64);
而GD的库没有现成的函数,需要自己去实现:
void usart_dma_transmit(uint8_t *pData,uint32_t num){ usart_flag_clear(USART0, USART_FLAG_TC);  dma_channel_disable(DMA1, DMA_CH7); dma_flag_clear(DMA1, DMA_CH7, DMA_FLAG_FTF); dma_memory_address_config(DMA1, DMA_CH7, DMA_MEMORY_0, (uint32_t)pData); dma_transfer_number_config(DMA1, DMA_CH7, num); dma_channel_enable(DMA1, DMA_CH7);}
类似的还有很多,比如I2C读写24Cxx系列EEPROM的函数,HAL库中也封装好了函数:
HAL_I2C_Mem_Write(&hi2c1, AT24Cxx_ADDR_WRITE, addr, I2C_MEMADD_SIZE_16BIT, dat, size, 0xFFFFFFFF);HAL_I2C_Mem_Read(&hi2c1,  AT24Cxx_ADDR_READ, addr, I2C_MEMADD_SIZE_16BIT, recv_buf, size, 0xFFFFFFFF);
GD的库也需要自己去实现,官方虽然也提供了相关的例程,但是只支持24C02等8位地址的器件,24C64等16位地址的器件就需要自己修改了。当然,HAL库虽然好用,但是效率很低。记得之前做一个低功耗的东西,用STM32L151,主频设置的较低,使用HAL库回调函数的方式写串口中断程序,竟然会出错。后来中断部分改为寄存器操作才正常了,可见其效率低下。
其次,两者的命名方式不一样。HAL库中时钟叫RCC_xxxx,而GD的库中时钟叫RCU_xxxx。还有,HAL库中的外设标号是从1开始的,比如USART1、USART2…,而GD库的外设标号是从0开始的,USART0、USART1…。用惯了ST库的朋友们,这一点在使用时要特别注意。
最后,实现相同功能的程序,两者编译后的大小也有区别。GD库编译后的大小如下:HAL库编译后的大小如下:可以看到HAL库编译后的代码要比GD库大了将近4KB,占用的RAM也大了1KB多。主要是因为HAL库为了不同系列芯片的兼容性好,做了很多层的封装,程序比较繁琐。
3.总结总的来说,HAL库用起来方便,但效率较低。GD的库有些功能需要自己实现,但执行效率高。当然,如果用GD的芯片,我还是建议用GD官方的库,不然出了问题都不好排查。如果用ST的芯片,我建议用HAL库。很多人排斥HAL库,一方面觉得效率低,另一方面觉得封装了很多层,看起程序来比较麻烦。我倒是觉得效率低的问题可以通过局部优化来完善。(HAL库也提供了类似标准库的一些高效的底层函数,一般都是以“__HAL”开头的)。而且,现在单片机资源都比较富裕,很多时候我们也不必那么追求极致的效率。另一方面,官方一直在主推这个,这也是个趋势,我们还是与时俱进比较好。

推荐阅读:

几种RS485隔离通讯的方案介绍
STM32CubeMX系列教程
电路设计合集
调试技巧合集
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭