打印

GD32F4移植STM32F4

[复制链接]
1710|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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/)

使用特权

评论回复
板凳
c17|  楼主 | 2023-8-27 01:07 | 只看该作者
2.找到GigaDevice -> GD32F4xx pack包 -> 点击下载,等待下载完成。

使用特权

评论回复
地板
c17|  楼主 | 2023-8-27 01:07 | 只看该作者
3. 下载完成后,点击安装包,默认安装就好了。
4. 安装完成之后可以打开工程文件,点击魔术棒\Device ,选择对应的GD的芯片就可以了。

使用特权

评论回复
5
c17|  楼主 | 2023-8-27 01:07 | 只看该作者

使用特权

评论回复
6
c17|  楼主 | 2023-8-27 01:07 | 只看该作者
注意:重选芯片,会让工程的代码起始位置和大小变成默认值,如果你的程序有OTA或者其他更改程序起始位置和大小的设计,请自行在Target中修改。

使用特权

评论回复
7
c17|  楼主 | 2023-8-27 01:07 | 只看该作者

使用特权

评论回复
8
c17|  楼主 | 2023-8-27 01:08 | 只看该作者
5.然后 点击魔术棒\Debug\Settings\Flash Download\Add,如果看到下图这个GD的Flash就ok了。

使用特权

评论回复
9
c17|  楼主 | 2023-8-27 01:08 | 只看该作者
还有,代码的起始位置和大小,按照自己的程序来改,没有修改就默认即可,我这里是BootLoader程序,所以程序大小就比默认的小很多。

使用特权

评论回复
10
c17|  楼主 | 2023-8-27 01:08 | 只看该作者
6. 完成上面的操作之后就重新编译一下工程即可。

使用特权

评论回复
11
c17|  楼主 | 2023-8-27 01:08 | 只看该作者
2.修改32固件库的时钟
在V3.x的库,启动时间宏定义在xxx32f10x.h头文件中;在V3.0以前的库,其启动时间宏定义在xxx32f10x_rcc.c中(HSEStartUp_TimeOut)。搜索一下就找到了。

使用特权

评论回复
12
c17|  楼主 | 2023-8-27 01:08 | 只看该作者
//修改前:
#define HSE_STARTUP_TIMEOUT    ((uint16_t)0x05000)   /*!< Time out for HSE start up */
//修改后:
#define HSE_STARTUP_TIMEOUT    ((uint16_t)0xFFFF)   /*!< Time out for HSE start up */

使用特权

评论回复
13
c17|  楼主 | 2023-8-27 01:08 | 只看该作者
GD和STM32的晶振部分电路设计存在一定的差异,修改HSE_STARTUP_TIMEOUT宏定义可以保证晶振能够正常起振。

使用特权

评论回复
14
c17|  楼主 | 2023-8-27 01:09 | 只看该作者
3.FLASH修改
由于GD的Flash采用了其专利技术,所以GD 的Flash 和STM 的Flash 有些许差异。GD 的擦除时间会一些。对于Falsh的移植要重视,如果程序中有对FLASH的操作(主要是写Flash),则应该进行修改。
这里我们参考F1系列的修改

使用特权

评论回复
15
c17|  楼主 | 2023-8-27 01:09 | 只看该作者
3.1 F1的处理
在F1的移植中需要对4个函数进行修改
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)

使用特权

评论回复
16
c17|  楼主 | 2023-8-27 01:09 | 只看该作者
上面这个这四个函数里面都有下面这一句代码:
key( FLASH->OPTKEYR = FLASH_KEY1;FLASH->OPTKEYR = FLASH_KEY2;)

使用特权

评论回复
17
c17|  楼主 | 2023-8-27 01:09 | 只看该作者
在以上4个函数中在写完KEY 序列以后,需要读该位,确认key 已生效。所以我们在这里应该插入
While( ! (FLASH->CR & 0x200 ) ); // Wait OPTWRE 或可简单插入两个NOP。
比如,改成以下这样。

使用特权

评论回复
18
c17|  楼主 | 2023-8-27 01:10 | 只看该作者
/* Authorize the small information block programming */
FLASH->OPTKEYR = FLASH_KEY1;
FLASH->OPTKEYR = FLASH_KEY2;
while( ! (FLASH->CR & 0x200 ) );// Wait OPTWRE

使用特权

评论回复
19
c17|  楼主 | 2023-8-27 01:10 | 只看该作者
上面这个这四个函数里面都有下面这一句代码:

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

使用特权

评论回复
20
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

39

主题

311

帖子

1

粉丝