0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【GD32 MCU 移植教程】10、從STM32F030系列移植到GD32E230系列

聚沃科技 ? 2024-09-07 10:24 ? 次閱讀

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 周期除法)

4、ADC 時鐘更高(28MHz VS 14MHz)

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)部資源對比總覽

wKgZombbt8uAHInvAABhm4YCeBw706.png

(2)在外設(shè)邏輯地址上 GD32E230C8 和 STM32F030C8 也是相同的,如下表 2。

表 2 STM32F030C8 系列和 GD32E230C8 系列外設(shè)基地址對比

wKgZombbt9WAaB-HAAEFP_t2NWk774.png

(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

wKgaombbt_SAfwLqAAC5eIGmWik279.png

(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)容所示。

wKgaombbuA2AcaZxAACOuE-JSPI544.png

(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。

wKgZombbuDmAcrFuAACAajPqN_g692.png

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

wKgaombbuEeAO1Q3AADdbYhJvc0999.png

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

wKgaombbuFKAWNRhAABK2EIUStc166.png

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

wKgZombbuGOAN4tgAAEyFk6wFOM850.png

至此 ADC 外設(shè)的底層文件就移植完成,配置方法可參考 GD32E230 用戶手冊或者也可以直接參考 STM32F103 的 ADC 配置例程,功能上更加靈活。

E230 的 ADC 設(shè)計相比 STM32F072 更加靈活,在 F072 上 adc 通道只能配置成一個組且轉(zhuǎn)換順序只能按通道號順序來進(jìn)行,在 E103 上 adc 通道可以分為兩個組且順序排號可以自由定義,以下舉例在移植后的程序中如何配置 adc 通道 14 進(jìn)行連續(xù)轉(zhuǎn)換:

wKgZombbuHqAA-XjAACeEKRr2Lg651.png

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。

wKgZombbuJ2ATd5TAAAtUGhPQVk216.png

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

wKgZombbuK6AfWieAADizSCqraI071.png

(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。

wKgaombbuM6AYPfXAACtxvSRUJ4120.png

在進(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ù)添加如下紅框代碼:

wKgaombbuOWALLY2AAC9Byxyj30046.png

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)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關(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
收藏 人收藏

    評論

    相關(guān)推薦

    GD32 MCU 移植教程】1、 GD32F10x 移植 GD32F30x

    應(yīng)用程序移植新的微控制器。本應(yīng)用筆記旨在幫助您快速將應(yīng)用程序 GD32F10x 系列微控制器移植
    的頭像 發(fā)表于 08-30 09:52 ?1566次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>移植</b>教程】1、<b class='flag-5'>從</b> <b class='flag-5'>GD32F10</b>x <b class='flag-5'>移植</b><b class='flag-5'>到</b> <b class='flag-5'>GD32F</b>30x

    gd32e230 flash 模擬eeprom

    請問有沒有gd32e230 flash 模擬eeprom例程。我有一個stm32移植gd32
    發(fā)表于 09-03 07:36

    STM32F10x系列移植GD32F10x系列電子版

    STM32F10x系列移植GD32F10x系列
    發(fā)表于 05-31 09:22 ?0次下載

    GD32移植STM32開發(fā)平臺

    GD32移植STM32開發(fā)平臺
    發(fā)表于 12-02 14:51 ?28次下載
    <b class='flag-5'>GD32</b><b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>STM32</b>開發(fā)平臺

    STM32F10x系列移植GD32F10x系列指導(dǎo)文檔

    STM32F10x系列移植GD32F10x系列
    發(fā)表于 12-03 16:29 ?7次下載

    AN011 GD32F10x系列移植GD32F30x系列

    AN011 GD32F10x系列移植GD32F30x系列
    發(fā)表于 02-23 18:59 ?3次下載
    AN011 <b class='flag-5'>GD32F10</b>x<b class='flag-5'>系列</b><b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>GD32F</b>30x<b class='flag-5'>系列</b>

    AN047 GD32E103&C103系列移植GD32F30x系列

    AN047 GD32E103&C103系列移植GD32F30x系列
    發(fā)表于 02-23 18:59 ?0次下載
    AN047 <b class='flag-5'>GD32E</b>103&C103<b class='flag-5'>系列</b><b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>GD32F</b>30x<b class='flag-5'>系列</b>

    AN046 GD32E230系列移植GD32F3x0系列

    AN046 GD32E230系列移植GD32F3x0系列
    發(fā)表于 02-23 19:00 ?0次下載
    AN046 <b class='flag-5'>GD32E230</b><b class='flag-5'>系列</b><b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>GD32F</b>3x0<b class='flag-5'>系列</b>

    AN011 GD32F10x系列移植GD32F30x系列

    兆易創(chuàng)新AN011GD32F10x系列移植GD32F30x系列AN011
    發(fā)表于 10-19 17:26 ?3次下載

    GD32 MCU 移植教程】2、 GD32F303 移植 GD32F503

    GD32E503 系列GD 推出的 Cortex_M33 系列產(chǎn)品,該系列資源上與 GD32F
    的頭像 發(fā)表于 08-31 09:36 ?1472次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>移植</b>教程】2、<b class='flag-5'>從</b> <b class='flag-5'>GD32F</b>303 <b class='flag-5'>移植</b><b class='flag-5'>到</b> <b class='flag-5'>GD32F</b>503

    GD32 MCU 移植教程】5、GD32E230 系列移植 GD32F330 系列

    移植 GD32F330 系列的需求,本文 檔專門針對既有的 GD32E230 代碼如何移植
    的頭像 發(fā)表于 09-03 10:05 ?1125次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>移植</b>教程】5、<b class='flag-5'>GD32E230</b> <b class='flag-5'>系列</b><b class='flag-5'>移植</b><b class='flag-5'>到</b> <b class='flag-5'>GD32F</b>330 <b class='flag-5'>系列</b>

    GD32 MCU 移植教程】6、GD32F1x0和GD32F3x0移植GD32E230

    和低成本,所以在存量客戶 中可能會有越來越多的客戶會有 GD32F1x0 和 GD32F3x0 移植
    的頭像 發(fā)表于 09-04 09:38 ?576次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>移植</b>教程】6、<b class='flag-5'>從</b><b class='flag-5'>GD32F</b>1x0和<b class='flag-5'>GD32F</b>3x0<b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>GD32E230</b>

    GD32 MCU 移植教程】7、 GD32F10x 移植 GD32E103

    本應(yīng)用筆記旨在幫助您快速將基于 GD32F10x 2.0 版本及以上固件庫開發(fā)的應(yīng)用程序GD32F10x 系列微控制器移植
    的頭像 發(fā)表于 09-05 09:40 ?514次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>移植</b>教程】7、<b class='flag-5'>從</b> <b class='flag-5'>GD32F10</b>x <b class='flag-5'>移植</b><b class='flag-5'>到</b> <b class='flag-5'>GD32E</b>103

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

    、外設(shè)及性能對比以及 STM32F4xx 移植 GD32F4xx 的移植步驟,旨在讓開發(fā)者能
    的頭像 發(fā)表于 09-06 09:40 ?1290次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>移植</b>教程】8、<b class='flag-5'>從</b> <b class='flag-5'>STM32F</b>4xx <b class='flag-5'>系列</b><b class='flag-5'>移植</b><b class='flag-5'>到</b> <b class='flag-5'>GD32F</b>4xx 系

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

    對比、外設(shè)及性能對比以及 STM32F10x 移植 GD32F30x 的移植步驟,旨在讓開發(fā)
    的頭像 發(fā)表于 09-07 09:57 ?715次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>移植</b>教程】9、<b class='flag-5'>從</b> <b class='flag-5'>STM32F10</b>x <b class='flag-5'>系列</b><b class='flag-5'>移植</b><b class='flag-5'>到</b> <b class='flag-5'>GD32F</b>30x <b class='flag-5'>系列</b>