本帖最后由 聚沃科技 于 2024-9-3 09:01 编辑
1.前言
对于 STM32F0x0 到 GD32F3x0 的移植,指的是在我们已经修改后的关于 ST 的固件库中进行替换底层,修改后的 ST 底层库可以正常的在 GD32F3x0 上运行,本文档旨在说明 GD32F3x0 和 STM32F030 之间的本质差异,以及在替换完成底层之后,对于 GD32F3x0 和 STM32F0x0 的环境配置、外设操作等一些差异的地方。注意:以下只对比 STM32F030x4/6/8 系列。
2.硬件差异
3.内部资源对比
以上斜杠“/”代表有多种情况,需要根据具体芯片型号区分。
4.软件环境设置
4.1 使用 Keil 开发 GD32F3x0
目前市面通用的MDK for ARM版本有Keil 4和Keil 5:使用Keil 4建议安装4.74及以上;使用Keil 5建议安装5.20以上版本。
4.1.1. 在 Keil4 中添加 GD32F3x0 MCU Device
1. 从MCU官网下载相关的GD32F3x0系列插件MDK-ARM_AddOn_GD32F3x0_V1.0.0.rar。
图 4-1. GD32F3x0 系列 MCU 型号支持 pack 包名称(keil4)(图片仅供参考,以实物为主下同)
2. 双击解压安装至Keil 4的目录,一般都会默认选择,如若同时安装了Keil 4和Keil 5才需要手动选择。
图 4-2. Pack 包安装示意图(keil4)
3. 安装成功后,重新打开Keil 4,则可以在File->Device Database中出现Gigadevice的下拉选项,点击可以查看到相应的型号。
图 4-3. Pack 包成功安装示意图(keil4)
4. 为了后续debug工作的顺利进行,建议检查一下安装路径下是否有下载算法,可以通过如下方式查看:打开一个工程,将型号选为GD32F3x0的型号,然后Options forTarget -> Debug ->Settings -> Flash Download-> Add,如果下拉选项中有GD32F3x0的下载算法则完全安装成功。
图 4-4. Flash 算法文件选择示意图(keil4)
4.1.2. 在 Keil5 中添加 GD32F3x0 MCU Device
1. 从相关网站下载相关的GD32F3x0系列插件Keil.GD32F3x0_DFP.1.1.0.rar。
图 4-5. GD32 MCU 型号支持 pack 包名称(keil5)
2. 解压并安装至Keil 5的目录,一般都会默认选择。
图 4-6. Pack 包安装示意图(keil5)
3. 安装完后重新打开keil5工程,即可在Device中出现Gigadevice的型号
图 4-7. Pack 包安装成功示意图(keil5)
4. 在Options for Target -> Debug ->Settings ->Flash Download 中添加flash算法,会出现GD32F3X0的算法,即说明安装成功。根据相应的芯片选择合适的算法,即可下载仿真。
图 4-8. Flash 算法文件添加示意图(keil5)
5. 用Keil 5打开Keil 4工程,如果报找不到器件信息等错误,将Keil 4的插件安装在Keil 5的目录下,具体操作方式参考Keil 4插件相关内容。
4.2 使用 GD-Link 开发 GD32F3x0
GD32F3x0的开发板自带GD-link,可以用电路板上的GD-link调试仿真代码,操作方法如下。
1. 在Options for Target -> Debug 中选择“CMSIS-DAP Debugger”,部分客户反馈找不到这一驱动器选项,那是因为MDK版本过低,只有Keil4.74以上的版本和Keil5才支持CMSIS-DAP Debugger选项。
图 4-9. GD-Link 选择 Debugger 类型
2. 在Options for Target -> Utilities,也要选择“CMSIS-DAP Debugger”。
图 4-10 GD-Link 在 Utilities 中选择 Debugger 类型
3. 在Options for Target -> Debug ->Settings勾选SWJ、Port选择 SW。右框IDcode会出现”0xXBAXXXXX”。
图 4-11. GD-Link 成连接目标板示意图
4. 在Options for Target -> Debug ->Settings -> Flash Download中添加GD32的flash算法。
图 4-12. GD-Link 添加 Flash 算法文件示意图
5. 单击下图的快捷方式“debug”,即可使用GD-Link进行仿真
图 4-13. GD-Link 仿真示意图
4.3 使用 J-Link 开发 GD32F3x0
使用J-Link来debug GD MCU,具体配置如下:
1. 在Options for Target -> Debug中选择“J-LINK/J-Trace Cortex”
图 4-14. J-Link 在 Keil 中选择 Debugger 示意图
2. 在Options for Target -> Debug ->Utilities,也要选择“J-LINK/J-Trace Cortex”。
图 4-15. J-Link 在 Utilities 下选择 Debugger 示意图
3. 在Options for Target -> Debug ->Settings勾选SWJ,Port选择 SW。右框IDcode会出现“0xXBAXXXXX”。
图 4-16. J-Link 成功连接目标板示意图
4. 在Options for Target -> Debug ->Settings -> Flash Download中添加GD32的flash算法。
图 4-17. J-Link 在 Keil 下添加 flash 算法文件示意图
5. 单击下图的快捷方式“debug”,即可使用J-Link进行仿真。
图 4-18. J-Link 成功仿真示意图
4.4 使用 IAR 开发 GD32F3x0
IAR版本众多,版本之间的兼容性并不好,如果初次使用建议安装7.3以上的版本,安装好IAR以后再根据该文档来添加GD的器件型号,进行相关的debug工作。
4.4.1. 在 IAR 中添加 GD32F3x0 MCU Device
1. 从相关网站下载相应的GD32F3x0系列插件IAR_GD32F3x0_ADDON.1.0.0.exe:
2. 运行IAR_GD32F3x0_ADDON.1.0.0.exe,单击start开始安装插件。
图 4-19. IAR 中安装支持 GD32 型号 pack 包示意图
3. 安装成功后单击Finish,结束插件安装。
图 4-20. IAR 下 pack 包安装示意图
4.4.2. 在 IAR 中编译调试 GD32F3x0
在上一小节中我们已经添加了GD32F3x0系列的插件,这一小节我们介绍应如何使用它。使用IAR编译GD的型号,有两个办法,一种是使用现有的工程进行修改,还有就是重新建立工程,这里就不细说具体工程应该如何建立,GD的工程建立和别的平台都一致,建立工程时选择GD的相应型号。如果没有安装GD的插件,可以选择别的M3厂家型号。
图 4-21. 在 IAR 下选择芯片型号示意图
6.1以后的IAR不需要添加CMSIS文件(core_cm3.c和core_cm3.h),但是需要勾选GeneralOptions->Library Configuration的Use CMSIS,如果软件代码有使用到printf函数,还需要修改Library为FULL。
图 4-22. 在 IAR 下添加 CMSIS 文件示意图
芯片的Link文件建立工程时会默认根据型号选定,但是编译前还是要有检查的习惯,检查一下ICF文件是否有配置,是否正确。
图 4-23. 在 IAR 下添加 ICF 文件示意图
配置Debugger->Setup选项,新建立的工程默认是Simulator模拟,如果需要调试那么需要根据实际情况来选择:
1. 使用GD-Link选择CMSIS DAP(兼容性不好,不建议在IAR下使用);
2. 使用J-Link选择J-Link/J-Trace。
图 4-24. 在 IAR 下选择 Debugger 示意图
配置Debugger->Download选项,新建的工程有可能没有配置download选项,如果我们需要调试代码那么务必要勾选User flash loader选项,且保证board file准确,否则程序无法正常下载至芯片内部。
图 4-25. 在 IAR 下配置 flash loader 示意图
如果选择了Debugger选项,那么还需要根据Debugger选项设定对应的调试选项;如果选择的是GD的型号,在IAR下面已经固定将所有的调试接口都配置为SWD接口,可以忽略该选项配置,直接进行相关的代码debug工作。
5.外设资源地址对比
备注:GD32F350 新增多了比较器(CMP),CEC,DAC,USB,TSI。
6. 外设移植
6.1 System
GD32F3x0 在系统寄存器中新增 Unique device ID (96 bits),代表每一颗独一无二的芯片
6.1.1 HSE 注意事项
GD32 外部晶体起振时间会比 STM32F030 系列要长,所以原有的晶体超时时间需要加大:
调整前:
#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 */
6.1.2 GD32F3x0 Flash 取指零等待,软件方面注意事项
GD32F3x0 系列 Flash 都为零等待设计,在同主频下,带来了更高的性能体验。如果用户代码有用到 for 循环或者是 while 循环语句来做延时,延时时间在 GD32F3x0 系列上会变短,需要适当的加大延时参数或改用 Timer 来做延时函数。
6.1.2 GD32F3x0 上电启动异常常见原因
1. 检查板子上 Boot0 引脚是否悬空,GD32F3x0 运行用户程序必须要求 Boot0 经 10K 电阻接 GND;
2. 如果板子上有大功率器件(Wifi、GSM、GPS 等),检查大功率器件开启瞬间 VDD是否存在跌落情况,如存在跌落可以适当加大电源输出端的负载电容;
3. 观察芯片的复位管脚,复位管脚是否一直处于拉低状态,检查是否供电异常或者是芯片硬件看门狗使能了,芯片处于反复复位状态。
6.1.3 MCU 无法正常使用 SWD 下载程序
1. 接线异常,SWD 相关的调试口未正常接好;
2. 芯片是否被读保护或者处于反复复位状态;
3. SWD 的调试线过长或者是通信速率过高,适当减短 SWD 数据线,同时降低 SWD 速率;
4. 按照硬件指南给 SWD 添加相应的上下拉电阻,提高通信抗干扰能力。
6.2 GPIO 方面问题
完全兼容,无需修改。
6.3 中断
在中断管理器 NVIC 中,GD32F3x0 支持抢占式中断(内核的差别)寄存器方面存在差别
从上图可以看出两者之间的内部设计是不同的,用户在移植的时候需要注意。如果是使用我们修改过的基于 ST 库的代码,需要注意中断声明的名称和中断向量表中的匹配即可。
6.4 DMA 模块
完全相同,无需修改。
6.5 RCC 模块
不完全相同,对于 GD32F3x0 最高主频可以到 84M/108M,所以可以提高主频。
在外设时钟上,也多了一条时钟总线
关于 STM32F030 系统框图
关于 GD32F3x0 系统框图
6.6 TIMER 模块
完全相同,无需修改。
6.7 USART 模块
完全相同,无需修改。
6.8 ADC
不兼容,需要替换底层库。(PS:提供的关于能够使用 GD32F3x0 的 ST 库已经被替换了)GD3x0 ADC 最多支持 16+3 个通道,远远高于 ST030 的 10+2 个通道。需要特别说明的是,虽然同样只有 1 个 ADC,GD3x0 的 ADC 模块是和 ST103 的 ADC 模块是兼容的,ST030 的 ADC 没有了注入组,并且只有 1 个 ADC 数据寄存器,所以多通道采样时必须要用 DMA。
而 GD3x0 的 ADC 保持 ST103 的规则组和注入组(最多 4 个)的操作方式,所以可以参照GD32F103 或者 STM32F103 类似操作 ADC。
6.8.1
ADC 采集数据异常问题分析
1. ADC 通道的采集引脚未配置为模拟输入,GD32 要求通道 IO 口必须配置为模拟输入;
2. ADC 时钟过高,ADC 采样时钟高于 14M 获取到的数据不具有参考意义。因此,在实际使用中,应该确保 ADC 时钟不高于 14MHz;
3. ADC 采样值偏小或不稳定,应该适当的降低 ADC 时钟,加大采样时间。
6.9
IIC
内部集成电路总线接口,寄存器方面存在差别
按照 GD32F103 的外设进行设计,操作方式和 GD32F103 或 STM32F103 类似。
6.10
SPI
GD32F3x0 的 SPI 和 IIS 使用的是同一组寄存器,故寄存器方面存在差别。
6.10.1
SPI 通信 BSY 标志位
在 SPI 程序编写的过程中,轮询使用 BSY 作为通信标志位,导致传送数据丢失或者是错误。这主要是因为 GD 的 BSY 标志位不是在写入 DR 后就置位的,而是发送完第一个 bit 才被置位,传输过程中不要使用 BSY 作为每次传输的判断,使用 TXE 和 RXNE 来进行判断。
6.10.2
SPI 切换时钟频率后不能正常收发数据
与 ST 差异:GD32 在切换 SPI 时钟前要关闭 SPI,切换完成后再使能 SPI。ST 是要切换完成后使能 SPI 即可,不需要先关闭 SPI。
因此,在使用 GDF3x0 的 SPI 时,需在切换 SPI 时钟前要关闭 SPI,切换完成后再使能 SPI。
6.11
PMU 电源管理
完全兼容,无需修改
6.12
FWDGT
完全兼容,无需修改
6.13
Flash 方面问题
完全兼容,无需修改。
如果操作 Flash 使 用 的 是 库 函 数 , 因 为 我 们 提 供 的 库 stm32f0xx_flash.h 和stm32f0xx_flash.c 中已经把二者有差异的地方改过了,所以操作 Flash 无需修改。但是GD330 的 Flash 的页擦除和编程时间要稍长于 ST030,但是 GD32F3x0 flash 的代码段处于零等待区域,再加上同样跑 84/108M,GD3x0 的代码执行效率高于 ST030。
6.13.1
Flash 操作地址问题
写 Flash,必须采用绝对地址,也就是 0x08000000 为首地址。而对于读操作,既可以使用绝对地址,也可以用相对地址 0x00000000。
7.举例:以使用 EXTI+SPI 为例
0. 打开基于 STM32F030 的固件库,打开运行环境
原有的工程项目可能是 keil4 建立的,直接在 keil4 工程后缀名添加 x,即变成 keil5 项目;
1.在 keil 环境下,只需要安装 GD32F3x0 的固件包,可以到官网下载相应的固件包插件。
2.固件库软件移植步骤(以 GD32F350 为例子)
3.选择 GD32F350 设备型号
在修改型号完成之后,进行编译-这个时候是编译通过的。
4.经过上面的对比,以 EXTI 移植为例:
先介绍 GD32 现有的库,主要分为两大类型的库,一个使用 struct 进行包装给客户使用的库,另一种方式是使用寄存器直接赋值的方式。这次重点是使用结构体的固件库版本。先进行寄存器直接的对比:左边是 GD32F3x0 的寄存器,右边是 STM32F030 寄存器
EXTI 寄存器:
SPI 寄存器:
可以看出 SPI 上的寄存器差别很大,GD32F3x0 的 SPI 中含有 IIS 相关的寄存器,所以就函数内部库来说,差别会更大的。
函数库的内部函数:
左边为基于 ST 库修改适用于 GD32F3x0 ,右边为 GD 官方提供的库(下同)
可以看出内部的库是不一样的,GD32F3x0 是 M4 内核,可以支持中断分组,而 STM32F030 是不支持的。函数配置方面:
关于 SPI,GD 的命名规则是 SPI0、SPI1、SPI2,而在使用 ST 的库时候为 SPI1、SPI2、SPI3。
以下的代码是直接从 ST 的库案例代码直接复制过来,可以直接使用(在修改过的库上)
而在函数配置方面,也可能有一些差别,从上图可以看出来,但是函数名称基本是一样的,从上图可以看出来,在函数配置结构方面,可能有一些差别,但是函数名称基本是一样的。因为时间效率的关
系,我们不建议客户自己将 ST 库移植到 GD 芯片上,可是联系我们提供现成的移植好的库。
8.关于 GD32F3x0 和 F1x0 和 STM32F030 的关系
对于 GD32F3x0 是完全兼容 GD32F1x0 系列的,GD32F3x0 是在 GD32F1x0 上做了一些外设升级和优化,所以对于 GD32F3x0 和 STM32F030 之间的差别,基本就是 GD32F1x0 和 GD32F3x0 之间的差别。
教程由GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网,GD32MCU技术交流群:859440462
|