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

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

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

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

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

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ì)比總覽

wKgZombbt8uAHInvAABhm4YCeBw706.png

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

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

wKgZombbt9WAaB-HAAEFP_t2NWk774.png

(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

wKgaombbt_SAfwLqAAC5eIGmWik279.png

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

wKgaombbuA2AcaZxAACOuE-JSPI544.png

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

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 用戶手冊(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)換:

wKgZombbuHqAA-XjAACeEKRr2Lg651.png

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。

wKgZombbuJ2ATd5TAAAtUGhPQVk216.png

(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)行說明。

wKgZombbuK6AfWieAADizSCqraI071.png

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

wKgaombbuM6AYPfXAACtxvSRUJ4120.png

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

wKgaombbuOWALLY2AAC9Byxyj30046.png

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)

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

    評(píng)論

    相關(guān)推薦

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

    應(yīng)用程序移植新的微控制器。本應(yīng)用筆記旨在幫助您快速將應(yīng)用程序 GD32F10x 系列微控制器移植
    的頭像 發(fā)表于 08-30 09:52 ?1201次閱讀
    【<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

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

    STM32F10x系列移植GD32F10x系列電子版

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

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

    GD32移植STM32開發(fā)平臺(tái)
    發(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ā)平臺(tái)

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

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

    AN011 GD32F10x系列移植GD32F30x系列

    AN011 GD32F10x系列移植GD32F30x系列
    發(fā)表于 02-23 18:59 ?2次下載
    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 ?1033次閱讀
    【<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 系列的需求,本文 檔專門針對(duì)既有的 GD32E230 代碼如何移植
    的頭像 發(fā)表于 09-03 10:05 ?401次閱讀
    【<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

    和低成本,所以在存量客戶 中可能會(huì)有越來越多的客戶會(huì)有 GD32F1x0 和 GD32F3x0 移植
    的頭像 發(fā)表于 09-04 09:38 ?141次閱讀
    【<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 版本及以上固件庫(kù)開發(fā)的應(yīng)用程序GD32F10x 系列微控制器移植
    的頭像 發(fā)表于 09-05 09:40 ?163次閱讀
    【<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è)及性能對(duì)比以及 STM32F4xx 移植 GD32F4xx 的移植步驟,旨在讓開發(fā)者能
    的頭像 發(fā)表于 09-06 09:40 ?462次閱讀
    【<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 系列

    對(duì)比、外設(shè)及性能對(duì)比以及 STM32F10x 移植 GD32F30x 的移植步驟,旨在讓開發(fā)
    的頭像 發(fā)表于 09-07 09:57 ?146次閱讀
    【<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>