1. 前言
對(duì)于使用 GD32 系列微控制器進(jìn)行產(chǎn)品開(kāi)發(fā)的設(shè)計(jì)人員來(lái)說(shuō),因產(chǎn)品及功能升級(jí),往往需要將一種微控制器替換成另一種微控制器,在保留既有功能的情況下增加新功能。為了更快地推出新產(chǎn)品,設(shè)計(jì)人員經(jīng)常要將應(yīng)用程序移植到新的微控制器。本應(yīng)用筆記旨在幫助您快速將應(yīng)用程序從 GD32F10x 系列微控制器移植到 GD32F30x 系列微控制器。
為了更好的利用本應(yīng)用筆記中的信息,您需要對(duì) GD32 系列微控制器有比較深刻的了解。
2. 引腳兼容性
GD32F10x 與 GD32F30x 在相同封裝下是 Pin To Pin 兼容的。但由于 GD32F30x 較 GD32F10x 增加了內(nèi)部 48MHz RC 振蕩器給 USBD 模塊提供固定頻率,為滿足精度要求,GD32F30x 含有一個(gè)時(shí)鐘校準(zhǔn)控制器(CTC),所以兩者引腳定義有細(xì)微差別,如下表所示:
表 1 GD32F10x 系列和 GD32F30x 系列引腳區(qū)別

3. 內(nèi)部資源兼容性
下表給出了 GD32F10x 與 GD32F30x 的資源對(duì)比總覽(以 GD32F103xE 和 GD32F303xE 對(duì)比為例):
表 2 GD32F10x 系列和 GD32F30x 系列內(nèi)部資源對(duì)比總覽


4. 程序移植
由上節(jié)可看出,GD32F10x 和 GD32F30x 的主要差異性在于主頻(RCU 系統(tǒng)時(shí)鐘)、內(nèi)核版本和 CTC上,而 M4 內(nèi)核是向下兼容 M3 的,所以無(wú)需修改,現(xiàn)就 RCU 方面闡述程序移植過(guò)程。
4.1 RCU 系統(tǒng)時(shí)鐘配置
GD32F10x 系列和 GD32F30x 系列的時(shí)鐘配置過(guò)程相同,但 GD32F30x 支持更高的系統(tǒng)時(shí)鐘。若用戶選擇繼續(xù)使用原有的時(shí)鐘頻率,則在應(yīng)用程序中無(wú)需做任何改變;若用戶選擇使用更高的時(shí)鐘頻率,按以下步驟進(jìn)行程序修改(以 GD32F103 移植到 GD32F303、使用外部 8MHz高速晶振 HXTAL為例,其他對(duì)應(yīng)型號(hào)、使用內(nèi)部晶振的移植過(guò)程類似):
(1) 在 system_gd32f10x.c 文件中增加宏定義:
#define __SYSTEM_CLOCK_120M_PLL_HXTAL (uint32_t)(120000000)
如圖 1 所示:
圖 1在 system_gd32f10x.c 文件中增加宏定義(2) 在 system_gd32f10x.c 文件中增加使用 120MHz 頻率函數(shù)的聲明,如圖 2 所示:
圖 2120MHz 函數(shù)聲明(3) 在 system_gd32f10x.c 文件中增加使用 120MHz 頻率函數(shù)的定義:
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 頻率函數(shù)的調(diào)用,如圖 3 所示:
圖3 120MHz 函數(shù)調(diào)用5. 外設(shè)差異性
GD32F10x 與 GD32F30x 在外設(shè)上都是兼容的,但 GD32F30x 作為更高級(jí)的 MCU,較 GD32F10x在很多外設(shè)上增加了部分功能,用戶可根據(jù)以下羅列出的外設(shè)差異性選擇是否使用這些功能。
5.1 通用和備用輸入/輸出接口(GPIO 和 AFIO)
I/O 端口在作為輸出使用時(shí),GD32F30x 可將 IO 的速度設(shè)置為 120MHz(GD32F10x 最大 50MHz),當(dāng) I/O 端口輸出速度大于 50MHz 時(shí),建議使用 I/O 補(bǔ)償單元對(duì) I/O 端口進(jìn)行斜率控制,從而降低 I/O端口噪聲對(duì)電源的影響。具體功能以及寄存器設(shè)置,請(qǐng)用戶參考 GD32F30x 用戶手冊(cè)。
5.2 模數(shù)轉(zhuǎn)換器 ADC
為減輕 CPU 的負(fù)擔(dān),GD32F30x 較 GD32F10x 增加了片上硬件過(guò)采樣單元。它能夠處理多個(gè)轉(zhuǎn)換,并將多個(gè)轉(zhuǎn)換的結(jié)果取平均,得出一個(gè) 16 位寬的數(shù)據(jù)。 片上硬件過(guò)采樣單元是以降低數(shù)據(jù)輸出率為代價(jià),換取較高的數(shù)據(jù)分辨率。 具體功能以及寄存器設(shè)置,請(qǐng)用戶參考 GD32F30x 用戶手冊(cè)。
5.3 通用同步異步收發(fā)器 USART
GD32F30x 較 GD32F10x 在 USART 上增加了塊模式(GD32F10x 只支持字節(jié)模式)、數(shù)據(jù)極性設(shè)置、數(shù)據(jù)位反轉(zhuǎn)以及 TX、RX 引腳電平反轉(zhuǎn)等功能,因此,GD32F30x 多了三個(gè)寄存器,分別為:USART_CTL3、USART_RT、USART_STAT1。具體功能以及寄存器設(shè)置,請(qǐng)用戶參考 GD32F30x用戶手冊(cè)。
5.4 內(nèi)部集成電路總線接口 I2C
GD32F30x 和 GD32F10x 的 I2C 都支持標(biāo)速(最高 100KHz)和快速(最高 400KHz),同時(shí) GD32F30x可支持高速模式(最高 1MHz),要使能高速模式,需將 I2C_FMPCFG 寄存器的 FMPEN 置 1。具體功能以及寄存器設(shè)置,請(qǐng)用戶參考 GD32F30x 用戶手冊(cè)。
5.5 串行外設(shè)接口/片上音頻接口 SPI/I2S
GD32F30x 和 GD32F10x 的 SPI/I2S 模塊差異性主要表現(xiàn)在 GD32F30x 支持 SPI TI 模式、SPI NSS脈沖模式和 SPI 四線功能(只有 SPI0),其中 SPI 的四線模式是用于控制四線 SPI Flash 外設(shè),此模式下,數(shù)據(jù)傳輸速率是普通模式下的 4 倍。具體功能以及寄存器設(shè)置,請(qǐng)用戶參考 GD32F30x 用戶手冊(cè)。
5.6 通用串行總線全速設(shè)備接口 USBD
GD32F30x 較 GD32F10x 在 USBD 外設(shè)中增加了 USB2.0 鏈接電源管理(LPM)等級(jí) L1,目的是為了優(yōu)化在掛起/恢復(fù)狀態(tài)下的電源消耗。LPM 包括從 L0 到 L3 共 4 種狀態(tài)。 LPM L1 狀態(tài)(睡眠狀態(tài)) 是新的電源管理狀態(tài)。具體功能以及寄存器設(shè)置,請(qǐng)用戶參考 GD32F30x 用戶手冊(cè)。
5.7 閃存控制器 FMC
GD32F30x 較 GD32F10x 增加了位編程功能,為用戶節(jié)省一定的 Flash 空間。其特點(diǎn)是,存儲(chǔ)在閃存中的數(shù)據(jù),其值為“1”的 bit 位可以改寫(xiě)為“0”,而不影響其它位。例如,地址 0x0800 0400存儲(chǔ)的數(shù)據(jù)為 0x5a5a 5a5a,使用位編程功能,可直接將此地址的數(shù)據(jù)寫(xiě)為 0x0a0a 0a0a,而不需
要先把該地址的數(shù)據(jù)擦除,然后寫(xiě) 0x0a0a 0a0a。
請(qǐng)注意,位編程功能不能將值為“0”的 bit 位寫(xiě)“1”,如上面的例子,將 0x0800 0400 地址寫(xiě)為0xfafa fafa,將不會(huì)成功。關(guān)于 FMC 中位編程具體功能以及寄存器設(shè)置,請(qǐng)用戶參考 GD32F30x 用戶手冊(cè)。
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)
-
單片機(jī)
+關(guān)注
關(guān)注
6078文章
45550瀏覽量
672777 -
mcu
+關(guān)注
關(guān)注
147文章
19064瀏覽量
402232 -
嵌入式
+關(guān)注
關(guān)注
5208文章
20586瀏覽量
336273 -
移植
+關(guān)注
關(guān)注
1文章
417瀏覽量
29511 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
26文章
6372瀏覽量
120054 -
GD32
+關(guān)注
關(guān)注
7文章
434瀏覽量
27537
發(fā)布評(píng)論請(qǐng)先 登錄
AN047 GD32E103&C103移植到GD32F30x
AN011 GD32F10x系列移植到GD32F30x系列
兆易創(chuàng)新GD32F30x系列MCU用戶手冊(cè)
【GD32 MCU 移植教程】2、從 GD32F303 移植到 GD32F503
【GD32 MCU 移植教程】6、從GD32F1x0和GD32F3x0移植到GD32E230
【GD32 MCU 移植教程】7、從 GD32F10x 移植到 GD32E103
【GD32 MCU 移植教程】9、從 STM32F10x 系列移植到 GD32F30x 系列
AN136 基于GD32F30x系列的IEC60730 ClassB庫(kù)移植指南
【GD32 MCU 移植教程】1、從 GD32F10x 移植到 GD32F30x
評(píng)論