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)注
6022文章
44375瀏覽量
628280 -
嵌入式
+關(guān)注
關(guān)注
5045文章
18813瀏覽量
298429 -
STM32
+關(guān)注
關(guān)注
2257文章
10826瀏覽量
352428 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4768瀏覽量
96150 -
GD32
+關(guān)注
關(guān)注
7文章
400瀏覽量
23971
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論