加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 一、 移植说明
    • 二、 移植步骤
    • 三、 GD用ST库函数会出现的一些问题
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

STM32移植到GD32(以32的工程为模板简单三步完成移植)

03/22 13:35
8387
阅读需 12 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、 移植说明

最近有个项目想用GD替代原有的STM32,因为GD的成本更低。然后我就找了一些GD的资料,发现目前网上已有的一些资料都比较老,比如ST移植到GD的攻略,很多都停留在GD刚推广不久的过渡时期,目前已经不适用。就是当时有些GD的芯片官方还开发出对应的pack包或固件库,那时移植GD只能在工程里面选择STM32的芯片,然后修改32的固件库。而现在,GD的芯片都有了自己的固件库和pack包,只要安装对应的pack包就能在芯片选型那里选择对应的GD芯片。所以如果你是用GD做一个全新的项目,那么完全可以用GD官方的demo开发,不再需要将32的程序改成GD的。不过对于我这种原有32的程序已经调试完成,只需修改成GD就能用的人来说,通过修改32固件库来兼容GD是最省事的。

之前我发过一篇博文讲了STM32和GD32的区别,这里就不多讲了。STM32和GD32的型号是一一对应的,比如我测试用的STM32F103C8T6和GD32F103C8T6,引脚排列也是一模一样的,测试的时候我是直接把板子上面的STM32拆下来换成GD32的。编译软件用的是keil,以后有时间的话我会再写一篇IAR的。

好了,废话不多说,下面马上开始讲解移植的过程,移植过程中用到的所有文件我会打包上传,请在文章底部的链接下载。

二、 移植步骤

1、 安装GD的支持包。

GD的程序芯片可以选择STM32的替代,但是烧录的时候Flash必须选择GD的,所以安装支持包是必须的。我安装的pack包版本比较老,在keil官网上也没有找到最新的,所以先凑合着用。打开图1 的两个文件,安装到keil的安装目录就可以了。

注:我看到有些以前的攻略是这样做的:第一步:解压GD32F10xxx Keil IDE Config.rar压缩文件。第二步:将编程算法文件FLM file拷贝到MDK的安装路径”KeilARMFlash"文件夹下面。然而这个方法已经不适用了,因为现在我根本找不到这个压缩文件,而且官方也不再会提供这些类似的文件了,因为现在GD已经有了自己的支持包和固件库,没必要再搞这些。

在这里插入图片描述

安装完成之后可以打开工程文件,点击FlashConfigue flash ToolsDebugSettingsFlash DownloadAdd,如果看到下图这几个GD的Flash就ok了。

3、 软件延时时间修改。

GD的主频是108M,比ST的72M要大,代码的运行速度更快。所以如果用到了while函数或者for函数延时,延时的时间肯定是变短了,如果你程序里面有用到延时函数作为IIC或者SPI通讯的时钟线延时,可能就需要修改延时的时间了。官方给出了这么一个数据:实测下面的这一段代码:ST执行该函数的延时时间是7.4us,GD执行该函数的延时时间是5.4us。

void delay(void)
{
    u8 i;
	for(i=0;i<75;i++);
}

这个只是作为一个参考,随着延时时间的加长,这个差距会不一样,不能按线性计算。有示波器的话最好用示波器实测。
然后官方也给出了一段IIC的代码,你们可以看一下。
IO模拟I2C他的查应答函数的编写如下:

#define SDA_Status() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)
void CheckACK(void)
{
    cAcknowledge=TRUE
    if(SDA_Status())
    {
        cAcknowledge=FalSE;
    }
}

这段代码在ST上面执行OK,但是在GD上面运行不正常,其实这是由于GD的执行速度更快,ACK信号还出来,语句就已经执行完成了。建议修改代码:

#define SDA_Status() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)
void CheckACK(void)
{
    u8 ErrTimer=0;
    cAcknowledge=TRUE
    while(SDA_Status())
    {
        ucErrTime++;
 		if(ucErrTime>250)
 		{
 			cAcknowledge=FalSE;
 		}
    }
}

如果你的程序只是用到了最常用的功能,如外部中断、定时器、串口这些,那么按照上面的3点改完之后就可以用STM32 的程序烧录到GD上面了,Flash要选择容量相同的GD芯片型号,程序运行应该都没什么问题。而如果你要用到一些特殊的,比如用单片机内部的Flash存数据,使用单片机内部标准的IIC,SPI接口(我们经常是用普通IO口模拟,不会用单片机的库)。那么有些地方就需要修改了,我这里有一份官方给出的GD内部设计引起的一些bug,不过因为资料是比较老的,我也没有一一去测试,所以就不罗列出来了。我只把我测试过的依然存在的问题给大家讲一下。

三、 GD用ST库函数会出现的一些问题

1、 Flash

GD的Flash执行速度快,但是写操作慢,所以在对Flash操作的时候需要修改下面几个函数:

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

上面这个这四个函数里面都有下面这一句代码:

key( FLASH->OPTKEYR = FLASH_KEY1;FLASH->OPTKEYR = FLASH_KEY2;

我们需要在这一句代码后添加两个__nop()语句或者是增加While( ! (FLASH->CR & 0x200 ) );// Wait OPTWRE 语句来增加等待的时间。比如改成下面这个代码:

/* Authorize the small information block programming */
FLASH->OPTKEYR = FLASH_KEY1;
FLASH->OPTKEYR = FLASH_KEY2;
While( ! (FLASH->CR & 0x200 ) );// Wait OPTWRE

同时也要修改擦出和写的超时宏定义:

#define EraseTimeout ((uint32_t)0x000B0000)
#define ProgramTimeout((uint32_t)0x00002000)

修改为:

#define EraseTimeout ((uint32_t)0x000FFFFF)
#define ProgramTimeout((uint32_t)0x0000FFFF)

2、 USART

GD的MCU和ST的相比在连续发送的时候会多一个IDLE bit,如下图。这一点对于应用是基本没有影响,只是会影响连续发送数据的发送时间。程序也不需要修改。

在这里插入图片描述

STM32的USART是可以发送停止位的时候是可以选择0.5bit,1bit, 1.5bit和 2bit 。而GD32 USART发送的时候只能发送1 bit或2bit停止位,代码里面如果配制成0.5bit或1bit都是发送1bit,如果配制成1.5bit或2bit则发送2bit停止位。

3、EXTI中断相应异常

EXTI配置好之后如果关闭了EXTI,IO有沿跳变,再次打开EXTI时,系统会响应EXTI关闭过程中的外部触发,为了规避这个问题,每次打开中断前都清一遍中断标志位。(小容量存在该问题,大容量没有)

好了,关于STM32移植到GD32的相关内容就讲到这里。如果你们想了解更多关于ST和GD的差异,可以看我之前发的博文,如果你想要GD的支持包或官方的固件库,可以在文章底部的链接下载,如果还有什么问题或者文章有误,请一定要联系我,谢谢!!!

GD32和STM32的差异:https://blog.csdn.net/ShenZhen_zixian/article/details/103250238
GD32支持包和固件库: https://download.csdn.net/download/ShenZhen_zixian/12004032

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
NC7SZ04P5X 1 Rochester Electronics LLC LVC/LCX/Z SERIES, 1-INPUT INVERT GATE, PDSO5, 1.25 MM, EIAJ, SC-88A, SC-70, 5 PIN
$0.32 查看
9DBV0441AKLFT 1 Integrated Device Technology Inc VFQFPN-32, Reel

ECAD模型

下载ECAD模型
$4.96 查看
FOD4208SD 1 Fairchild Semiconductor Corporation Triac Output Optocoupler, 1-Element, 5000V Isolation, LEAD FREE, SURFACE MOUNT PACKAGE-6
$4.14 查看

相关推荐

电子产业图谱