1. 前言
对于使用
GD32
系列微控制器进行产品开发的设计人员来说,因产品及功能升级,往往需要将一种微控制器替换成另一种微控制器,在保留既有功能的情况下增加新功能。为了更快地推出新产品,设计人员经常要将应用程序移植到新的微控制器。
本应用笔记旨在帮助您快速将应用程序从
GD32F10x
系列微控制器移植到
GD32F30x
系列微控制
器。
为了更好的利用本应用笔记中的信息,您需要对
GD32
系列微控制器有比较深刻的了解。您可在兆易创新资料网站
gd32mcu.21ic.com
或网盘
https://pan.baidu.com/s/1mhQsNpu
下载
GD32
各系列 微控制器资料,如 Datasheet
、用户手册、官方例程及各种开发工具等。
2. 引脚兼容性
GD32F10x
与
GD32F30x
在相同封装下是
Pin To Pin
兼容的。但由于
GD32F30x
较
GD32F10x
增 加了内部 48MHz RC
振荡器给
USBD
模块提供固定频率,为满足精度要求,
GD32F30x
含有一个 时钟校准控制器(CTC)
,所以两者引脚定义有细微差别,如下表所示:
表
1 GD32F10x
系列和
GD32F30x
系列引脚区别

3. 内部资源兼容性
下表给出了
GD32F10x
与
GD32F30x
的资源对比总览
(
以
GD32F103xE
和
GD32F303xE
对比为
例
)
:
表
2 GD32F10x
系列和
GD32F30x
系列内部资源对比总览

4. 程序移植
由上节可看出,
GD32F10x
和
GD32F30x
的主要差异性在于主频
(RCU
系统时钟
)
、内核版本和
CTC 上,而 M4
内核是向下兼容
M3
的,所以无需修改,现就
RCU
方面阐述程序移植过程。
4.1 RCU 系统时钟配置
GD32F10x
系列和
GD32F30x
系列的时钟配置过程相同,但
GD32F30x
支持更高的系统时钟。若
用户选择继续使用原有的时钟频率,则在应用程序中无需做任何改变;若用户选择使用更高的时钟
频率,按以下步骤进行程序修改
(
以
GD32F103
移植到
GD32F303
、使用外部
8MHz
高速晶振
HXTAL 为例,其他对应型号、使用内部晶振的移植过程类似)
:
(1) 在 system_gd32f10x.c 文件中增加宏定义:
#define __SYSTEM_CLOCK_120M_PLL_HXTAL (uint32_t)(120000000)
如图
1
所示:

(2) 在 system_gd32f10x.c 文件中增加使用 120MHz 频率函数的声明,如图 2 所示:
(3) 在 system_gd32f10x.c 文件中增加使用 120MHz 频率函数的定义:
static void system_clock_120m_hxtal(void)
{
uint32_t timeout = 0U;
uint32_t stab_flag = 0U;
/* enable HXTAL */
RCU_CTL |= RCU_CTL_HXTALEN;
/* wait until HXTAL is stable or the startup time is longer than
HXTAL_STARTUP_TIMEOUT */
do{
timeout++;
stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
}while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));
/* if fail */
if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){
while(1){
}
}
/* HXTAL is stable */
/* AHB = SYSCLK */
RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
/* APB2 = AHB/1 */
RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;
/* APB1 = AHB/2 */
RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;
#if (defined(GD32F10X_MD) || defined(GD32F10X_HD) || defined(GD32F10X_XD))
/* select HXTAL/2 as clock source */
RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0);
RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_CFG0_PREDV0);
/* CK_PLL = (CK_HXTAL/2) * 30 = 120 MHz */
RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4);
RCU_CFG0 |= RCU_PLL_MUL30;
#elif defined(GD32F10X_CL)
/* CK_PLL = (CK_PREDIV0) * 30 = 120MHz */
RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4);
RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL30);
/* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */
RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF |
RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0);
RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 |
RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10);
/* enable PLL1 */
RCU_CTL |= RCU_CTL_PLL1EN;
/* wait till PLL1 is ready */
while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){
}
#endif /* GD32F10X_MD and GD32F10X_HD and GD32F10X_XD */
/* enable PLL */
RCU_CTL |= RCU_CTL_PLLEN;
/* wait until PLL is stable */
while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){
}
/* select PLL as system clock */
RCU_CFG0 &= ~RCU_CFG0_SCS;
RCU_CFG0 |= RCU_CKSYSSRC_PLL;
/* wait until PLL is selected as system clock */
while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){
}
}
(4)
在
system_gd32f10x.c
文件中增加使用
120MHz
频率函数的调用,如图
3
所示:

5. 外设差异性
GD32F10x
与
GD32F30x
在外设上都是兼容的,但
GD32F30x
作为更高级的
MCU
,较
GD32F10x 在很多外设上增加了部分功能,用户可根据以下罗列出的外设差异性选择是否使用这些功能。
5.1 通用和备用输入/输出接口(GPIO 和 AFIO)
I/O
端口在作为输出使用时,
GD32F30x
可将
IO
的速度设置为
120MHz(GD32F10x
最大
50MHz),
当
I/O
端口输出速度大于
50MHz
时,建议使用
I/O
补偿单元对
I/O
端口进行斜率控制,从而降低
I/O 端口噪声对电源的影响。具体功能以及寄存器设置,请用户参考 GD32F30x
用户手册。
5.2 模数转换器 ADC
为减轻
CPU
的负担,
GD32F30x
较
GD32F10x
增加了片上硬件过采样单元。它能够处理多个转换, 并将多个转换的结果取平均,得出一个 16
位宽的数据。 片上硬件过采样单元是以降低数据输出 率为代价,换取较高的数据分辨率。 具体功能以及寄存器设置,请用户参考 GD32F30x
用户手册。
5.3 通用同步异步收发器 USART
GD32F30x
较
GD32F10x
在
USART
上增加了块模式
(GD32F10x
只支持字节模式
)
、数据极性设置、 数据位反转以及 TX
、
RX
引脚电平反转等功能,因此,
GD32F30x
多了三个寄存器,分别为: USART_CTL3、
USART_RT
、
USART_STAT1
。具体功能以及寄存器设置,请用户参考
GD32F30x 用户手册
5.4 内部集成电路总线接口 I²C
GD32F30x
和
GD32F10x
的
I
²
C
都支持标速
(
最高
100KHz)
和快速
(
最高
400KHz)
,同时
GD32F30x 可支持高速模式(
最高
1MHz)
,要使能高速模式,需将
I2C_FMPCFG
寄存器的
FMPEN
置
1
。具 体功能以及寄存器设置,请用户参考 GD32F30x
用户手册。
5.5 串行外设接口/片上音频接口 SPI/I²S
GD32F30x
和
GD32F10x
的
SPI/I
²
S
模块差异性主要表现在
GD32F30x
支持
SPI TI
模式、
SPI NSS 脉冲模式和 SPI
四线功能
(
只有
SPI0)
,其中
SPI
的四线模式是用于控制四线
SPI Flash
外设,此模式下,数据传输速率是普通模式下的 4
倍。具体功能以及寄存器设置,请用户参考
GD32F30x
用户手册。
5.6 通用串行总线全速设备接口 USBD
GD32F30x
较
GD32F10x
在
USBD
外设中增加了
USB2.0
链接电源管理
(LPM)
等级
L1
,目的是为
了优化在挂起
/
恢复状态下的电源消耗。
LPM
包括从
L0
到
L3
共
4
种状态。
LPM L1
状态(睡眠状
态) 是新的电源管理状态。具体功能以及寄存器设置,请用户参考
GD32F30x
用户手册。
5.7 闪存控制器 FMC
GD32F30x
较
GD32F10x
增加了位编程功能,为用户节省一定的
Flash
空间。其特点是,存储在
闪存中的数据,其值为“
1
”的
bit
位可以改写为“
0
”,而不影响其它位。例如,地址
0x0800 0400 存储的数据为 0x5a5a 5a5a
,使用位编程功能,可直接将此地址的数据写为
0x0a0a 0a0a
,而不需
要先把该地址的数据擦除,然后写
0x0a0a 0a0a
。
请注意,位编程功能不能将值为“
0
”的
bit
位写“
1
”,如上面的例子,将
0x0800 0400
地址写为0xfafa fafa,将不会成功。
关于
FMC
中位编程具体功能以及寄存器设置,请用户参考
GD32F30x
用户手册。
更多
GD32
MCU相关咨询:
https://www.gd32bbs.com/