GD32和STM32在开发中的差异
两家不同的芯片公司
先来看看两家公司的对比。
对比项目 | 兆易创新 | 意法半导体 |
标志 |  |  |
成立时间 | 2005年4月 | 1987年(由意大利SGS微电子公司和 法国Thomson半导体公司合并而成) |
总部地址 | 中国北京 | 瑞士日内瓦 |
主要业务 | 存储器(Nor Flash、NAND Flash)、微控制器产品(MCU)、传感器模块(SENSOR)和动态随机存取存储器(DRAM)的研发、技术支持和销售 | 各类半导体芯片 |
市场地位 | 全球领先的Fabless芯片供应商,全球排名第二的Nor Flash供应商,中国排名第一的32位Arm通用型MCU供应商等 | 世界最大的半导体公司之一,全球第五大半导体厂商,世界第一大专用模拟芯片和电源转换芯片制造商,世界第一大工业半导体和机顶盒芯片供应商等 |
毕竟GD32算是很不错的嵌入式处理器厂商了,再加上我手上有两块它和嘉立创推出的开发板,所以最近四个月用GD32进行开发的时间很长,也完成了几个项目。在使用中遇到了各种奇怪的问题,这里就总结一下使用感受。


库函数差异
提到库函数就要先介绍一下CMSIS是什么,我在开发的时候都是创建项目以后,直接在CMSIS中选择需要的模块。如果是复制官方提供的库函数文件,添加模块的时候就比较麻烦;如果全部添加,左边的文件树又会过于复杂。CMSIS这一点比较好,想用什么直接勾选就可以了。

说回CMSIS,先看一下百科的定义:
ARM Cortex™ 微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层(英文原文为:a vendor-independent hardware abstraction layer for the Cortex-M processor series and defines generic tool interfaces--来自ARM官方定义)。
简单来说,CMSIS就是CortexM处理器的软件接口,做一个不恰当的类比,就像Windows开发中,我们只需要关注Windows提供的各种系统API接口,它完成了硬件和驱动的统一封装。因此在嵌入式开发中,开发者只需要了解CMSIS的各种函数,就能实现对于处理器的控制,不需要花费大量的精力在驱动和硬件上。
下图是CMSIS的结构:

我已经在GD32上试过了CMSIS-DSP,虽然没有分析运行效率,但是在开发的时候确实可以感觉到很方便。在进行矩阵运算的时候,不用关注程序实现和效率,官方给的函数肯定不会差到哪儿去吧。
在STM32平台上试了一下CMSIS-RTOS,体验非常棒,配置完成后,直接使用FreeRTOS的函数创建任务就可以了。如果了解CMSIS提供的API,还可以轻松实现不同RTOS的移植。但是在GD32上使用FreeRTOS就遇到了很多问题,这个之后详细说一下。
我最感兴趣的是“CMSIS-NN”,对于Cortex-M系列的SoC,特别是M0+、M4F这些常见的低功耗SoC,能实现什么样的神经网络应用呢?网上能找到一些使用分享,但是大多是尝试一下新功能,并没有实际的应用或者比较有趣的示例。

不管这些功能怎么样,至少CMSIS实现了不同硬件统一接口,提供各种便捷有趣的工具。
现在书归正传,来谈一谈使用GD32库函数和STM32库函数的差异,GD32虽然没有STM32那样的HAL库,也没有CubeMX这类图形化设置界面(有支持GD32F3系列的IDE),但是还是有标准库函数的。而且这个库函数可以在CMSIS的包管理界面中直接下载,并在RTE管理中完成选择。
而STM32提供的选择就非常多了,对于F10x系列,在CMSIS管理器中有标准库函数;如果习惯HAL库编程,则可以用CubeMX生成keil工程,然后进行开发。
而对于F4xx系列的SoC,在CMSIS中就提供HAL库开发。如果熟悉ARM的启动配置,都不用打开cubeMX进行初始化了。
虽然两者都可以在CMSIS包管理中找到标准库函数,但是根据我的使用经验来看,STM32系列的库函数更加规范,和CMSIS中间件以及其他工具的兼容性更胜一筹,而且差距很大。
GD32提供的库函数,有以下问题几点:
以上这些问题,在使用STM32进行开发时就不存在。所以GD32虽然已经在性能上赶上了STM32,但是在开发工具层面和生态层面还是有很大的差距。至少我短期内不会再主动使用GD32系列了。
其他差异
- I2C地址不同
- I2C是需要7位地址进行通讯的,而地址字节的最后一位是读写标志,那传入库函数的通讯地址,应当是原有数值,还是左移一位后的数值呢?
- 时钟配置
- 虽然在学习嵌入式的时候,都是手动配置时钟,对时钟配置编程也不排斥,但是图形化配置实在是太方便了。尤其是最近试用TI的ARM芯片,TI位keil专门做了一个可视化配置的插件,和cubeMX很像,在keil中用起来体验还不错。这一点兆易创新得赶快跟进了,做一个好用的插件,比做一个专用的IDE对开发者更有利
- 引脚配置
- 虽然说GD32和STM32兼容,但是还是要注意一些细小的差异,这类差异不见得会影响程序,但是一旦问题是由他们触发的,那调试的过程可是相当的痛苦。
- 比如GD32F10x系列用户手册中的这行小字

国产芯片的优势
主频更高
应当是得益于采用了新一代的内核,比较不错的国产32位微处理器的主频都要比意法半导体的高出一截,在性能上更具优势。
特性 | GD32F系列芯片 | STM32F系列芯片 |
内核 | 二代M3内核 | 一代M3内核 |
主频(HSE) | 最大108MHz | 最大72MHz |
主频(HSI) | 最大108MHz | 最大64MHz |
外部供电范围 | 2.6V ~ 3.6V | 2V ~ 3.6V |
内核电压 | 1.2V | 1.8V |
Flash擦除时间 | 60ms/page | 30ms/page |
整理对比太费时间了,用AI整理了一下主频对比,数据可能有部分错误,但是能看出来主频确实都要高一些。
系列型号 | GD32F系列主频(MHz) | STM32F系列主频(MHz) | 备注 |
GD32F103RC | 最高108MHz | 72 | GD32F103RC Cortex-M3架构,最高时钟频率为108MHz,APB1最高54MHz |
GD32F10x系列 | 最高72MHz | 72 | 可通过外部晶振配置不同的系统时钟频率,例如配置为72MHz |
GD32F101/103系列 | 高达108MHz | 72 | 增强型GD32F103系列具有更高的主频和更多的Flash及SRAM |
GD32F20x系列 | 高达120MHz | - | GD32F20x系列基于ARM Cortex-M3内核,最高主频可达120MHz |
GD32F4系列(如GD32F470) | 高达240MHz | - | GD32F4系列基于ARM Cortex-M4内核,主频高达240MHz |
STM32F407/417 | 168 | 168 | STM32F4系列基于ARM Cortex-M4内核,具有DSP和FPU指令 |
STM32F405/415 | 168 | 168 | STM32F4系列基础型,具有先进连接功能和加密功能 |
STM32F401/410/411 | 84/100 | 84/100 | STM32F4系列基本型,具有卓越的功率效率 |
如果是对芯片计算性能要求较高,对外设没什么要求的话,国产芯片倒是不错的选择。
外设更加丰富
GD32和STM32基本没什么区别,但是另一款国产芯片HC32F4A0却有着丰富的外设。下文是整理的HC32F4A0特有的外设。
- 串行通信接口
SPI接口数量:HC32F4A0系列MCU搭载了 6个SPI单元 ,而STM32F407虽然也支持多个SPI接口,但具体数量可能因型号而异,且不一定达到6个。这意味着HC32F4A0在串行同步传输方面提供了更高的灵活性和并行处理能力。
- 数字视频接口__
DVP(数字视频接口): HC32F4A0系列集成了DVP接口 ,这是STM32F407所不具备的。DVP接口通常用于连接数字摄像头等视频设备,支持高速数据传输,使得HC32F4A0在视频处理、机器视觉等领域具有更强的应用能力。
- 外部存储器控制器
EXMC(外部存储器控制器):HC32F4A0系列 包含了EXMC,这是一个用于连接外部存储器的控制器,如SRAM、PSRAM、NAND Flash等 。通过EXMC,HC32F4A0可以扩展更大的存储空间,提高系统的整体性能。而STM32F407虽然也支持外部存储器扩展,但可能不直接包含EXMC这样的专用控制器。
- QSPI接口
QSPI(四路SPI): HC32F4A0系列还集成了QSPI接口 ,相比传统的SPI接口,QSPI提供了更高的数据传输速率和更大的数据吞吐量,特别适用于与高速外部存储器的连接。STM32F407虽然也支持SPI接口,但不一定直接包含QSPI接口。
- 其他特色外设
NFC控制器: HC32F4A0系列可能还集成了NFC(近场通信)控制器 ,这使得该系列MCU能够支持NFC技术的应用,如移动支付、门禁系统等。而STM32F407通常不包含NFC控制器。
更多PWM信号支持: HC32F4A0支持多达16个分辨率高达50ps的PWM信号 ,而STM32F407虽然也支持PWM信号输出,但具体数量可能因型号而异,且不一定达到HC32F4A0的水平。