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

STM32移植到GD32

一、 移植说明

最近有个项目想用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的安装路径”\Keil\ARM\Flash"文件夹下面。然而这个方法已经不适用了,因为现在我根本找不到这个压缩文件,而且官方也不再会提供这些类似的文件了,因为现在GD已经有了自己的支持包和固件库,没必要再搞这些。
在这里插入图片描述
安装完成之后可以打开工程文件,点击Flash\Configue flash Tools\Debug\Settings\Flash Download\Add,如果看到下图这几个GD的Flash就ok了。
在这里插入图片描述
2、 修改32固件库的时钟
在V3.x的库,启动时间宏定义在xxx32f10x.h头文件中;在V3.0以前的库,其启动时间宏定义在xxx32f10x_rcc.c中(HSEStartUp_TimeOut)。搜索一下就找到了。
修改前://#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up /
修改后:#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF) /
!< Time out for HSE start up */
修改的原因是GD和STM32的晶振部分电路设计存在一定的差异,两者对外部高速晶振的参数要求也不一样,修改HSE_STARTUP_TIMEOUT宏定义可以保证晶振能够正常起振。当然有些应用其实不修改也能照常跑,这是由于晶振的参数差异造成了,但是为了保证程序的正常运行还是修改这个宏定义比较好。

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

  • 52
    点赞
  • 418
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
STM32F4 和 GD32F4 都是基于ARM Cortex-M4内核的微控制器系列,因此在移植这两个系列之间不会涉及到太多的硬件和指令集方面的差异。所以可以通过以下步骤将STM32F4移植GD32F4上: 1. 开发环境的准备:首先,需要下载并安装GD32的开发工具链和开发板的驱动程序,可在官方网站上获取。然后,将原来为STM32F4编写的代码和工程文件导入到GD32的开发环境中。 2. 底层驱动的替换:由于GD32F4和STM32F4在外设控制器的寄存器映射和配置上可能有一些差异,需要修改底层驱动层的相关代码。替换原来的STM32外设驱动代码为GD32外设驱动代码,并根据GD32的数据手册调整相关寄存器的配置。 3. 系统时钟的配置:STM32GD32的系统时钟配置方式可能有所不同,需要根据GD32的数据手册重新配置系统时钟。通常情况下,GD32的时钟配置方式与STM32相似,可以通过修改相关寄存器的值来实现。 4. 中断和中断向量表的处理:GD32的中断向量表可能与STM32不同,需要根据GD32的数据手册进行相应的修改。另外,如果在工程中使用了中断,需要将原来的中断服务函数与新的中断向量表进行对应。 5. 硬件资源的适配:GD32开发板上的引脚配置和STM32开发板上的可能有一些差异,需要根据实际情况进行适配。可以通过修改引脚映射和配置文件来实现。 6. 编译、调试和测试:进行移植后,需要重新编译和链接工程,并通过调试工具对代码进行调试。同时,还需要进行严格的测试来确保软硬件的兼容性和正常运行。 需要注意的是,尽管STM32F4和GD32F4在硬件和指令集上非常相似,但仍然存在一些差异和不兼容性。因此,在移植过程中需要仔细检查和调试代码,确保系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值