1. 前言
GD32E230 對(duì)比 STM32F030 有著很好的兼容性和更高的性價(jià)比,內(nèi)核和外設(shè)都有所增強(qiáng)。本人曾做過產(chǎn)品的 MCU 替換,將基于 STM32F0xx 1.5.0 固件庫(kù)的應(yīng)用程序移植到 GD32E230 上,大體上來說工作量不大,移植后的效果也不錯(cuò),GD32E230 相比 STM32F030 有不少功能的升級(jí),主頻也更高,能感覺到國(guó)產(chǎn) MCU 一直在進(jìn)步。本人將此前的移植經(jīng)驗(yàn)進(jìn)行了整理,可幫助有需要的朋友快速將應(yīng)用程序從 STM32F030 移植到GD32E230 上(基于STM32F0xx 標(biāo)準(zhǔn)庫(kù) V3.5.0 和 STM32F10x 標(biāo)準(zhǔn)庫(kù) V3.5.0)。本移植工作除基于STM32F0xx 1.5.0固件庫(kù)的工程外還需準(zhǔn)備STM32F10x 1.5.0固件庫(kù)。GD32E230系列采用 Cortex-M23 內(nèi)核,該內(nèi)核向下兼容 Cortex-M0/M0+。由于 KEIL5.25/IAR8.23及以上版本才提供了對(duì) M23 內(nèi)核的支持,因此常規(guī)情況下,必須在 KEIL5.26/IAR8.23 及以上開發(fā)環(huán)境下才可以正常使用該芯片。調(diào)試仿真器如果使用 Jlink 的話需要 JlinkV9,也可以用 GD 官方的 GDlink 調(diào)試,但 GDlink 在 IAR 下的支持相對(duì)差一些。據(jù)了解也有在低版本開發(fā)環(huán)境下開發(fā) E230的方法,可詢問供應(yīng)商或原廠。本文的介紹開發(fā)環(huán)境使用 Keil5.26 版本。
GD32E230 較 STM32F030 主要有以下優(yōu)點(diǎn):
1、更高的主頻(72MHz VS 48MHz)
2、更高版本的內(nèi)核(Cortex M23 VS M0)
3、支持更多指令集(單周期乘法、17 周期除法)
4、ADC 時(shí)鐘更高(28MHz VS 14MHz)
5、運(yùn)行功耗更低
2. 引腳兼容性
STM32F030 與 GD32E230 在相同封裝下是 Pin To Pin 兼容的。外設(shè)上 GD32E230 功能覆蓋STM32F030,大部分外設(shè)完全兼容,后文我會(huì)具體介紹。需要注意:相關(guān)手冊(cè)中 STM32F030 外設(shè)編號(hào)從 1 開始,GD32E230 外設(shè)編號(hào)從 0 開始,且命名有差異。
3. 資源兼容性
(1)下表給出了 STM32F030 與 GD32E230 的資源對(duì)比總覽(以 STM32F030C8 和 GD32E230C8對(duì)比為例):
表 1 STM32F030 系列和 GD32E230 系列內(nèi)部資源對(duì)比總覽

(2)在外設(shè)邏輯地址上 GD32E230C8 和 STM32F030C8 也是相同的,如下表 2。
表 2 STM32F030C8 系列和 GD32E230C8 系列外設(shè)基地址對(duì)比

(1) STM32F030 規(guī)格書上沒有 TIM2,但實(shí)際是有的,如果使用到這個(gè)隱藏資源需使用 GD32E230 的其他定時(shí)器替代。
4. 環(huán)境配置
本文基于Keil5.25版本進(jìn)行移植,需提前準(zhǔn)備GD32E230 IDE芯片插件,插件可到GD32MCU資料網(wǎng)站 gd32mcu.com 或他們的網(wǎng)盤 https://pan.baidu.com/s/1mhQsNpu 進(jìn)行下載。
(1) 安裝 GigaDevice.GD32E230_DFP.pack 后更改為 GD32E230 的對(duì)應(yīng)型號(hào),如圖 1

(2) 選擇好型號(hào)后先點(diǎn)擊 OK 然后再打開工程選項(xiàng),切換至 C/C++選項(xiàng)卡。將 Warnings設(shè)置項(xiàng)選擇 AC5-like Warnings;Language C 設(shè)置為 C99;Language C++設(shè)置為 C++11;Misc Controls 如果添加了內(nèi)容將其刪除。修改后如圖 2 紅框內(nèi)容所示。

(3) 在 Debug 選項(xiàng)卡選擇對(duì)應(yīng)的仿真器并在 Settings 里添加 GD32E230 的 Flash 下載算法。Utilities 選項(xiàng)卡中采用同樣設(shè)置。
5. 程序移植
對(duì)比上文內(nèi)容可知 GD32E230C8 和 STM32F030C8 大部分外設(shè)功能、配置以及邏輯地址都是兼容的。所以如果僅只是從 STM32F030C8 上把代碼移植到 GD32E230C8 上,需改動(dòng)的底層文件有 ADC 和 Flash、I2C,另外有細(xì)節(jié)設(shè)計(jì)差異需要調(diào)整 PWR 中進(jìn)入 standby 的函數(shù)。下面詳細(xì)介紹一下如何對(duì)這兩部分進(jìn)行修改。
5.1 ADC 外設(shè)庫(kù)修改
GD32E230C8 和 STM32F030C8 的 ADC 設(shè)計(jì)不同,實(shí)際和 STM32F103 配置相同。對(duì)此需要修改底層的 ADC 配置文件。雖然 ADC 設(shè)計(jì)上不相同,但其外設(shè)基地址還是相同的,也就是說只需要修改對(duì)應(yīng)的外設(shè)配置函數(shù),寄存器定義即可。對(duì)此有一個(gè)便捷的方法:可將 STM32F0xx標(biāo)準(zhǔn)庫(kù)中的stm32f0xx_adc.h 和 stm32f0xx_adc.c 文件內(nèi)代碼替換為 STM32F10x 標(biāo)準(zhǔn)庫(kù)中stm32f10x_adc.h 和 stm32f10x_adc.c 里的代碼,修改 stm32f0xx.h 中的 ADC 寄存器結(jié)構(gòu)體即可。
具體步驟如下:
(1) 將 stm32f10x_adc.c 中的代碼復(fù)制到 stm32f0xx_adc.c 中替換原始內(nèi)容,將兩個(gè)頭文件聲明改回 0xx 的頭文件聲明,如圖 3。

(2) 將替換后的 stm32f0xx_adc.c 中 void ADC_DeInit(ADC_TypeDef* ADCx)函數(shù)內(nèi)除 ADC1外的代碼刪除。如圖 4。

(3) 將 stm32f10x_adc.h 中的代碼復(fù)制到 stm32f0xx_adc.h 中替換原始內(nèi)容,頭文件聲明改回 0xx 的頭文件聲明,如圖 5。

(4) 將 stm32f10x.h 中的 ADC 寄存器結(jié)構(gòu)體 ADC_TypeDef 復(fù)制到 stm32f0xx.h 中替換原有的 ADC_TypeDef,如圖 6。

至此 ADC 外設(shè)的底層文件就移植完成,配置方法可參考 GD32E230 用戶手冊(cè)或者也可以直接參考 STM32F103 的 ADC 配置例程,功能上更加靈活。
E230 的 ADC 設(shè)計(jì)相比 STM32F072 更加靈活,在 F072 上 adc 通道只能配置成一個(gè)組且轉(zhuǎn)換順序只能按通道號(hào)順序來進(jìn)行,在 E103 上 adc 通道可以分為兩個(gè)組且順序排號(hào)可以自由定義,以下舉例在移植后的程序中如何配置 adc 通道 14 進(jìn)行連續(xù)轉(zhuǎn)換:

5.2 I2C 外設(shè)庫(kù)修改
GD32E230C8 和 STM32F030C8 的 I2C 設(shè)計(jì)不同,實(shí)際和 STM32F103 配置相同,所以移植方式也是和 ADC 一樣,將 STM32F0xx 標(biāo)準(zhǔn)庫(kù)中的 stm32f0xx_i2c.h 和 stm32f0xx_i2c.c 文件內(nèi)代碼替換為 STM32F10x 標(biāo)準(zhǔn)庫(kù)中 stm32f10x_i2c.h 和 stm32f10x_i2c.c 里的代碼,修改 stm32f0xx.h 中
的 ADC 寄存器結(jié)構(gòu)體即可。具體步驟如下:
(1) 將 stm32f10x_i2c.c 中的代碼復(fù)制到 stm32f0xx_i2c.c 中替換原始內(nèi)容,將兩個(gè)頭文件聲明改回 0xx 的頭文件聲明。
(2) 將 stm32f10x_i2c.h 中的代碼復(fù)制到 stm32f0xx_i2c.h 中替換原始內(nèi)容,頭文件聲明改回 0xx 的頭文件聲明
(3) 將 stm32f10x.h 中的 I2C 寄存器結(jié)構(gòu)體 I2C_TypeDef 復(fù)制到 stm32f0xx.h 中替換原有的 I2C_TypeDef至此 ADC 外設(shè)的底層文件就移植完成,配置方法可參考 GD32E230 用戶手冊(cè)或者也可以直接參考 STM32F103 的 I2C 配置例程。
5.3 Flash 外設(shè)庫(kù)修改
STM32F030 系列的 Flash 和選項(xiàng)字節(jié)編程是按照 16 位編程的,E230 僅支持 32 位和 64 位編程,所以 Flash 文件中所有操作選項(xiàng)字節(jié)的函數(shù)和 Flash 操作都需要調(diào)整,修改成 32 位操作。此外選項(xiàng)字節(jié)字節(jié)中無讀保護(hù)的值在 GD32E230 中是 A5,在 STM32F030 中是 AA。本人將需要修改的內(nèi)容進(jìn)行了整理,步驟如下:
(1) stm32f0xx_flash.h 中修改 OB_RDP_Level_0 宏定義為 0xA5,如圖 7。

(2) 修改 FLASH_OB_Erase 中寫選項(xiàng)字節(jié)的函數(shù),原始代碼是直接對(duì) 16 位的結(jié)構(gòu)體成員賦值,現(xiàn)將其修改為 32 位操作即可,做如圖 8 兩處改動(dòng)。其他的所有操作選項(xiàng)字節(jié)函數(shù)都做類似的修改,不在一一進(jìn)行說明。

(3) stm32f0xx 固件庫(kù)中有兩個(gè)對(duì) Flash 編程的函數(shù)接口:FLASH_ProgramWord 和FLASH_ProgramHalfWord;其中 FLASH_ProgramWord 中連續(xù)寫了兩次 16 位數(shù)據(jù)占滿了 4 個(gè)地址,這樣在 E230 上也是可以的,所以 FLASH_ProgramWord 不需要再做修改,當(dāng)然也可以把連續(xù)寫兩次 16 為數(shù)據(jù)的操作改為直接寫 32 位數(shù)據(jù)。如果有調(diào)用 FLASH_ProgramHalfWord 需要修改驅(qū)動(dòng)改為按字操作,或?qū)υ摵瘮?shù)進(jìn)行一點(diǎn)修改,在對(duì)目標(biāo)地址寫入 16 位數(shù)據(jù)后再往后面地址填充一個(gè) 0xFFFF,修改內(nèi)容如圖 9。

在進(jìn)行 Flash 編程時(shí)需注意,GD32E230 的 Flash 為 4 字節(jié)對(duì)齊,在 STM32F030 上可以對(duì)偶地址編程,移植到 GD32E230 后 Flash 編程的起始地址必須為 4 的整倍數(shù)!
5.4 pwr.c 進(jìn)入 standby 模式函數(shù)修改
為在 standby 模式下達(dá)到最低功耗,進(jìn)入 standby 前需手動(dòng)關(guān)閉 HXTAL,如圖 10 在PWR_EnterSTANDBYMode 函數(shù)添加如下紅框代碼:

6. 移植后應(yīng)用注意事項(xiàng)
6.1 while 和 for 循環(huán)
GD32E230 和 STM32F030 工藝、內(nèi)核、Flash 上都有區(qū)別,所以在相同主頻下代碼效率可能會(huì)有差異,應(yīng)用中如果有軟件延時(shí)需要進(jìn)行調(diào)整、或使用定時(shí)器等進(jìn)行精準(zhǔn)延時(shí)。
6.2 Flash
需再次強(qiáng)調(diào):在進(jìn)行 Flash 編程時(shí)需注意,GD32E230 的 Flash 為 4 字節(jié)對(duì)齊,在 STM32F030 上可以對(duì)偶地址編程,移植到 GD32E230 后 Flash 編程的起始地址必須為 4 的整倍數(shù)!正常情況編譯器會(huì)自動(dòng)的各類型變量都按 4 字節(jié)對(duì)齊方式分配地址,但如果使用了指定地址的方式定義變量,需注意定義地址按 4 字節(jié)對(duì)齊地址。
6.3 Flash 和 DMA 操作時(shí)序
E230 是 M23 內(nèi)核,和以往 GD 型號(hào)的 M3、M4 總線架構(gòu)有區(qū)別,F(xiàn)lash 操作時(shí) DMA 會(huì)出現(xiàn)阻塞,當(dāng) Flash 操作(主要是擦除時(shí)間比較久,編程操作時(shí)間短,每次編程間有間隔)時(shí),最好暫停使用DMA 的外設(shè),特別是 adc,避免 Flash 操作期間請(qǐng)求丟失導(dǎo)致后續(xù)搬運(yùn) buff 數(shù)據(jù)錯(cuò)位。
6.4 功能升級(jí)
GD32E230 相比 STM32F030 很多外設(shè)功能有擴(kuò)展升級(jí),但基于 STM32F0xx 的代碼移植過來的應(yīng)用程序沒有新功能 API,若希望發(fā)揮 E230 更多性能建議使用 GD 的官方固件庫(kù)進(jìn)行開發(fā)。
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)
-
單片機(jī)
+關(guān)注
關(guān)注
6055文章
44792瀏覽量
643515 -
嵌入式
+關(guān)注
關(guān)注
5119文章
19397瀏覽量
312180 -
STM32
+關(guān)注
關(guān)注
2281文章
10976瀏覽量
360683 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5305瀏覽量
100314 -
GD32
+關(guān)注
關(guān)注
7文章
417瀏覽量
24919
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
【GD32 MCU 移植教程】1、從 GD32F10x 移植到 GD32F30x

gd32e230 flash 模擬eeprom
AN011 GD32F10x系列移植到GD32F30x系列
【GD32 MCU 移植教程】6、從GD32F1x0和GD32F3x0移植到GD32E230

【GD32 MCU 移植教程】7、從 GD32F10x 移植到 GD32E103

【GD32 MCU 移植教程】8、從 STM32F4xx 系列移植到 GD32F4xx 系

【GD32 MCU 移植教程】9、從 STM32F10x 系列移植到 GD32F30x 系列

AN169 從GD32E230系列移植到GD32E235系列

評(píng)論