精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【GD32 MCU 移植教程】3、從 STM32F10x 移植到 GD32E103 的移植說明

聚沃科技 ? 2024-09-01 10:42 ? 次閱讀

1. 前言

對于使用微控制器進行產品開發的設計人員來說,因產品及功能升級,往往需要將一種微控制器替換成另一種微控制器,在保留既有功能的情況下增加新功能。為了更快地推出新產品,設計人員經常要將應用程序移植到新的微控制器。

本應用筆記旨在幫助您快速將應用程序從 STM32F10x 系列微控制器移植到 GD32E103 系列微控制器(基于 STM32F10x 標準庫 V3.5.0)。

GD32E103 和 STM32F10x 系列相比,考慮軟硬件兼容性,從 Flash 和 SRAM 容量,包括外設模塊的增強性能上來看,GD32E103 最接近 STM32F10x 互聯性。

開始前您需要安裝 GD32E103 關于 KEIL 或 IAR 的插件,在工程選項的器件條目中選擇 GD32E103對應型號,添加 GD32E103 的 Flash 下載算法

GD32E103 較 STM32F10x 具有以下優點:

1、更高的主頻(120MHz VS 72MHz)

2、更高版本的內核(Cortex M4 VS M3)

3、更低的功耗(Run Mode:28.6mA@120MHz VS 50mA@72MHz;Sleep Mode:20.8mA@120MHz VS 30mA@72MHz )

但需要注意的是,GD32E103 較 STM32F10x 少了 SDIO 功能,如果用戶使用到 SDIO 功能,從STM32F10x 到 GD32E103 的移植,顯然是不合適的。

2. 引腳兼容性

STM32F10x 與 GD32E103 在相同封裝下是 Pin To Pin 兼容的。但由于外設功能上的細微差別,兩者引腳定義有少許不同,如表 1 所示。注意:STM32F10x 外設編號從 1 開始,GD32E103 外設編號從 0 開始,且命名有差異。

表 1 STM32F10x 系列和 GD32E103 系列引腳區別

wKgaombT0LKAbKLrAAC3yY4rAjo076.pngwKgZombT0LaADCUgAAClEzOz6OU635.pngwKgZombT0LmAcJWRAADDqZOs1YM486.png

3. 內部資源兼容性

下表給出了 STM32F10x 與 GD32E103 的資源對比總覽(以 STM32F103V8、STM32F105V8 和GD32E103V8 對比為例):

表 2 STM32F105 系列和 GD32E103 系列內部資源對比總覽

wKgaombT0M6AbcGHAACM7xq0RNI262.png

4. 程序移植

4.1 時鐘移植

GD32E103 時鐘設置與 STM32F10x 互聯系列兼容,如從 STM32F103 移植到 GD32E103,IDE 需要做相關調整,具體過程如下:

(1) 使用 MDK 環境時:

在工程選項 C/C++選項卡中 Preprocessor Symbol Define 中加入 GD32F10X_CL 的宏定義;在工程選項 Device 中選擇原 MCU 對應的互聯性型號,或對應的 GD32E103 型號。

(2) 使用 IAR 環境時:

在 工 程 選 項 C/C++ Compiler 項 中 Preprocessor 選項卡下 Define Symbol 中加入GD32F10X_CL 的宏定義。

在工程選項 Device 中選擇原 MCU 對應的互聯性型號,或對應的 GD32E103 型號。

4.2 Flash 操作相關軟件移植

4.2.1 FLash 編程操作

STM32F10x 系列 MCU 僅支持 16 位半字編程,而 GD32E103 僅支持 32 位字和 64 位雙字編程,所以需要對 Flash 編程相關庫函數進行更改。

(1) FLASH_ProgramWord 函數

wKgZombT0PKAbe4MAABbvZ4r2Ds074.png

說明:由原來的兩次半字編程改為一次字編程。

(2) FLASH_EnableWriteProtection 函數

wKgZombT0QCAWnhVAAF6MklXwbI281.png

(3) FLASH_ProgramOptionByteData 函數

wKgaombT0Q6AAP7EAAA0BCgCgMI114.png

說明:由原來的半字編程改為字編程,用戶需注意,選項字節需至少一次寫一個字,且目標地址必須是 4 的

整數倍。

(4) FLASH_EraseOptionBytes 函數

wKgZombT0R6AHinsAAEebzlXYJA225.png

(5) FLASH_ReadOutProtection 函數

wKgaombT0TGANF3VAAE5eNnafdA842.png

(6) FLASH_UserOptionByteConfig 函數

wKgZombT0USAHz1cAAEW7Gn1Hg8407.png

注:以上代碼中的 CR_OPTWRE_Set 的定義是 STM32 固件庫中沒有的,需要用戶自行定義為:

#define CR_OPTWRE_Set ((uint32_t)0x00000200)

4.2.2 注意事項

STM32F10x 的互聯型和大容量型(因為 GD32E103 沒有大容量型,所以可不考慮)的 Flash 閃存頁大小為 2K,而 GD32E103 為 1K,所以用戶在調用頁擦除時要注意頁地址范圍。

5. 外設差異性

STM32F10x 與 GD32E103 在外設上基本是兼容的,但 GD32E103 較 STM32F10x 在很多外設上增加了部分功能,用戶可根據以下羅列出的外設差異性選擇是否使用這些功能。

5.1 模數轉換器 ADC

為減輕 CPU 的負擔,GD32E103 較 STM32F10x 增加了片上硬件過采樣單元。它能夠處理多個轉換,并將多個轉換的結果取平均,得出一個 16 位寬的數據。 片上硬件過采樣單元是以降低數據輸出率為代價,換取較高的數據分辨率。 具體功能以及寄存器設置,請用戶參考 GD32E10x 用戶

手冊。

另外,由于兩款芯片的在 ADC 設計上的差異性,在移植到 GD32E103 時,ADC 使能之后,校準之前,需加入 1ms 的延時,以便 ADC 穩定后再進行校準。

5.2 通用同步異步收發器 USART

GD32E103 較 STM32F10x 在 USART 上增加了塊模式(STM32F10x 只支持字節模式)、數據極性設置、數據位反轉以及 TX、RX 引腳電平反轉等功能,因此,GD32E103 多了四個寄存器,分別為:USART_CTL3、USART_RT、USART_STAT1、USART_CHC。具體功能以及寄存器設置,請用戶參考 GD32E10x 用戶手冊。

5.3 內部集成電路總線接口 I2C

GD32E103和STM32F10x的I2C都支持標速(最高100KHz)和快速(最高400KHz),同時GD32E103可支持高速模式(最高 1MHz),要使能高速模式,需將 I2C_FMPCFG 寄存器的 FMPEN 置 1。具體功能以及寄存器設置,請用戶參考 GD32E10x 用戶手冊。

5.4 串行外設接口/片上音頻接口 SPI/I2S

GD32E103 和 STM32F10x 的 SPI/I2S 模塊差異性主要表現在 GD32E103 支持 SPI TI 模式、SPI NSS 脈沖模式和 SPI 四線功能(只有 SPI1),其中 SPI 的四線模式是用于控制四線 SPI Flash 外設,此模式下,數據傳輸速率是普通模式下的 4 倍。具體功能以及寄存器設置,請用戶參考 GD32E10x 用戶手冊。

5.5 通用串行總線全速設備接口 USBFS

GD32E103 和 STM32F105/107 的 USBFS 一致,同時 GD32E103 較 STM32F105/107 相比多了IRC48M 的時鐘源可選擇。具體功能以及寄存器設置,請用戶參考 GD32E103 用戶手冊。

GD32E103 和 STM32F103 的 USB 模塊是不兼容的,如果用戶是從 STM32F103 移植而來,需要進行代碼移植,具體請參考 STM32F103 與 STM32F105/107 的 USB 差異性。

6. 附錄:

(Flash 更改后的程序,用戶可直接復制替換原庫函數)

0、在 stm32f10x_flash.c 中添加

#define CR_OPTWRE_Set ((uint32_t)0x00000200)

1、

FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) { FLASH_Status status = FLASH_COMPLETE; __IO uint32_t tmp = 0; /* Check the parameters */ assert_param(IS_FLASH_ADDRESS(Address)); /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(ProgramTimeout); if(status == FLASH_COMPLETE) { FLASH->CR |= CR_PG_Set; *(__IO uint32_t*)Address = (uint32_t)Data; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(ProgramTimeout); /* Disable the PG Bit */ FLASH->CR &= CR_PG_Reset; } /* Return the Program Status */ return status; }

2、

FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages) { uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF; uint32_t temp1,temp2; FLASH_Status status = FLASH_COMPLETE; /* Check the parameters */ assert_param(IS_FLASH_WRPROT_PAGE(FLASH_Pages)); FLASH_Pages = (uint32_t)(~FLASH_Pages); WRP0_Data = (uint16_t)(FLASH_Pages & WRP0_Mask); WRP1_Data = (uint16_t)((FLASH_Pages & WRP1_Mask) >> 8); WRP2_Data = (uint16_t)((FLASH_Pages & WRP2_Mask) >> 16); WRP3_Data = (uint16_t)((FLASH_Pages & WRP3_Mask) >> 24); temp1 = (((uint32_t)WRP1_Data)<<16) | ((uint32_t)WRP0_Data); temp2 = (((uint32_t)WRP3_Data)<<16) | ((uint32_t)WRP2_Data); /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(ProgramTimeout); if(status == FLASH_COMPLETE) { /* Authorizes the small information block programming */ FLASH->OPTKEYR = FLASH_KEY1; FLASH->OPTKEYR = FLASH_KEY2; while((FLASH->CR&CR_OPTWRE_Set)!=CR_OPTWRE_Set ) {} FLASH->CR |= CR_OPTPG_Set; if(temp1 != 0xFFFF) { //OB->WRP0 = temp1; *(__IO uint32_t*)0X1ffff808=temp1; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(ProgramTimeout); } if((status == FLASH_COMPLETE) && (temp2 != 0xFFFF)) { //OB->WRP1 = temp2; *(__IO uint32_t*)0X1ffff80c=temp2; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(ProgramTimeout); } if(status != FLASH_TIMEOUT) { /* if the program operation is completed, disable the OPTPG Bit */ FLASH->CR &= CR_OPTPG_Reset; } } /* Return the write protection operation Status */ return status; }

3、

FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint32_t Data) { FLASH_Status status = FLASH_COMPLETE; /* Check the parameters */ assert_param(IS_OB_DATA_ADDRESS(Address)); status = FLASH_WaitForLastOperation(ProgramTimeout); if(status == FLASH_COMPLETE) { /* Authorize the small information block programming */ FLASH->OPTKEYR = FLASH_KEY1; FLASH->OPTKEYR = FLASH_KEY2; while((FLASH->CR&CR_OPTWRE_Set)!=CR_OPTWRE_Set ) {} /* Enables the Option Bytes Programming operation */ FLASH->CR |= CR_OPTPG_Set; *(__IO uint32_t*)Address = Data; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(ProgramTimeout); if(status != FLASH_TIMEOUT) { /* if the program operation is completed, disable the OPTPG Bit */ FLASH->CR &= CR_OPTPG_Reset; } } /* Return the Option Byte Data Program Status */ return status; }

4、

FLASH_Status FLASH_EraseOptionBytes(void) { uint16_t temp_spc = RDP_Key; uint32_t temp; FLASH_Status status = FLASH_COMPLETE; /* Get the actual read protection Option Byte value */ if(FLASH_GetReadOutProtectionStatus() != RESET){ temp_spc = 0xbb; } /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(EraseTimeout); if(status == FLASH_COMPLETE){ /* Authorize the small information block programming */ FLASH->OPTKEYR = FLASH_KEY1; FLASH->OPTKEYR = FLASH_KEY2; while((FLASH->CR&CR_OPTWRE_Set)!=CR_OPTWRE_Set ) {} /* if the previous operation is completed, proceed to erase the option bytes */ FLASH->CR |= CR_OPTER_Set; FLASH->CR |= CR_STRT_Set; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(EraseTimeout); if(status == FLASH_COMPLETE) { /* if the erase operation is completed, disable the OPTER Bit */ FLASH->CR &= CR_OPTER_Reset; /* Enable the Option Bytes Programming operation */ FLASH->CR |= CR_OPTPG_Set; /* Restore the last read protection Option Byte value */ // OB->RDP = (uint16_t)rdptmp; temp = ((uint32_t)temp_spc)|0xffff0000; *(__IO uint32_t*)0X1ffff800=temp; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(ProgramTimeout); if(status != FLASH_TIMEOUT) { /* if the program operation is completed, disable the OPTPG Bit */ FLASH->CR &= CR_OPTPG_Reset; } } else{ if (status != FLASH_TIMEOUT){ /* Disable the OPTPG Bit */ FLASH->CR &= CR_OPTPG_Reset; } } } /* Return the erase status */ return status; }

5、

FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState) { uint16_t temp_spc; uint32_t temp; FLASH_Status status = FLASH_COMPLETE; /* Check the parameters */ assert_param(IS_FUNCTIONAL_STATE(NewState)); status = FLASH_WaitForLastOperation(EraseTimeout); if(status == FLASH_COMPLETE) { /* Authorizes the small information block programming */ FLASH->OPTKEYR = FLASH_KEY1; FLASH->OPTKEYR = FLASH_KEY2; while((FLASH->CR&CR_OPTWRE_Set)!=CR_OPTWRE_Set ) {} FLASH->CR |= CR_OPTER_Set; FLASH->CR |= CR_STRT_Set; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(EraseTimeout); if(status == FLASH_COMPLETE) { /* if the erase operation is completed, disable the OPTER Bit */ FLASH->CR &= CR_OPTER_Reset; /* Enable the Option Bytes Programming operation */ FLASH->CR |= CR_OPTPG_Set; if(NewState != DISABLE){ temp_spc = 0xBB; temp = ((uint32_t)temp_spc)|0xffff0000; } else{ temp_spc = (uint16_t)RDP_Key; temp = ((uint32_t)temp_spc)|0xffff0000; } *(__IO uint32_t*)0x1ffff800=temp; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(EraseTimeout); if(status != FLASH_TIMEOUT){ FLASH->CR &= CR_OPTPG_Reset; } } else { if(status != FLASH_TIMEOUT){ /* Disable the OPTER Bit */ FLASH->CR &= CR_OPTER_Reset; } } } /* Return the protection operation Status */ return status; }

6、

FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG,uint16_t OB_STOP, uint16_t OB_STDBY) { FLASH_Status status = FLASH_COMPLETE; uint16_t temp_spc = RDP_Key; uint32_t temp; /* Get the actual read protection Option Byte value */ if(FLASH_GetReadOutProtectionStatus() != RESET) { temp_spc = 0xbb; } /* Check the parameters */ assert_param(IS_OB_IWDG_SOURCE(OB_IWDG)); assert_param(IS_OB_STOP_SOURCE(OB_STOP)); assert_param(IS_OB_STDBY_SOURCE(OB_STDBY)); /* Authorize the small information block programming */ FLASH->OPTKEYR = FLASH_KEY1; FLASH->OPTKEYR = FLASH_KEY2; while((FLASH->CR&CR_OPTWRE_Set)!=CR_OPTWRE_Set ) {} /* if the previous operation is completed, proceed to erase the option bytes */ FLASH->CR |= CR_OPTER_Set; FLASH->CR |= CR_STRT_Set; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(ProgramTimeout); if(status == FLASH_COMPLETE) { /* if the erase operation is completed, disable the OPTER Bit */ FLASH->CR &= CR_OPTER_Reset; /* Enable the Option Bytes Programming operation */ FLASH->CR |= CR_OPTPG_Set; temp =OB_IWDG | (uint16_t)(OB_STOP | (uint16_t)(OB_STDBY | ((uint16_t)0xF8))); temp=temp<<16; temp = ((uint32_t)temp|temp_spc); *(__IO uint32_t*)0x1ffff800=temp; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(ProgramTimeout); if(status != FLASH_TIMEOUT) { /* if the program operation is completed, disable the OPTPG Bit */ FLASH->CR &= CR_OPTPG_Reset; } } /* Return the Option Byte program Status */ return status; }

教程GD32 MCU方案商聚沃科技原創發布,了解更多GD32 MCU教程,關注聚沃科技官網

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6032

    文章

    44525

    瀏覽量

    633245
  • 嵌入式
    +關注

    關注

    5071

    文章

    19026

    瀏覽量

    303492
  • STM32
    +關注

    關注

    2266

    文章

    10876

    瀏覽量

    354922
  • 開發板
    +關注

    關注

    25

    文章

    4959

    瀏覽量

    97213
  • GD32
    +關注

    關注

    7

    文章

    403

    瀏覽量

    24233
收藏 人收藏

    評論

    相關推薦

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

    應用程序移植新的微控制器。本應用筆記旨在幫助您快速將應用程序 GD32F10x 系列微控制器移植
    的頭像 發表于 08-30 09:52 ?1465次閱讀
    【<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'>GD32F10x</b> <b class='flag-5'>移植</b><b class='flag-5'>到</b> <b class='flag-5'>GD32F30x</b>

    STM32F10x系列軟件移植GD32F1x0系列操作說明

    本文檔介紹了STM32F10x系列到GD32F1x0系列軟件移植操作。
    發表于 08-28 16:12 ?54次下載

    STM32F10x系列移植GD32F10x系列電子版

    STM32F10x系列移植GD32F10x系列電子版
    發表于 05-31 09:22 ?0次下載

    GD32移植STM32開發平臺

    GD32移植STM32開發平臺
    發表于 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>開發平臺

    STM32F10x系列移植GD32F10x系列指導文檔

    STM32F10x系列移植GD32F10x系列指導文檔
    發表于 12-03 16:29 ?6次下載

    AN047 GD32E103&C103系列移植GD32F30x系列

    AN047 GD32E103&C103系列移植GD32F30x系列
    發表于 02-23 18:59 ?0次下載
    AN047 <b class='flag-5'>GD32E103</b>&C<b class='flag-5'>103</b>系列<b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>GD32F30x</b>系列

    AN047 GD32E103&C103移植GD32F30x

    兆易創新AN047GD32E103&C103系列移植GD32F30x系列AN047GD32E103&C103系列
    發表于 10-19 17:26 ?3次下載

    AN011 GD32F10x系列移植GD32F30x系列

    兆易創新AN011GD32F10x系列移植GD32F30x系列AN011GD32F10x系列移植
    發表于 10-19 17:26 ?3次下載

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

    GD32E503 系列是 GD 推出的 Cortex_M33 系列產品,該系列資源上與 GD32F303 兼容度非常高,本應用筆記旨在幫助您快速將應用程序
    的頭像 發表于 08-31 09:36 ?1365次閱讀
    【<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 代碼如何移植
    的頭像 發表于 09-03 10:05 ?912次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>移植</b>教程】5、<b class='flag-5'>GD32E</b>230 系列<b class='flag-5'>移植</b><b class='flag-5'>到</b> <b class='flag-5'>GD32F</b>330 系列

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

    和低成本,所以在存量客戶 中可能會有越來越多的客戶會有 GD32F1x0 和 GD32F3x0 移植
    的頭像 發表于 09-04 09:38 ?458次閱讀
    【<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'>GD32F1x</b>0和<b class='flag-5'>GD32F3x</b>0<b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>GD32E</b>230

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

    本應用筆記旨在幫助您快速將基于 GD32F10x 2.0 版本及以上固件庫開發的應用程序GD32F10x 系列微控制器移植
    的頭像 發表于 09-05 09:40 ?425次閱讀
    【<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'>GD32F10x</b> <b class='flag-5'>移植</b><b class='flag-5'>到</b> <b class='flag-5'>GD32E103</b>

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

    、外設及性能對比以及 STM32F4xx 移植 GD32F4xx 的移植步驟,旨在讓開發者能
    的頭像 發表于 09-06 09:40 ?1016次閱讀
    【<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'>GD32F</b>4xx 系

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

    對比、外設及性能對比以及 STM32F10x 移植 GD32F30x移植步驟,旨在讓開發
    的頭像 發表于 09-07 09:57 ?556次閱讀
    【<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'>STM32F10x</b> 系列<b class='flag-5'>移植</b><b class='flag-5'>到</b> <b class='flag-5'>GD32F30x</b> 系列

    GD32 MCU 移植教程】10STM32F030系列移植GD32E230系列

    GD32E230 對比 STM32F030 有著很好的兼容性和更高的性價比,內核和外設都有所增強。本人曾做過產品的 MCU 替換,將基于 STM32F0xx 1.5.0 固件庫的應用程
    的頭像 發表于 09-07 10:24 ?548次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>移植</b>教程】<b class='flag-5'>10</b>、<b class='flag-5'>從</b><b class='flag-5'>STM32F</b>030系列<b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>GD32E</b>230系列