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