1. 前言
對于使用 GD32 系列微控制器進行產(chǎn)品開發(fā)的設(shè)計人員來說,因產(chǎn)品及功能升級,往往需要將一種微控制器替換成另一種微控制器,在保留既有功能的情況下增加新功能。為了更快地推出新產(chǎn)品,設(shè)計人員經(jīng)常要將應(yīng)用程序移植到新的微控制器。本應(yīng)用筆記旨在幫助您快速將應(yīng)用程序從 GD32F10x 系列微控制器移植到 GD32F30x 系列微控制器。
為了更好的利用本應(yīng)用筆記中的信息,您需要對 GD32 系列微控制器有比較深刻的了解。
2. 引腳兼容性
GD32F10x 與 GD32F30x 在相同封裝下是 Pin To Pin 兼容的。但由于 GD32F30x 較 GD32F10x 增加了內(nèi)部 48MHz RC 振蕩器給 USBD 模塊提供固定頻率,為滿足精度要求,GD32F30x 含有一個時鐘校準(zhǔn)控制器(CTC),所以兩者引腳定義有細(xì)微差別,如下表所示:
表 1 GD32F10x 系列和 GD32F30x 系列引腳區(qū)別
3. 內(nèi)部資源兼容性
下表給出了 GD32F10x 與 GD32F30x 的資源對比總覽(以 GD32F103xE 和 GD32F303xE 對比為例):
表 2 GD32F10x 系列和 GD32F30x 系列內(nèi)部資源對比總覽
4. 程序移植
由上節(jié)可看出,GD32F10x 和 GD32F30x 的主要差異性在于主頻(RCU 系統(tǒng)時鐘)、內(nèi)核版本和 CTC上,而 M4 內(nèi)核是向下兼容 M3 的,所以無需修改,現(xiàn)就 RCU 方面闡述程序移植過程。
4.1 RCU 系統(tǒng)時鐘配置
GD32F10x 系列和 GD32F30x 系列的時鐘配置過程相同,但 GD32F30x 支持更高的系統(tǒng)時鐘。若用戶選擇繼續(xù)使用原有的時鐘頻率,則在應(yīng)用程序中無需做任何改變;若用戶選擇使用更高的時鐘頻率,按以下步驟進行程序修改(以 GD32F103 移植到 GD32F303、使用外部 8MHz高速晶振 HXTAL為例,其他對應(yīng)型號、使用內(nèi)部晶振的移植過程類似):
(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 作為更高級的 MCU,較 GD32F10x在很多外設(shè)上增加了部分功能,用戶可根據(jù)以下羅列出的外設(shè)差異性選擇是否使用這些功能。
5.1 通用和備用輸入/輸出接口(GPIO 和 AFIO)
I/O 端口在作為輸出使用時,GD32F30x 可將 IO 的速度設(shè)置為 120MHz(GD32F10x 最大 50MHz),當(dāng) I/O 端口輸出速度大于 50MHz 時,建議使用 I/O 補償單元對 I/O 端口進行斜率控制,從而降低 I/O端口噪聲對電源的影響。具體功能以及寄存器設(shè)置,請用戶參考 GD32F30x 用戶手冊。
5.2 模數(shù)轉(zhuǎn)換器 ADC
為減輕 CPU 的負(fù)擔(dān),GD32F30x 較 GD32F10x 增加了片上硬件過采樣單元。它能夠處理多個轉(zhuǎn)換,并將多個轉(zhuǎn)換的結(jié)果取平均,得出一個 16 位寬的數(shù)據(jù)。 片上硬件過采樣單元是以降低數(shù)據(jù)輸出率為代價,換取較高的數(shù)據(jù)分辨率。 具體功能以及寄存器設(shè)置,請用戶參考 GD32F30x 用戶手冊。
5.3 通用同步異步收發(fā)器 USART
GD32F30x 較 GD32F10x 在 USART 上增加了塊模式(GD32F10x 只支持字節(jié)模式)、數(shù)據(jù)極性設(shè)置、數(shù)據(jù)位反轉(zhuǎn)以及 TX、RX 引腳電平反轉(zhuǎn)等功能,因此,GD32F30x 多了三個寄存器,分別為:USART_CTL3、USART_RT、USART_STAT1。具體功能以及寄存器設(shè)置,請用戶參考 GD32F30x用戶手冊。
5.4 內(nèi)部集成電路總線接口 I2C
GD32F30x 和 GD32F10x 的 I2C 都支持標(biāo)速(最高 100KHz)和快速(最高 400KHz),同時 GD32F30x可支持高速模式(最高 1MHz),要使能高速模式,需將 I2C_FMPCFG 寄存器的 FMPEN 置 1。具體功能以及寄存器設(shè)置,請用戶參考 GD32F30x 用戶手冊。
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è)置,請用戶參考 GD32F30x 用戶手冊。
5.6 通用串行總線全速設(shè)備接口 USBD
GD32F30x 較 GD32F10x 在 USBD 外設(shè)中增加了 USB2.0 鏈接電源管理(LPM)等級 L1,目的是為了優(yōu)化在掛起/恢復(fù)狀態(tài)下的電源消耗。LPM 包括從 L0 到 L3 共 4 種狀態(tài)。 LPM L1 狀態(tài)(睡眠狀態(tài)) 是新的電源管理狀態(tài)。具體功能以及寄存器設(shè)置,請用戶參考 GD32F30x 用戶手冊。
5.7 閃存控制器 FMC
GD32F30x 較 GD32F10x 增加了位編程功能,為用戶節(jié)省一定的 Flash 空間。其特點是,存儲在閃存中的數(shù)據(jù),其值為“1”的 bit 位可以改寫為“0”,而不影響其它位。例如,地址 0x0800 0400存儲的數(shù)據(jù)為 0x5a5a 5a5a,使用位編程功能,可直接將此地址的數(shù)據(jù)寫為 0x0a0a 0a0a,而不需
要先把該地址的數(shù)據(jù)擦除,然后寫 0x0a0a 0a0a。
請注意,位編程功能不能將值為“0”的 bit 位寫“1”,如上面的例子,將 0x0800 0400 地址寫為0xfafa fafa,將不會成功。關(guān)于 FMC 中位編程具體功能以及寄存器設(shè)置,請用戶參考 GD32F30x 用戶手冊。
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)
-
單片機
+關(guān)注
關(guān)注
6030文章
44489瀏覽量
631958 -
mcu
+關(guān)注
關(guān)注
146文章
16885瀏覽量
349912 -
嵌入式
+關(guān)注
關(guān)注
5059文章
18973瀏覽量
301995 -
移植
+關(guān)注
關(guān)注
1文章
376瀏覽量
28096 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4895瀏覽量
97055 -
GD32
+關(guān)注
關(guān)注
7文章
403瀏覽量
24106
發(fā)布評論請先 登錄
相關(guān)推薦
評論