GD32F4移植STM32F4

[复制链接]
 楼主| c17 发表于 2023-8-27 01:06 | 显示全部楼层 |阅读模式
前言
近期在项目中采用了GD32F407VET6替换原项目中的STM32F407VET6,网传GD的兼容性很好,之前也用F1系统的替换了一下,按照CSND各位大佬的经验一步步改进了代码,测试直接通过,现在也一直在项目中实际应用了,一直没有出问题。
所以这SMT时,嘉立创没有STM的货果断换成了GD,可换时简单,到手之后,搜索了一大圈,并没有发现F4像F1一样有大把的经验可以抄。可能是我的搜索水平有限;也有可能是F4相较于F1,其成本优势并没有比F1强很多,替换的人就少了。
还好经过几天的摸索还是搞定了F4的程序替换,下面就个人经验分享给大家,提前声明一下,个人经验有限,本文只阐述本人的开发过程,目前程序运行正常,如果有其他不兼容的地方,还请各位网友自行解决。
另外,如果你是新开发程序,还是建议采用GD的库,毕竟原厂的库更有保障,我这里是因为程序都开发完成了,再移植到GD的库中,很多地方都有修改。

一、开发环境
本人使用Keil5,编写的程序,其他开发环境如:IAR等,可参考修改。工程模板及大部分驱动代码借鉴正点原子F4系列。

 楼主| c17 发表于 2023-8-27 01:07 | 显示全部楼层
二、移植步骤
1.安装GD的支持包。
GD的程序芯片可以选择STM32的替代,但是烧录的时候Flash必须选择GD的,所以安装支持包是必须的。
官网pack包下载链接:https://www.keil.com/dd2/pack/
1.进入KEIL官网下载pack包(链接 **https://www.keil.com/dd2/pack/)

4116564ea312f815a8.png
 楼主| c17 发表于 2023-8-27 01:07 | 显示全部楼层
2.找到GigaDevice -> GD32F4xx pack包 -> 点击下载,等待下载完成。

3078264ea314d03ff0.png
 楼主| c17 发表于 2023-8-27 01:07 | 显示全部楼层
3. 下载完成后,点击安装包,默认安装就好了。
4. 安装完成之后可以打开工程文件,点击魔术棒\Device ,选择对应的GD的芯片就可以了。
 楼主| c17 发表于 2023-8-27 01:07 | 显示全部楼层
 楼主| c17 发表于 2023-8-27 01:07 | 显示全部楼层
注意:重选芯片,会让工程的代码起始位置和大小变成默认值,如果你的程序有OTA或者其他更改程序起始位置和大小的设计,请自行在Target中修改。
 楼主| c17 发表于 2023-8-27 01:07 | 显示全部楼层
 楼主| c17 发表于 2023-8-27 01:08 | 显示全部楼层
5.然后 点击魔术棒\Debug\Settings\Flash Download\Add,如果看到下图这个GD的Flash就ok了。
6167264ea31781a7c0.png
 楼主| c17 发表于 2023-8-27 01:08 | 显示全部楼层
还有,代码的起始位置和大小,按照自己的程序来改,没有修改就默认即可,我这里是BootLoader程序,所以程序大小就比默认的小很多。 1493064ea318548a53.png
 楼主| c17 发表于 2023-8-27 01:08 | 显示全部楼层
6. 完成上面的操作之后就重新编译一下工程即可。
 楼主| c17 发表于 2023-8-27 01:08 | 显示全部楼层
2.修改32固件库的时钟
在V3.x的库,启动时间宏定义在xxx32f10x.h头文件中;在V3.0以前的库,其启动时间宏定义在xxx32f10x_rcc.c中(HSEStartUp_TimeOut)。搜索一下就找到了。
 楼主| c17 发表于 2023-8-27 01:08 | 显示全部楼层
  1. //修改前:
  2. #define HSE_STARTUP_TIMEOUT    ((uint16_t)0x05000)   /*!< Time out for HSE start up */
  3. //修改后:
  4. #define HSE_STARTUP_TIMEOUT    ((uint16_t)0xFFFF)   /*!< Time out for HSE start up */
 楼主| c17 发表于 2023-8-27 01:08 | 显示全部楼层
GD和STM32的晶振部分电路设计存在一定的差异,修改HSE_STARTUP_TIMEOUT宏定义可以保证晶振能够正常起振。
 楼主| c17 发表于 2023-8-27 01:09 | 显示全部楼层
3.FLASH修改
由于GD的Flash采用了其专利技术,所以GD 的Flash 和STM 的Flash 有些许差异。GD 的擦除时间会一些。对于Falsh的移植要重视,如果程序中有对FLASH的操作(主要是写Flash),则应该进行修改。
这里我们参考F1系列的修改
 楼主| c17 发表于 2023-8-27 01:09 | 显示全部楼层
3.1 F1的处理
在F1的移植中需要对4个函数进行修改
  1. FLASH_Status FLASH_EraseOptionBytes(void)
  2. FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)
  3. FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages)
  4. FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState)
 楼主| c17 发表于 2023-8-27 01:09 | 显示全部楼层
上面这个这四个函数里面都有下面这一句代码:
  1. key( FLASH->OPTKEYR = FLASH_KEY1;FLASH->OPTKEYR = FLASH_KEY2;)
 楼主| c17 发表于 2023-8-27 01:09 | 显示全部楼层
在以上4个函数中在写完KEY 序列以后,需要读该位,确认key 已生效。所以我们在这里应该插入
While( ! (FLASH->CR & 0x200 ) ); // Wait OPTWRE 或可简单插入两个NOP。
比如,改成以下这样。
 楼主| c17 发表于 2023-8-27 01:10 | 显示全部楼层
  1. /* Authorize the small information block programming */
  2. FLASH->OPTKEYR = FLASH_KEY1;
  3. FLASH->OPTKEYR = FLASH_KEY2;
  4. while( ! (FLASH->CR & 0x200 ) );// Wait OPTWRE
 楼主| c17 发表于 2023-8-27 01:10 | 显示全部楼层
上面这个这四个函数里面都有下面这一句代码:

key( FLASH->OPTKEYR = FLASH_KEY1;FLASH->OPTKEYR = FLASH_KEY2;)
 楼主| c17 发表于 2023-8-27 01:11 | 显示全部楼层
在以上4个函数中在写完KEY 序列以后,需要读该位,确认key 已生效。所以我们在这里应该插入
While( ! (FLASH->CR & 0x200 ) ); // Wait OPTWRE 或可简单插入两个NOP。
比如,改成以下这样。

/* Authorize the small information block programming */
FLASH->OPTKEYR = FLASH_KEY1;
FLASH->OPTKEYR = FLASH_KEY2;
while( ! (FLASH->CR & 0x200 ) );// Wait OPTWRE
您需要登录后才可以回帖 登录 | 注册

本版积分规则

c17

40

主题

312

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部