打印
[研电赛技术支持]

STM32到GD32移植攻略

[复制链接]
1683|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
原来是wjc|  楼主 | 2021-11-30 12:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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)。


使用特权

评论回复
沙发
原来是wjc|  楼主 | 2021-11-30 12:30 | 只看该作者
2. 内部Flash

    1) 芯片设置读保护用法

    描述:由于GD 的Flash 是自己的专利技术,STM 的Flash 是第三方提供的,所以GD 的Flash 和STM 的Flash 有些许差异。GD 的擦除时间会长一点.

    解决方法:在写完KEY 序列以后,需要读该位,确认key 已生效。 所以,这里应该插入

While( ! (FLASH->CR & 0x200 ) ); // Wait OPTWRE 或可简单插入两个NOP。

__NOP();

__NOP();

使用特权

评论回复
板凳
原来是wjc|  楼主 | 2021-11-30 12:30 | 只看该作者
在ST 库中,只有

FLASH_Status FLASH_EraseOptionBytes(void)

FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)

FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages)

FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState)

四个函数需要修改。

使用特权

评论回复
地板
原来是wjc|  楼主 | 2021-11-30 12:31 | 只看该作者
四个函数需要修改。

    2) IAP 在应用中编程

    描述:GD32 由于自有flash 的0 访问时序,同STM32 在Flash 的Erase 和Program 上存在差别,GD32 的Erase 和Program 时间比STM32 的稍微长些,建议对Erase 和Program 时间进行修改。

    解决方法:将宏定义

#define EraseTimeout ((uint32_t)0x000B0000)

#define ProgramTimeout ((uint32_t)0x00002000)

修改为:

#define EraseTimeout ((uint32_t)0x000FFFFF)

#define ProgramTimeout ((uint32_t)0x0000FFFF)

备注: Erase 和Program 时间宏定义在stm32f10x_flash.c 源文件中

(路径:\..\Libraries\STM32F10x_StdPeriph_Driver\src)

使用特权

评论回复
5
原来是wjc|  楼主 | 2021-11-30 12:36 | 只看该作者
3) 用IAR 下载配置

    解决方法:在批量生产的时候首先会烧写一个USB 的boot,这个boot 自动运行后在由上位机软件进行烧写应用程序。如果boot 程序不能自动运行则需要重新插拔一次电源。给生产造成一些麻烦。产生不能自动运行程序的原因是如果程序设置读保护的话需要等待FLASH_CR 的第9[OPTWRE]位为1.如果没有置位的话继续执行就会出错。由于ST 的执行速度慢,程序执行到读FLASH_CR 寄存器的时候该位已经置1,GD 的执行速度比较快,程序运行到这的时候该位还没置1,因此需要在FLASH_ReadOutProtection 函数里面添加一些轮询该位为1 或者加一些延时。

使用特权

评论回复
6
原来是wjc|  楼主 | 2021-11-30 12:36 | 只看该作者
3. ISP 烧写软件

    1) ISP 烧写,建议使用官方烧写软件

    描述:GD32 芯片内部flash 同STM32 有区别。

    解决方法:建议到www.mcuisp.com 下载最新版本的MCUISP。另外GD32 也有专门的烧写软件(GigaDevice MCU ISP Programmer)可以到https://bbs.21ic.com/gd32 论坛下载。如果使用自制的ISP 软件或脱机编程器,实现ST 和GD 完全兼容,建议修改以下参数:

    1、 页擦除等待超时时间增加至300ms,整片擦除等待超时时间增加至3s 左右。

    2、 字编程等待超时时间增加至2ms,页编程等等超时时间增加至300ms。

使用特权

评论回复
7
原来是wjc|  楼主 | 2021-11-30 12:38 | 只看该作者
4.I/O 口

    1) IO 口外部中断使用方法

    描述:在关闭期间,如果外部引脚有电平的变化,在使用IMR 打开中断后会马上进入中断服务程序。理论是打开中断前,不管管脚是否有电平的变化,都不会影响到打开后的中断响应。

使用特权

评论回复
8
原来是wjc|  楼主 | 2021-11-30 12:39 | 只看该作者
解决方法:所以解决方法就是通过禁用上升沿或者下降沿检测寄存器来开关中断,不能使用IMR 屏蔽寄存器。程序如下:

EXTI->FTSR &= ~EXTI_Line3; //关闭沿检测,以达到关闭中断的目的,下降沿使用FTSR 寄存器,上升沿使用RTSR 寄存器

使用特权

评论回复
9
原来是wjc|  楼主 | 2021-11-30 12:40 | 只看该作者
EXTI->PR = EXTI_Line3;

EXTI->FTSR |= EXTI_Line3;

使用特权

评论回复
10
原来是wjc|  楼主 | 2021-11-30 12:44 | 只看该作者
2) 在待机模式,PA8 引脚特殊设置

    描述:在使用低功耗的情况下,PA8 会被MCU 在内部被设置为地PA8 复用为MCU 内部频率输出,超低功耗设置时需要悬空。

使用特权

评论回复
11
原来是wjc|  楼主 | 2021-11-30 19:43 | 只看该作者
解决方法:在待机模式,PA8 悬空不用。

使用特权

评论回复
12
原来是wjc|  楼主 | 2021-11-30 19:47 | 只看该作者
3) 低功耗下必须注意

    描述:在使用低功耗情况下,把软件全部端口(A-F)时钟关掉,无论是否有该端口。

使用特权

评论回复
13
原来是wjc|  楼主 | 2021-11-30 19:47 | 只看该作者
4) 当有脉冲群冲击管脚

    描述:需要在在进入中断后关闭中断。

使用特权

评论回复
14
原来是wjc|  楼主 | 2021-11-30 19:48 | 只看该作者
5. 定时器

    1) 定时器输入捕获模式需要软件清中断

    描述:STM 定时器输入捕获模式默认能硬件清中断,GD 为了更加严格要求配置,需要做软件清中断 。

使用特权

评论回复
15
原来是wjc|  楼主 | 2021-11-30 19:51 | 只看该作者
  解决方法:软件清除标志位。

使用特权

评论回复
16
原来是wjc|  楼主 | 2021-11-30 19:53 | 只看该作者
2) 定时器向上脉冲计数模式设置

    描述:定时器的用法差异。

使用特权

评论回复
17
原来是wjc|  楼主 | 2021-11-30 19:54 | 只看该作者
解决方法:脉冲计数模式下,装载值必须设置为比预期值大,否则不计数在ST 上如果重载值不设置(初始为0)的时候,CNT 可以正常计数。 在GD 上如果重载值不设置保持初始为0 的时候,会因为重载值为零,即便是来一个脉冲也会导致所有的寄存器复位从而不能正常计数。

使用特权

评论回复
18
原来是wjc|  楼主 | 2021-11-30 19:55 | 只看该作者
3) TIM、ADC 模块

    描述:Timer、ADC 模块的触发信号宽度要求。

使用特权

评论回复
19
原来是wjc|  楼主 | 2021-11-30 19:55 | 只看该作者
解决方法:由于内部有高速和低速两条外围总线,Timer、ADC 模块和其他外设共同使用这两个总线。GD32F103/101 系列Flash 128KB 及以下的型号,Timer、ADC 等模块识别触发信号的条件是触发信号宽度大于模块所在总线的时钟宽度。

使用特权

评论回复
20
原来是wjc|  楼主 | 2021-11-30 20:05 | 只看该作者
6. 串口USART

    1) USART 连续发送数据字节有空闲位

    描述:字节间有空闲位。

使用特权

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

本版积分规则

76

主题

978

帖子

0

粉丝