1
1.本文简介
GD32F30x 系列 MCU 是基于 Arm® Cortex®-M4 处理器的 32 位通用微控制器,与 STM32F10x 系列 MCU 保持高度兼容。本文主要从以下三个方面进行介绍:硬件资源对比、外设及性能对比以及从 STM32F10x 移植到 GD32F30x 的移植步骤,旨在让开发者能够快速从 STM32F10x 移植到 GD32F30x,缩短研发周期,加快产品开发进度。
2.GD32F30x vs STM32F10x 硬件资源对比
GD32F30x 和 STM32F10x 硬件引脚对比如表 2-1. GD32F30x 和 STM32F10xpin 对比所示,由该表可知,GD32F30x 与 STM32F10x 完全硬件兼容。
表 2-1. GD32F30x 和 STM32F10x pin 对比
3.GD32F30x vs STM32F10x 外设及性能对比
GD32F30x 外设资源较丰富,可实现对 STM32F10x 外设资源的覆盖。其中GD32F303 对应 STM32F103,GD32F305 对应 STM32F105,GD32F307 对应STM32F107。具体系统及外设资源对比如表 3-1. GD32F30x 和 STM32F10x 系统及外设资源对比所示。
4.从 STM32F10x 到 GD32F30x 系列移植步骤
4.1.集成开发环境选型及工程配置
4.1.1.使用 Keil 开发 GD32F30x
目前市面通用的 MDK for Arm®版本有 Keil4 和 Keil5,使用 Keil4 建议安装 4.74及以上,使用 Keil5 建议安装 5.20 以上版本。
4.1.2.在 Keil4 中添加 GD32F30x MCU
1. 从 MCU 官 网 或 网 盘 下 载 相 关 的 GD32F30x 系 列 插 件 MDKARM_AddOn_GD32F30x_V1.0.0.rar。
图 4-1. GD32F30x 系列 MCU 型号支持 pack 包名称(Keil4)
2. 双击解压安装至Keil4的目录,一般都会默认选择,如若同时安装了Keil4和Keil5才需要手动选择。
图 4-2. Pack 包安装示意图(Keil4)
3. 安装成功后,重新打开Keil4,则可以在File->Device Database中出现GigaDevice的下拉选项,点击可以查看到相应的型号。
图 4-3. Pack 包成功安装示意图(Keil4)
4. 为了后续debug工作的顺利进行,建议检查一下安装路径下是否有下载算法,可以通过如下方式查看:打开一个工程,将型号选为GD32F30x的型号,然后Options for Target -> Debug ->Settings -> Flash Download-> Add,如果下拉选项中有GD32F30x的下载算法则完全安装成功。
图 4-4. Flash 算法文件选择示意图(Keil4)
4.1.3.在 Keil5 中添加 GD32F30x MCU
1. 从相关网站下载相关的GD32F30x系列插件Keil.GD32F30x_DFP.1.1.0.rar。
图 4-5. GD32 MCU 型号支持 pack 包名称(Keil5)
2. 解压并安装至Keil5的目录,一般都会默认选择。
图 4-6. Pack 包安装示意图(Keil5)
3. 安装完后重新打开Keil5工程,即可在Device->Database中出现GigaDevice的型号。
图 4-7. Pack 包安装成功示意图(Keil5)
4. 在Options for Target -> Debug ->Settings ->Flash Download 中添加flash算法,会出现GD32F30x的算法,即说明安装成功。根据相应的芯片选择合适的算法,即可下载仿真。
图 4-8. Flash 算法文件添加示意图(Keil5)
5. 用Keil5打开Keil4工程,如果报找不到器件信息等错误,将Keil4的插件安装在Keil5的目录下,具体操作方式参考Keil4插件相关内容。
4.1.4.MDK 使用常见问题解答
1. Keil4打开Keil5工程
如果没有安装Keil5,也是能够使用Keil4来编译Keil5的工程,具体做法就是修改工程的后缀名,将Keil5工程的后缀名xxxx.uvprojx修改为xxxx.uvproj,即可使用Keil4来查看编译了。
2. Keil5打开Keil4工程
如果使用Keil5打开Keil4工程,打开时会遇到找不到MCU器件的情况,这种可以直接将Keil4工程的后缀名xxxx.uvproj修改为xxxx.uvprojx,即可正常使用Keil5来查看编译了。
3. GigaDevice.GD32F30x_DFP.pack特性
1. 支持在线安装方式;
2. 支持本地安装方式;
3. 自动生成GD32F30x系列MCU列表及对应的特征信息;
4. 自动匹配所选芯片对应的Flash算法;
5. 支持用户在Debug模式下查看寄存器状态;
6. 利用Books选项卡获取文档资料。
4. Pack包对Keil版本要求
Pack包适用于Keil5.15及以上版本,对于Keil5.13和5.14版本,有如下两个问题:
1. Debug模式下无法调用SVD文件查看寄存器状态;
2. 对Pack进行Schema check会报错。
5. Keil5打开Keil4工程,编译报错
图 4-9. 编译错误示意图
错误原因是core_cmInstr.h文件的路径在Keil5和Keil4中不同,可在Option forTarget的C/C++中添加core_cmInstr.h的文件路径,如图4-10所示:
图 4-10. 文件路径添加示意图
4.1.5.使用 GD-LINK 开发 GD32F30x
GD32F30x的开发板自带GD-LINK,可以用电路板上的GD-LINK调试仿真代码,操作方法如下。
1. 在Options for Target -> Debug 中选择“CMSIS-DAP Debugger”,部分客户反馈找不到这一驱动器选项,那是因为MDK版本过低,只有Keil4.74以上的版本和Keil5才支持CMSIS-DAP Debugger选项。
图 4-11. GD-LINK 选择 Debugger 类型
2. 在Options for Target -> Utilities,也要选择“CMSIS-DAP Debugger”。
图 4-12. GD-LINK 在 Utilities 中选择 Debugger 类型
3. 在Options for Target -> Debug ->Settings勾选SWJ、Port选择 SW。右框IDcode会出现”0xXBAXXXXX”。
图 4-13. GD-LINK 成连接目标板示意图
4. 在Options for Target -> Debug ->Settings -> Flash Download中添加GD32的flash算法。
图 4-14. GD-LINK 添加 Flash 算法文件示意图
5. 单击下图的快捷方式“debug”,即可使用GD-LINK进行仿真。
图 4-15. GD-LINK 仿真示意图
4.1.6.使用 J-Link 开发 GD32F30x
使用J-Link来debug GD MCU,具体配置如下:
1. 在Options for Target -> Debug中选择“J-LINK/J-Trace Cortex”。
图 4-16. J-Link 在 Keil 中选择 Debugger 示意图
2. 在Options for Target -> Debug ->Utilities,也要选择“J-LINK/J-Trace Cortex”。
图 4-17. J-Link 在 Utilities 下选择 Debugger 示意图
3. 在Options for Target -> Debug ->Settings勾选SWJ,Port选择 SW。右框IDcode会出现“0xXBAXXXXX”。
图 4-18. J-Link 成功连接目标板示意图
4. 在Options for Target -> Debug ->Settings -> Flash Download中添加GD32的flash算法。
图 4-19. J-Link 在 Keil 下添加 flash 算法文件示意图
5. 单击下图的快捷方式“debug”,即可使用J-Link进行仿真。
图 4-20. J-Link 成功仿真示意图
4.1.7.使用 IAR 开发 GD32F30x
IAR版本众多,版本之间的兼容性并不好,如果初次使用建议安装7.3以上的版本,安装好IAR以后再根据该文档来添加GD的器件型号,进行相关的debug工作。
4.1.8.在 IAR 中添加 GD32F30x MCU Device
1. 从 相 关 网 站 下 载 相 应 的 GD32F30x 系 列 插 件IAR_GD32F30x_ADDON.1.0.0.exe:
2. 运行IAR_GD32F30x_ADDON.1.0.0.exe,单击start开始安装插件。
图 4-21. IAR 中安装支持 GD32 型号 pack 包示意图
3. 安装成功后单击Finish,结束插件安装。
图 4-22. IAR 下 pack 包安装示意图
4.1.9.在 IAR 中编译调试 GD32F30x
在上一小节中我们已经添加了GD32F30x系列的插件,这一小节我们介绍应如何使用它。
使用IAR编译GD的型号,有两个办法,一种是使用现有的工程进行修改,还有就是重新建立工程,这里就不细说具体工程应该如何建立,GD的工程建立和别的平台都一致,建立工程时选择GD的相应型号。如果没有安装GD的插件,可以选择别的M3厂家型号。
图 4-23. 在 IAR 下选择芯片型号示意图
6.1以后的IAR不需要添加CMSIS文件(core_cm4.c和core_cm4.h),但是需要勾选General Options->Library Configuration的Use CMSIS,如果软件代码有使用到printf函数,还需要修改Library为FULL。
图 4-24. 在 IAR 下添加 CMSIS 文件示意图
芯片的Link文件建立工程时会默认根据型号选定,但是编译前还是要有检查的习惯,检查一下ICF文件是否有配置,是否正确。
图 4-25. 在 IAR 下添加 ICF 文件示意图
配置Debugger->Setup选项,新建立的工程默认是Simulator模拟,如果需要调试那么需要根据实际情况来选择:
1. 使用GD-LINK选择CMSIS DAP(兼容性不好,不建议在IAR下使用);
2. 使用J-Link选择J-Link/J-Trace。
图 4-26. 在 IAR 下选择 Debugger 示意图
配置Debugger->Download选项,新建的工程有可能没有配置download选项,如果我们需要调试代码那么务必要勾选User flash loader选项,且保证board file准确,否则程序无法正常下载至芯片内部。
图 4-27. 在 IAR 下配置 flash loader 示意图
如果选择了Debugger选项,那么还需要根据Debugger选项设定对应的调试选项;如果选择的是GD的型号,在IAR下面已经固定将所有的调试接口都配置为SWD接口,可以忽略该选项配置,直接进行相关的代码debug工作。
4.2.System 模块使用注意事项
4.2.1.HXTAL 时钟丢失后,程序如何运行
程序使用外部晶振正常运行之后,如果将外部晶振去掉或者短路,GD32F30x 的程序不会取指执行。若将晶振重新恢复正常,程序会接着之前的地址运行,如果程序对丢时钟这种场景有特殊要求,应用中需要手动使能时钟安全系统,在其中做相关的保护措施。
4.2.2.如何区分 standby 复位和上电复位
仅通过 RCU 的 RCU_RSTSCK 寄存器无法区分是 standby 复位还是上电复位,需要结合查询 PMU 的 PMU_CS 寄存器解决问题。
4.2.3.HSE 注意事项
GD32F30x 外部晶体起振时间会比 STM32F10x 系列要长,所以原有的晶体超时时间需要加大:
调整前:
调整后:
4.2.4.如何通过软件区分 GD32 和 STM32
GD32F30x 在设计阶段,已经预留了相关寄存器,用户只需要软件读取寄存器,即可获取到相关的型号信息,GD32F30x 每个型号此处值都为固定值。
Code_Num=*( uint32_t *)( 0x40022100 );
4.2.5.GD32F30x Flash 取值零等待,软件方面注意事项
GD32F30x 系列 Flash 为零等待设计,在同主频下,带来了更高的性能体验。如果用户代码有用到 for 循环或者是 while 循环语句来做延时,延时时间在GD32F30x系列上会变短,需要适当的加大延时参数或改用Timer来做延时函数。
4.2.6.GD32F30x 上电启动异常常见原因
1. 检查板子上 Boot 0 引脚是否悬空,GD32F30x 运行用户程序必须要求 Boot0经 10K 电阻接 GND;
2. 如果板子上有大功率器件(Wifi、GSM、GPS 等),检查大功率器件开启瞬间
VDD 是否存在跌落情况,如存在跌落可以适当加大电源输出端的负载电容;
3. 观察芯片的复位管脚,复位管脚是否一直处于拉低状态,检查是否供电异常
或者是芯片硬件看门狗使能了,芯片处于反复复位状态。
4.2.7.MCU 无法正常使用 SWD 下载程序
1. 接线异常,SWD 相关的调试口未正常接好;
2. 芯片是否被读保护或者处于反复复位状态;
3. SWD 的调试线过长或者是通信速率过高,适当减短 SWD 数据线,同时降低SWD 速率;
4. 按照硬件指南给 SWD 添加相应的上下拉电阻,提高通信抗干扰能力。
4.2.8.MCU 上电时间较长
由于设计架构差异,GD32F30x 比 STM32F10x 的上电时间和 Standby 唤醒时间较长,时间约 144ms,若对时间没有要求,可忽略。
4.2.9.代码超过 256K 后执行速度慢
GD32F30x 系列的 Flash 分为 Code 区(前 256K)和 Data 区(256K 以后的区域),二者在擦写操作上没有区别,但是读操作时间上存在较大差别,Code 区代码取值零等待,Data 区执行代码会有较长延时。应用中如果涉及该架构影响到使用可以通过分散加载来改善,具体做法参考分散加载应用文档。
4.3.CAN 模块使用注意事项
4.3.1.CAN 发送出现 ACK 错误
假如出现类似 ACK 出错的问题,可以修改采样点,一般做法是将 BS1 值增大,BS2 减小。
4.3.2.CAN 接收异常,接收两帧数据会丢一包数据
STM32 固件库会调用 CAN_FIFORelease 函数,如果手动多调用一次清缓存的动作会导致 CAN 接收丢包,也就是软件中无需主动调用 CAN_FIFORelease 函数,CAN FIFO 会被自动释放。
4.4.低功耗注意事项
4.4.1.在 Stop 模式下,少数芯片功耗偏高
为了使功耗恢复正常,需要将没用到的 IO 口全部配置成模拟输入(AN)模式,芯片内部未引出来的也要配置。
4.4.2.在 Stop 模式下,概率性不能唤醒
在不断进出 Stop,并且不断有 timer 或者 systick 中断时,运行很长时间后,在 Stop模式下有概率性的无法唤醒。
解决方案:
当进入 Stop 时(WFI/WFE),屏蔽掉除唤醒源中断外的所有中断,出 Stop 之后再打开其他中断,代码修改如下。
4.5.ADC 模块使用注意事项
4.5.1.ADC 采集数据异常问题分析
1. ADC 通道的采集引脚未配置为模拟输入,GD32 要求通道 IO 口必须配置为模拟输入;
2. ADC 时钟过高,ADC 采样时钟高于 40M 获取到的数据不具有参考意义;
3. ADC 不耐 5V 的 IO 口被接入超过 VDDA 的电平信号;
4. ADC 采样值偏小或不稳定,应该适当的降低 ADC 时钟,加大采样周期的值。
4.5.2.ADC1 和 ADC2 同步模式下,注意事项
如果 ADC1 和 ADC2 同步采集,ADC2 是跟着 ADC1 同步触发,此时 ADC2 的注入组的触发方式需要手动配置成软件触发(默认是 TIMER1_TRGO),否则可能导致 ADC 注入组无数据。
4.5.3.ADC_CR2 中的 ADCON 使用注意事项
ADC 使能以后需要在代码里面插入 1 个通道的 ADC 转换周期以上;
4.5.4.ADC 查询法采集数据,出现通道错乱的情况
ADC 使用查询法采集数据时,如果使能了 ADC 的 SCAN 模式,就有可能会出现ADC 数据错乱的情况;ADC 采集通道 SCAN 功能只适用于多通道注入采样和DMA 模式。
4.5.5.ADC 在每次复位之后采样值有偏差
由于 MCU 上电或者复位阶段,ADC 校准时,电源不稳定,导致校准时出现偏差,ADC 值采样均出现偏大或者偏小,可以关闭校准,或者等电源稳定后再校准解决该问题。
4.6.RCU 模块使用注意事项
当 IAP 时,使用 GD32 的固件作为 boot,跳转到 STM32 固件库的 APP 后,可能造成系统时钟不对,例如 uart 打印异常,timer 异常。
GD32F30x 系列 MCU 最高主频可以运行 120MHz,PLL 倍频参数比 STM32 的多几个 bit,如下,出现异常时,需要跳转前将相关的 bit 复位。
GD32 的 CFG0 寄存器的 bit30 bit28 bit27 为有效位。
STM32 的 RCC_CFGR 寄存器的 bit30 bit28 bit27 为保留位。
4.7.SPI 模块使用注意事项
4.7.1.SPI 通信 BSY 标志位
在 SPI 程序编写的过程中,轮询使用 BSY 作为通信标志位,导致传送数据丢失或者是错误。
这主要是因为 GD32 的 BSY 标志位不是在写入 DR 后就置位的,而是发送完第一个 bit 才被置位,传输过程中不要使用 BSY 作为每次传输的判断,使用 TXE 和RXNE 来进行判断。
4.7.2.SPI 使能之后配置参数不生效
当需要修改 SPI 模式或者速度的时候,需要将 SPI 先 disable,再修改参数,最后再 enable.
4.7.3.SPI 从机模式管脚模式
从机模式下 CLK、MISO、NSS 需要将 IO 配置成 Input_floating,才能正常工作。
4.8.UART 模块使用注意事项
4.8.1.UART DMA 注意事项
使用 UART DMA 发送数据的时候,可能丢掉一帧中的第一个 byte 数据,注意尽量不要在发送的时候频繁的开关 UART 发送,若测试无问题,可以忽略。
usart_transmit_config(USARTx,USART_TRANSMIT_ENABLE)假如要关闭 UART 发送,需要按照以下流程:
先开启 usart_transmit_ enable 再去打开 dma_channel_enable,如下图。
4.9.RTC 模块使用注意事项
4.9.1.LSE 驱动模式
GD32 MCU 的 RTC 驱动能力分四档,默认是强驱动能力,若不使用 GD32 本身的固件库,可能会强驱动改成弱驱模式,造成部分机器不起振,则需要将寄存器RCU_BDCTL 的 LXTALDRI[1:0]配置成 11
4.10.USB 模块使用注意事项
USBD 通讯假如出现 PMOUIF 和 ERRIF 错误,可以通过屏蔽 CNTR_ESOFM 标志来解决该问题。
4.11.Flash 模块使用注意事项
4.11.1.Flash 擦写差异
GD32 MCU Flash 执行速度快,但是写操作慢,所以在对 Flash 操作的时候需要修改下面几个函数:
4.11.2.Flash 操作地址差异
写 Flash,必须采用绝对地址,也就是 0x08000000 为首地址。而对于读操作,既可以使用绝对地址,也可以用相对地址 0x00000000。
本教程由GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网
全部0条评论
快来发表一下你的评论吧 !