1. 前言
GD32E230 對比 STM32F030 有著很好的兼容性和更高的性價比,內(nèi)核和外設(shè)都有所增強。本人曾做過產(chǎn)品的 MCU 替換,將基于 STM32F0xx 1.5.0 固件庫的應(yīng)用程序移植到 GD32E230 上,大體上來說工作量不大,移植后的效果也不錯,GD32E230 相比 STM32F030 有不少功能的升級,主頻也更高,能感覺到國產(chǎn) MCU 一直在進(jìn)步。本人將此前的移植經(jīng)驗進(jìn)行了整理,可幫助有需要的朋友快速將應(yīng)用程序從 STM32F030 移植到GD32E230 上(基于STM32F0xx 標(biāo)準(zhǔn)庫 V3.5.0 和 STM32F10x 標(biāo)準(zhǔn)庫 V3.5.0)。本移植工作除基于STM32F0xx 1.5.0固件庫的工程外還需準(zhǔn)備STM32F10x 1.5.0固件庫。GD32E230系列采用 Cortex-M23 內(nèi)核,該內(nèi)核向下兼容 Cortex-M0/M0+。由于 KEIL5.25/IAR8.23及以上版本才提供了對 M23 內(nèi)核的支持,因此常規(guī)情況下,必須在 KEIL5.26/IAR8.23 及以上開發(fā)環(huán)境下才可以正常使用該芯片。調(diào)試仿真器如果使用 Jlink 的話需要 JlinkV9,也可以用 GD 官方的 GDlink 調(diào)試,但 GDlink 在 IAR 下的支持相對差一些。據(jù)了解也有在低版本開發(fā)環(huán)境下開發(fā) E230的方法,可詢問供應(yīng)商或原廠。本文的介紹開發(fā)環(huán)境使用 Keil5.26 版本。
GD32E230 較 STM32F030 主要有以下優(yōu)點:
1、更高的主頻(72MHz VS 48MHz)
2、更高版本的內(nèi)核(Cortex M23 VS M0)
3、支持更多指令集(單周期乘法、17 周期除法)
5、運行功耗更低
2. 引腳兼容性
STM32F030 與 GD32E230 在相同封裝下是 Pin To Pin 兼容的。外設(shè)上 GD32E230 功能覆蓋STM32F030,大部分外設(shè)完全兼容,后文我會具體介紹。需要注意:相關(guān)手冊中 STM32F030 外設(shè)編號從 1 開始,GD32E230 外設(shè)編號從 0 開始,且命名有差異。
3. 資源兼容性
(1)下表給出了 STM32F030 與 GD32E230 的資源對比總覽(以 STM32F030C8 和 GD32E230C8對比為例):
表 1 STM32F030 系列和 GD32E230 系列內(nèi)部資源對比總覽
(2)在外設(shè)邏輯地址上 GD32E230C8 和 STM32F030C8 也是相同的,如下表 2。
表 2 STM32F030C8 系列和 GD32E230C8 系列外設(shè)基地址對比
(1) STM32F030 規(guī)格書上沒有 TIM2,但實際是有的,如果使用到這個隱藏資源需使用 GD32E230 的其他定時器替代。
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 的對應(yīng)型號,如圖 1
(2) 選擇好型號后先點擊 OK 然后再打開工程選項,切換至 C/C++選項卡。將 Warnings設(shè)置項選擇 AC5-like Warnings;Language C 設(shè)置為 C99;Language C++設(shè)置為 C++11;Misc Controls 如果添加了內(nèi)容將其刪除。修改后如圖 2 紅框內(nèi)容所示。
(3) 在 Debug 選項卡選擇對應(yīng)的仿真器并在 Settings 里添加 GD32E230 的 Flash 下載算法。Utilities 選項卡中采用同樣設(shè)置。
5. 程序移植
對比上文內(nèi)容可知 GD32E230C8 和 STM32F030C8 大部分外設(shè)功能、配置以及邏輯地址都是兼容的。所以如果僅只是從 STM32F030C8 上把代碼移植到 GD32E230C8 上,需改動的底層文件有 ADC 和 Flash、I2C,另外有細(xì)節(jié)設(shè)計差異需要調(diào)整 PWR 中進(jìn)入 standby 的函數(shù)。下面詳細(xì)介紹一下如何對這兩部分進(jìn)行修改。
5.1 ADC 外設(shè)庫修改
GD32E230C8 和 STM32F030C8 的 ADC 設(shè)計不同,實際和 STM32F103 配置相同。對此需要修改底層的 ADC 配置文件。雖然 ADC 設(shè)計上不相同,但其外設(shè)基地址還是相同的,也就是說只需要修改對應(yīng)的外設(shè)配置函數(shù),寄存器定義即可。對此有一個便捷的方法:可將 STM32F0xx標(biāo)準(zhǔn)庫中的stm32f0xx_adc.h 和 stm32f0xx_adc.c 文件內(nèi)代碼替換為 STM32F10x 標(biāo)準(zhǔn)庫中stm32f10x_adc.h 和 stm32f10x_adc.c 里的代碼,修改 stm32f0xx.h 中的 ADC 寄存器結(jié)構(gòu)體即可。
具體步驟如下:
(1) 將 stm32f10x_adc.c 中的代碼復(fù)制到 stm32f0xx_adc.c 中替換原始內(nèi)容,將兩個頭文件聲明改回 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 用戶手冊或者也可以直接參考 STM32F103 的 ADC 配置例程,功能上更加靈活。
E230 的 ADC 設(shè)計相比 STM32F072 更加靈活,在 F072 上 adc 通道只能配置成一個組且轉(zhuǎn)換順序只能按通道號順序來進(jìn)行,在 E103 上 adc 通道可以分為兩個組且順序排號可以自由定義,以下舉例在移植后的程序中如何配置 adc 通道 14 進(jìn)行連續(xù)轉(zhuǎn)換:
5.2 I2C 外設(shè)庫修改
GD32E230C8 和 STM32F030C8 的 I2C 設(shè)計不同,實際和 STM32F103 配置相同,所以移植方式也是和 ADC 一樣,將 STM32F0xx 標(biāo)準(zhǔn)庫中的 stm32f0xx_i2c.h 和 stm32f0xx_i2c.c 文件內(nèi)代碼替換為 STM32F10x 標(biāo)準(zhǔn)庫中 stm32f10x_i2c.h 和 stm32f10x_i2c.c 里的代碼,修改 stm32f0xx.h 中
的 ADC 寄存器結(jié)構(gòu)體即可。具體步驟如下:
(1) 將 stm32f10x_i2c.c 中的代碼復(fù)制到 stm32f0xx_i2c.c 中替換原始內(nèi)容,將兩個頭文件聲明改回 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 用戶手冊或者也可以直接參考 STM32F103 的 I2C 配置例程。
5.3 Flash 外設(shè)庫修改
STM32F030 系列的 Flash 和選項字節(jié)編程是按照 16 位編程的,E230 僅支持 32 位和 64 位編程,所以 Flash 文件中所有操作選項字節(jié)的函數(shù)和 Flash 操作都需要調(diào)整,修改成 32 位操作。此外選項字節(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 中寫選項字節(jié)的函數(shù),原始代碼是直接對 16 位的結(jié)構(gòu)體成員賦值,現(xiàn)將其修改為 32 位操作即可,做如圖 8 兩處改動。其他的所有操作選項字節(jié)函數(shù)都做類似的修改,不在一一進(jìn)行說明。
(3) stm32f0xx 固件庫中有兩個對 Flash 編程的函數(shù)接口:FLASH_ProgramWord 和FLASH_ProgramHalfWord;其中 FLASH_ProgramWord 中連續(xù)寫了兩次 16 位數(shù)據(jù)占滿了 4 個地址,這樣在 E230 上也是可以的,所以 FLASH_ProgramWord 不需要再做修改,當(dāng)然也可以把連續(xù)寫兩次 16 為數(shù)據(jù)的操作改為直接寫 32 位數(shù)據(jù)。如果有調(diào)用 FLASH_ProgramHalfWord 需要修改驅(qū)動改為按字操作,或?qū)υ摵瘮?shù)進(jìn)行一點修改,在對目標(biāo)地址寫入 16 位數(shù)據(jù)后再往后面地址填充一個 0xFFFF,修改內(nèi)容如圖 9。
在進(jìn)行 Flash 編程時需注意,GD32E230 的 Flash 為 4 字節(jié)對齊,在 STM32F030 上可以對偶地址編程,移植到 GD32E230 后 Flash 編程的起始地址必須為 4 的整倍數(shù)!
5.4 pwr.c 進(jìn)入 standby 模式函數(shù)修改
為在 standby 模式下達(dá)到最低功耗,進(jìn)入 standby 前需手動關(guān)閉 HXTAL,如圖 10 在PWR_EnterSTANDBYMode 函數(shù)添加如下紅框代碼:
6. 移植后應(yīng)用注意事項
6.1 while 和 for 循環(huán)
GD32E230 和 STM32F030 工藝、內(nèi)核、Flash 上都有區(qū)別,所以在相同主頻下代碼效率可能會有差異,應(yīng)用中如果有軟件延時需要進(jìn)行調(diào)整、或使用定時器等進(jìn)行精準(zhǔn)延時。
6.2 Flash
需再次強調(diào):在進(jìn)行 Flash 編程時需注意,GD32E230 的 Flash 為 4 字節(jié)對齊,在 STM32F030 上可以對偶地址編程,移植到 GD32E230 后 Flash 編程的起始地址必須為 4 的整倍數(shù)!正常情況編譯器會自動的各類型變量都按 4 字節(jié)對齊方式分配地址,但如果使用了指定地址的方式定義變量,需注意定義地址按 4 字節(jié)對齊地址。
6.3 Flash 和 DMA 操作時序
E230 是 M23 內(nèi)核,和以往 GD 型號的 M3、M4 總線架構(gòu)有區(qū)別,F(xiàn)lash 操作時 DMA 會出現(xiàn)阻塞,當(dāng) Flash 操作(主要是擦除時間比較久,編程操作時間短,每次編程間有間隔)時,最好暫停使用DMA 的外設(shè),特別是 adc,避免 Flash 操作期間請求丟失導(dǎo)致后續(xù)搬運 buff 數(shù)據(jù)錯位。
6.4 功能升級
GD32E230 相比 STM32F030 很多外設(shè)功能有擴(kuò)展升級,但基于 STM32F0xx 的代碼移植過來的應(yīng)用程序沒有新功能 API,若希望發(fā)揮 E230 更多性能建議使用 GD 的官方固件庫進(jìn)行開發(fā)。
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)
-
單片機
+關(guān)注
關(guān)注
6037文章
44558瀏覽量
635213 -
嵌入式
+關(guān)注
關(guān)注
5082文章
19123瀏覽量
305143 -
STM32
+關(guān)注
關(guān)注
2270文章
10900瀏覽量
355980 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5050瀏覽量
97456 -
GD32
+關(guān)注
關(guān)注
7文章
403瀏覽量
24351
發(fā)布評論請先 登錄
相關(guān)推薦
評論