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

2023-10-30

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • 研发实验室建设

    研发实验室是科技创新的核心场所 对于企业的技术研发和产品创新具有重要意义 为了提高研发实验室的效率和质量 建设一个符合要求的实验室是至关重要的 SICOLAB喜格 将介绍研发实验室建设的关键要素和注意事项 一 实验室规划与布局 1 空间规划
  • 海报制作软件哪个好用?这几款功能强大且易于操作,快试试看

    近日工作状态be like 表面唯唯诺诺 私下骂骂咧咧 老板是觉得自己的嘴开过光吗 随便指个人叫她制作海报 那个人就能无师自通海报设计skill 是的没错 我就是那个倒霉蛋 作为一个完全没有海报设计基础的人 当时接到这个任务 我是想迎难而下
  • 在线识别图片文字工具有哪些?教你快速提取文字

    文字识别工具 也称为光学字符识别 OCR 工具 是一种能将图像中的文本信息转化为可编辑和可搜索的数字格式的过程 它是现代信息处理和人工智能领域的重要应用之一 文字识别工具的作用在于 无论是纸质文档 电子文档还是照片上的文字 都能通过该工具进
  • 处理不舒服的同事关系:实用建议与技巧

    处理不舒服的同事关系 实用建议与技巧 在工作中 我们难免会遇到一些与同事关系不和谐的情况 这些不舒服的关系可能会影响到我们的工作情绪和效率 那么 如何处理这些不舒服的同事关系呢 本文将为你提供一些实用的建议 一 保持冷静和理智 在处理同事关
  • 半导体洁净车间洁净区装修要点

    随着科技的飞速发展 半导体行业作为电子产业的核心领域 其生产环境的洁净度要求越来越高 半导体洁净车间的装修设计不仅关乎产品的质量和性能 还直接影响到生产效率和成本控制 因此 S ICOLAB喜格 在洁净区装修过程中 必须遵循一系列严格的要点
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 基于电源完整性的PCB设计原则

    基于电源完整性的一些PCB设计建议 1 尽量减少电源和地通路之间的环路电感 在相邻的层上分配电源和接地面时 使用尽可能薄的电介质 2 通过在平面之间使用尽可能高的介电常数来获得平面之间的最低阻抗 与尽可能薄的介电常数设计保持一致 3 使用尽
  • 视频合并在线工具有什么好用的?这几款你知道吗?

    你有没有自己剪辑过视频 现在这个时代 大家或多或少都会一点剪辑的操作 不过有时候我们会需要将多个视频片段合并成一个完整的视频 那么 如何快速 有效地完成这一任务呢 这就需要借助一些视频编辑工具 今天就跟大家分享视频合并app和电脑软件 让大
  • 驾驭远程工作:提高工作效率与灵活性的秘诀

    随着科技的飞速发展 远程工作已成为越来越多企业和员工的选择 这种工作模式不仅为员工提供了更大的灵活性 也为提高工作效率创造了新的可能 本文将深入探讨如何通过远程工作提高工作效率和灵活性 一 明确目标与计划 在远程工作中 明确的目标和计划至关
  • 海报模板怎么进行编辑文字?公司宣传海报就这样做

    作为负责公司宣传事宜的部门 我每天不是在做海报 就是在找做海报的素材 力求要把这些宣传的物料都做得精致又有内容 经过我长时间的试用下来 给大家从基本功能 使用体验和不同场景下的应用这几个方面 总结出了海报制作软件哪个好用 接下来就让我为你详
  • 语音翻译软件app哪家好?帮你和外国人无碍交流的软件分享

    在和外国人交流的时候发现听不懂怎么办 还能怎么办 谁让我们的英语没学好呢 这种时候还是得寻求其他人的帮助 不过万一要是在只有你一个人的情况下又怎么办呢 俗话说 求人不如求己 那还是得在自己手机里时刻准备好能够翻译英语的工具呀 今天就给大家分
  • 短视频时代:影响播放量的秘密与破解之道

    在当下这个信息爆炸的时代 短视频已经成为我们日常生活的一部分 无论是刷朋友圈 看新闻还是消磨时光 短视频都是我们的首选 正因为如此 许多自媒体人和内容创作者纷纷投身到这片热土 希望通过短视频实现自己的价值 然而 许多人在创作过程中都会遇到一
  • 如何打赢稳定性之战?

    文章目录 前言 为什么总会出现问题呢 如何证明你的稳定性做的有效果 既是持久战 也是防御战 1 提前建筑好防御工事 2 以攻为守 3 找外部支援和配合 前言 随着23年年末期间 各大厂争先恐后的出现的各种线上
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐