打印
[研电赛技术支持]

GD32替换STM32经验

[复制链接]
1072|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 abner_ma 于 2023-4-30 23:18 编辑

一、 GD32 与 STM32 异同
1. 相同点
1) 外围引脚定义:相同型号的管脚定义相同
2) Cortex M3 内核:STM32F103 内核 R1P1 版本, STM32F205 内核R2P1,
GD32 内核 R2P1 版本,此内核修复了 R1P1 的一些 bug
3) 芯片内部寄存器,外部 IP 寄存器地址 :逻辑地址相同,主要是根据 STM32 的寄存器和物理地址, 做的正向研发.
4) 函数库文件:函数库相同,优化需要更改头文件
5) 编译工具:完全相同例如:keil MDK、IAR
6) 型号命名方式:完全相同
2. 外围硬件区别 1) 电压范围(ADC):GD32F:2.6-3.6VSTM32F:2.0-3.6V(外部电压) GD32F:1.2V(内核电压)STM32F:1.8V(内核电压)
2) BOOT 0 管脚:Flash 程序运行时,BOOT0 在 STM32 上可悬空,GD32 必须外部下拉(从 Flash 运行,BOOT0 必须下拉地)
3) ESD 参数:STM32 人体模式 2KV,空气模式 500V
GD32 人体模式 4KV(内测 5KV),空气模式 10KV(内测 15KV)
3. 内部结构差别
1) 启动时间:GD32 启动时间相同,由于 GD 运行稍快,需要延长上电时间配置(2ms)
2) 主频时钟:GD32F10 系列主频 108MHZSTM32F10 系列主频 72MHZ
3) Flash 擦除时间:GD32 是 60ms/page,STM 30ms/page
4) FLASH 容量:GD32 最大容量 3M Byte
5) SRAM 空间:GD32F103 系列、GD32F105\107 大容量系列 SRAM 96K
6) VB 外扩总线 FSMC:GD32 100PIN 配置总线输出,STM32 144PIN 并且 256k 以上才配置总线输出
4.功耗区别(以128k以下容量的作为参考)
1)睡眠模式Sleep:GD32F:12.4mA STM32F10X:7.5mA
2)深度睡眠模式Deep Sleep:GD32F:1.4mA STM32F10X:24uA
3)待机模式Stand By: GD32F: 10.5uA STM32F10X: 3.4uA
4)运行功耗:GD32F: 32.4mA/72M STM32F10X: 52mA/72M
5.内部FLASH区别
1)ISP:擦写时间同STM32有差异,使用新版ISP软件
2)IAP:擦写时间相同,按字写入,按页擦除
3)存储寿命:10万次擦写,数据保存20年以上
4)加密特性:除了常规的禁止读出和96位ID号码加密之外,GD32数据写入 Flash时,具有存储逻辑地址连续,物理地址不连续的特性。
二、GD32与STM32兼容性详析
1、系统
1)晶振起振区别
描述
启动时间,GD32与STM32启动时间都是2ms,实际上GD的执行效率快,所以ST的HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)是2ms,但是这个宏定义值在GD上时间就更加短了,所以要加大这个值的设置
解决方法
将宏定义:
#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)修改为:#define HSE_STARTUP_TIMEOUT((uint16_t)0xFFFF)备注:
启动时间宏定义所在位置:
1、在V3.X的库,其启动时间宏定义在stm32f10x.h头文件中(路径:
\..\Libraries\CMSIS\CM3)(库版本的不同,所在目录也有所不同)
2、在V3.0以前的库,其启动时间宏定义在stm32f10x_rcc.c源文件中(HSEStartUp_TimeOut)
(路径:\..\Libraries\STM32F10x_StdPeriph_Driver\src)。
2)部分客户使用有源晶振出现问题,在GD32F103小容量产品,发现会在MCU的复位管脚一直把电平拉到0.89V,电平不能保持在高电平。
描述
是由于部分有源晶振起振时间太快,复位信号还没有完成导致的
解决方法
在有源晶振的输入端与地之前并上一个30pf电
3)GD32 MCU主频支持108MHz高性能,在代码移植方面需要注意事项
描述
GD32通过芯片内部加大缓存,提高了相同工作频率下的代码执行速度,带来了高性能的使用体验。
解决方法
因此如果代码有用到for循环或while循环语句做精确定时的,定时时间会由于代码执行速度加快而使循环的时间变短。使用Timer定时器则没有影响。
4)GD32F105/107系列MCU 配置为108MHz有何不同?
描述
通过Clock configuration register (RCC_CFGR) 中,第21:18位为PLLMUL[3:0],再结合第29位PLLMUL[4]组成5 位的位域来确定PLL 倍频系数,即通过软件配置来定义PLL 的倍频系数,且PLL 输出频率绝对不得超过最高主频(108MHz)。
2、I/O口
1)IO口外部中断使用方法
描述
在关闭期间,如果外部引脚有电平的变化,在使用IMR打开中断后会马上进入中断服务程序。理论是打开中断前,不管管脚是否有电平的变化,都不会影响到打开后的中断响应。
解决方法
所以解决方法就是通过禁用上升沿或者下降沿检测寄存器来开关中断,不能使用IMR屏蔽寄存器。
程序如下:
EXTI->FTSR &= ~EXTI_Line3; //关闭沿检测,以达到关闭中断的目的,下降沿使用FTSR寄存器,上升沿使用RTSR寄存器
EXTI->PR = EXTI_Line3;
EXTI->FTSR |= EXTI_Line3;
2)在待机模式,PA8引脚特殊设置
描述
在使用低功耗的情况下,PA8会被MCU在内部被设置为地PA8复用为MCU内部频率输出,超低功耗设置时需要悬空
解决办法
在待机模式,PA8悬空不用
3、定时器
1)定时器输入捕获模式需要软件清中断
描述
STM定时器输入捕获模式默认能硬件清中断,GD为了更加严格要求配置,需要做软件清中断
解决方法
软件清除标志位
2)定时器向上脉冲计数模式设置
描述
定时器的用法差异
解决办法
脉冲计数模式下,装载值必须设置为比预期值大,否则不计数在ST上如果重载值不设置(初始为0)的时候,CNT可以正常计数。
GD上如果重载值不设置保持初始为0的时候,会因为重载值为零,即便是来一个脉冲也会导致所有的寄存器复位从而不能正常计数。
型号
GD32F1系列MCU (Flash 256KB 及以上的型号)
3)TIM、ADC模块
描述
Timer、ADC模块的触发信号宽度要求
解决方法
由于内部有高速和低速两条外围总线,Timer、ADC模块和其他外设共同使用这两个总线。GD32F103/101系列Flash 128KB 及以下的型号,Timer、ADC 等模块识别触发信号的条件是触发信号宽度大于模块所在总线的时钟宽度。
4、串口USART
1)USART连续发送数据字节有空闲位


使用特权

评论回复
沙发
369122197| | 2023-5-2 18:12 | 只看该作者
某宝上搜:慧勤智远

使用特权

评论回复
评论
lmn2005 2023-5-15 21:01 回复TA
搜索不到什么 
板凳
田舍郎| | 2023-5-2 22:42 | 只看该作者
程序修改不少呢

使用特权

评论回复
地板
wangzhijiang| | 2023-5-4 10:23 | 只看该作者
最近刚好在做,这个算是差异吗?

差异2.png (168.09 KB )

差异2.png

差异1.png (51.76 KB )

差异1.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

74

主题

140

帖子

3

粉丝