1.前言
對于 STM32F0x0 到 GD32F3x0 的移植,指的是在我們已經修改后的關于 ST 的固件庫中進行替換底層,修改后的 ST 底層庫可以正常的在 GD32F3x0 上運行,本文檔旨在說明 GD32F3x0 和 STM32F030 之間的本質差異,以及在替換完成底層之后,對于 GD32F3x0 和 STM32F0x0 的環境配置、外設操作等一些差異的地方。注意:以下只對比 STM32F030x4/6/8 系列。
2.硬件差異
3.內部資源對比
以上斜杠“/”代表有多種情況,需要根據具體芯片型號區分。
4.軟件環境設置
4.1 使用 Keil 開發 GD32F3x0
目前市面通用的MDK for ARM版本有Keil 4和Keil 5:使用Keil 4建議安裝4.74及以上;使用Keil 5建議安裝5.20以上版本。
4.1.1. 在 Keil4 中添加 GD32F3x0 MCU Device
1. 從MCU官網下載相關的GD32F3x0系列插件MDK-ARM_AddOn_GD32F3x0_V1.0.0.rar。
圖 4-1. GD32F3x0 系列 MCU 型號支持 pack 包名稱(keil4)(圖片僅供參考,以實物為主下同)
2. 雙擊解壓安裝至Keil 4的目錄,一般都會默認選擇,如若同時安裝了Keil 4和Keil 5才需要手動選擇。
圖 4-2. Pack 包安裝示意圖(keil4)
3. 安裝成功后,重新打開Keil 4,則可以在File->Device Database中出現Gigadevice的下拉選項,點擊可以查看到相應的型號。
圖 4-3. Pack 包成功安裝示意圖(keil4)
4. 為了后續debug工作的順利進行,建議檢查一下安裝路徑下是否有下載算法,可以通過如下方式查看:打開一個工程,將型號選為GD32F3x0的型號,然后Options for Target -> Debug ->Settings -> Flash Download-> Add,如果下拉選項中有GD32F3x0的下載算法則完全安裝成功。
圖 4-4. Flash 算法文件選擇示意圖(keil4)
4.1.2. 在 Keil5 中添加 GD32F3x0 MCU Device
1. 從相關網站下載相關的GD32F3x0系列插件Keil.GD32F3x0_DFP.1.1.0.rar。
圖 4-5. GD32 MCU 型號支持 pack 包名稱(keil5)
2. 解壓并安裝至Keil 5的目錄,一般都會默認選擇。
圖 4-6. Pack 包安裝示意圖(keil5)
3. 安裝完后重新打開keil5工程,即可在Device中出現Gigadevice的型號
圖 4-7. Pack 包安裝成功示意圖(keil5)
4. 在Options for Target -> Debug ->Settings ->Flash Download 中添加flash算法,會出現GD32F3X0的算法,即說明安裝成功。根據相應的芯片選擇合適的算法,即可下載仿真。
圖 4-8. Flash 算法文件添加示意圖(keil5)
5. 用Keil 5打開Keil 4工程,如果報找不到器件信息等錯誤,將Keil 4的插件安裝在Keil 5的目錄下,具體操作方式參考Keil 4插件相關內容。
4.2 使用 GD-Link 開發 GD32F3x0
GD32F3x0的開發板自帶GD-link,可以用電路板上的GD-link調試仿真代碼,操作方法如下。
1. 在Options for Target -> Debug 中選擇“CMSIS-DAP Debugger”,部分客戶反饋找不到這一驅動器選項,那是因為MDK版本過低,只有Keil4.74以上的版本和Keil5才支持CMSIS-DAP Debugger選項。
圖 4-9. GD-Link 選擇 Debugger 類型
2. 在Options for Target -> Utilities,也要選擇“CMSIS-DAP Debugger”。
圖 4-10 GD-Link 在 Utilities 中選擇 Debugger 類型
3. 在Options for Target -> Debug ->Settings勾選SWJ、Port選擇 SW。右框IDcode會出現”0xXBAXXXXX”。
圖 4-11. GD-Link 成連接目標板示意圖
4. 在Options for Target -> Debug ->Settings -> Flash Download中添加GD32的flash算法。
圖 4-12. GD-Link 添加 Flash 算法文件示意圖
5. 單擊下圖的快捷方式“debug”,即可使用GD-Link進行仿真。
圖 4-13. GD-Link 仿真示意圖
4.3 使用 J-Link 開發 GD32F3x0
使用J-Link來debug GD MCU,具體配置如下:
1. 在Options for Target -> Debug中選擇“J-LINK/J-Trace Cortex”
圖 4-14. J-Link 在 Keil 中選擇 Debugger 示意圖
2. 在Options for Target -> Debug ->Utilities,也要選擇“J-LINK/J-Trace Cortex”。
圖 4-15. J-Link 在 Utilities 下選擇 Debugger 示意圖
3. 在Options for Target -> Debug ->Settings勾選SWJ,Port選擇 SW。右框IDcode會出現“0xXBAXXXXX”。
圖 4-16. J-Link 成功連接目標板示意圖
4. 在Options for Target -> Debug ->Settings -> Flash Download中添加GD32的flash算法。
圖 4-17. J-Link 在 Keil 下添加 flash 算法文件示意圖
5. 單擊下圖的快捷方式“debug”,即可使用J-Link進行仿真。
圖 4-18. J-Link 成功仿真示意圖
4.4 使用 IAR 開發 GD32F3x0
IAR版本眾多,版本之間的兼容性并不好,如果初次使用建議安裝7.3以上的版本,安裝好IAR以后再根據該文檔來添加GD的器件型號,進行相關的debug工作。
4.4.1. 在 IAR 中添加 GD32F3x0 MCU Device
1. 從相關網站下載相應的GD32F3x0系列插件IAR_GD32F3x0_ADDON.1.0.0.exe:
2. 運行IAR_GD32F3x0_ADDON.1.0.0.exe,單擊start開始安裝插件。
圖 4-19. IAR 中安裝支持 GD32 型號 pack 包示意圖
3. 安裝成功后單擊Finish,結束插件安裝。
圖 4-20. IAR 下 pack 包安裝示意圖
4.4.2. 在 IAR 中編譯調試 GD32F3x0
在上一小節中我們已經添加了GD32F3x0系列的插件,這一小節我們介紹應如何使用它。使用IAR編譯GD的型號,有兩個辦法,一種是使用現有的工程進行修改,還有就是重新建立工程,這里就不細說具體工程應該如何建立,GD的工程建立和別的平臺都一致,建立工程時選擇GD的相應型號。如果沒有安裝GD的插件,可以選擇別的M3廠家型號。
圖 4-21. 在 IAR 下選擇芯片型號示意圖
6.1以后的IAR不需要添加CMSIS文件(core_cm3.c和core_cm3.h),但是需要勾選General Options->Library Configuration的Use CMSIS,如果軟件代碼有使用到printf函數,還需要修改Library為FULL。
圖 4-22. 在 IAR 下添加 CMSIS 文件示意圖
芯片的Link文件建立工程時會默認根據型號選定,但是編譯前還是要有檢查的習慣,檢查一下ICF文件是否有配置,是否正確。
圖 4-23. 在 IAR 下添加 ICF 文件示意圖
配置Debugger->Setup選項,新建立的工程默認是Simulator模擬,如果需要調試那么需要根據實際情況來選擇:
1. 使用GD-Link選擇CMSIS DAP(兼容性不好,不建議在IAR下使用);
2. 使用J-Link選擇J-Link/J-Trace。
圖 4-24. 在 IAR 下選擇 Debugger 示意圖
配置Debugger->Download選項,新建的工程有可能沒有配置download選項,如果我們需要調試代碼那么務必要勾選User flash loader選項,且保證board file準確,否則程序無法正常下載至芯片內部。
圖 4-25. 在 IAR 下配置 flash loader 示意圖
如果選擇了Debugger選項,那么還需要根據Debugger選項設定對應的調試選項;如果選擇的是GD的型號,在IAR下面已經固定將所有的調試接口都配置為SWD接口,可以忽略該選項配置,直接進行相關的代碼debug工作。
5.外設資源地址對比
備注:GD32F350 新增多了比較器(CMP),CEC,DAC,USB,TSI。
6. 外設移植
6.1 System
GD32F3x0 在系統寄存器中新增 Unique device ID (96 bits),代表每一顆獨一無二的芯片
6.1.1 HSE 注意事項
GD32 外部晶體起振時間會比 STM32F030 系列要長,所以原有的晶體超時時間需要加大:
調整前:
#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */
調整后:
#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF) /*!< Time out for HSE start up */
6.1.2 GD32F3x0 Flash 取指零等待,軟件方面注意事項
GD32F3x0 系列 Flash 都為零等待設計,在同主頻下,帶來了更高的性能體驗。如果用戶代碼有用到 for 循環或者是 while 循環語句來做延時,延時時間在 GD32F3x0 系列上會變短,需要適當的加大延時參數或改用 Timer 來做延時函數。
6.1.2 GD32F3x0 上電啟動異常常見原因
1. 檢查板子上 Boot0 引腳是否懸空,GD32F3x0 運行用戶程序必須要求 Boot0 經 10K 電阻接 GND;
2. 如果板子上有大功率器件(Wifi、GSM、GPS 等),檢查大功率器件開啟瞬間 VDD是否存在跌落情況,如存在跌落可以適當加大電源輸出端的負載電容;
3. 觀察芯片的復位管腳,復位管腳是否一直處于拉低狀態,檢查是否供電異常或者是芯片硬件看門狗使能了,芯片處于反復復位狀態。
6.1.3 MCU 無法正常使用 SWD 下載程序
1. 接線異常,SWD 相關的調試口未正常接好;
2. 芯片是否被讀保護或者處于反復復位狀態;
3. SWD 的調試線過長或者是通信速率過高,適當減短 SWD 數據線,同時降低 SWD 速率;
4. 按照硬件指南給 SWD 添加相應的上下拉電阻,提高通信抗干擾能力。
6.2 GPIO 方面問題
完全兼容,無需修改。
6.3 中斷
在中斷管理器 NVIC 中,GD32F3x0 支持搶占式中斷(內核的差別)
寄存器方面存在差別
從上圖可以看出兩者之間的內部設計是不同的,用戶在移植的時候需要注意。如果是使用
我們修改過的基于 ST 庫的代碼,需要注意中斷聲明的名稱和中斷向量表中的匹配即可。
6.4 DMA 模塊
完全相同,無需修改。
6.5 RCC 模塊
不完全相同,對于 GD32F3x0 最高主頻可以到 84M/108M,所以可以提高主頻。
在外設時鐘上,也多了一條時鐘總線
關于 STM32F030 系統框圖
關于 GD32F3x0 系統框圖
6.6 TIMER 模塊
完全相同,無需修改。
6.7 USART 模塊
完全相同,無需修改。
6.8 ADC
不兼容,需要替換底層庫。(PS:提供的關于能夠使用 GD32F3x0 的 ST 庫已經被替換了)GD3x0 ADC 最多支持 16+3 個通道,遠遠高于 ST030 的 10+2 個通道。
需要特別說明的是,雖然同樣只有 1 個 ADC,GD3x0 的 ADC 模塊是和 ST103 的 ADC 模塊是兼容的,ST030 的 ADC 沒有了注入組,并且只有 1 個 ADC 數據寄存器,所以多通道采樣時必須要用 DMA。
而 GD3x0 的 ADC 保持 ST103 的規則組和注入組(最多 4 個)的操作方式,所以可以參照GD32F103 或者 STM32F103 類似操作 ADC。
6.8.1
ADC 采集數據異常問題分析
1. ADC 通道的采集引腳未配置為模擬輸入,GD32 要求通道 IO 口必須配置為模擬輸入;
2. ADC 時鐘過高,ADC 采樣時鐘高于 14M 獲取到的數據不具有參考意義。因此,在實際使用中,應該確保 ADC 時鐘不高于 14MHz;
3. ADC 采樣值偏小或不穩定,應該適當的降低 ADC 時鐘,加大采樣時間。
6.9 IIC
內部集成電路總線接口,寄存器方面存在差別
按照 GD32F103 的外設進行設計,操作方式和 GD32F103 或 STM32F103 類似。
6.10 SPI
GD32F3x0 的 SPI 和 IIS 使用的是同一組寄存器,故寄存器方面存在差別。
6.10.1 SPI 通信 BSY 標志位
在 SPI 程序編寫的過程中,輪詢使用 BSY 作為通信標志位,導致傳送數據丟失或者是錯誤。這主要是因為 GD 的 BSY 標志位不是在寫入 DR 后就置位的,而是發送完第一個 bit 才被置位,傳輸過程中不要使用 BSY 作為每次傳輸的判斷,使用 TXE 和 RXNE 來進行判斷。
6.10.2 SPI 切換時鐘頻率后不能正常收發數據
與 ST 差異:GD32 在切換 SPI 時鐘前要關閉 SPI,切換完成后再使能 SPI。ST 是要切換完成后使能 SPI 即可,不需要先關閉 SPI。
因此,在使用 GDF3x0 的 SPI 時,需在切換 SPI 時鐘前要關閉 SPI,切換完成后再使能 SPI。
6.11 PMU 電源管理
完全兼容,無需修改
6.12 FWDGT
完全兼容,無需修改
6.13 Flash 方面問題
完全兼容,無需修改。
如果操作 Flash 使 用 的 是 庫 函 數 , 因 為 我 們 提 供 的 庫 stm32f0xx_flash.h 和stm32f0xx_flash.c 中已經把二者有差異的地方改過了,所以操作 Flash 無需修改。但是GD330 的 Flash 的頁擦除和編程時間要稍長于 ST030,但是 GD32F3x0 flash 的代碼段處于零等待區域,再加上同樣跑 84/108M,GD3x0 的代碼執行效率高于 ST030。
6.13.1 Flash 操作地址問題
寫 Flash,必須采用絕對地址,也就是 0x08000000 為首地址。而對于讀操作,既可以使用絕對地址,也可以用相對地址 0x00000000。
7.舉例:以使用 EXTI+SPI 為例
0. 打開基于 STM32F030 的固件庫,打開運行環境
原有的工程項目可能是 keil4 建立的,直接在 keil4 工程后綴名添加 x,即變成 keil5 項目;
1.在 keil 環境下,只需要安裝 GD32F3x0 的固件包,可以到官網下載相應的固件包插件。
2.固件庫軟件移植步驟(以 GD32F350 為例子)
3.選擇 GD32F350 設備型號
在修改型號完成之后,進行編譯-這個時候是編譯通過的。
4.經過上面的對比,以 EXTI 移植為例:
先介紹 GD32 現有的庫,主要分為兩大類型的庫,一個使用 struct 進行包裝給客戶使用的庫,另一種方式是使用寄存器直接賦值的方式。這次重點是使用結構體的固件庫版本。
先進行寄存器直接的對比:左邊是 GD32F3x0 的寄存器,右邊是 STM32F030 寄存器
EXTI 寄存器:
SPI 寄存器:
可以看出 SPI 上的寄存器差別很大,GD32F3x0 的 SPI 中含有 IIS 相關的寄存器,所以就函數內部庫來說,差別會更大的。
函數庫的內部函數:
左邊為基于 ST 庫修改適用于 GD32F3x0 ,右邊為 GD 官方提供的庫(下同)
可以看出內部的庫是不一樣的,GD32F3x0 是 M4 內核,可以支持中斷分組,而 STM32F030 是不支持的。
函數配置方面:
關于 SPI,GD 的命名規則是 SPI0、SPI1、SPI2,而在使用 ST 的庫時候為 SPI1、SPI2、SPI3。
以下的代碼是直接從 ST 的庫案例代碼直接復制過來,可以直接使用(在修改過的庫上)
而在函數配置方面,也可能有一些差別,從上圖可以看出來,但是函數名稱基本是一樣的,從上圖可以看出來,在函數配置結構方面,可能有一些差別,但是函數名稱基本是一樣的。因為時間效率的關系,我們不建議客戶自己將 ST 庫移植到 GD 芯片上,可是聯系我們提供現成的移植好的庫。
8.關于 GD32F3x0 和 F1x0 和 STM32F030 的關系
對于 GD32F3x0 是完全兼容 GD32F1x0 系列的,GD32F3x0 是在 GD32F1x0 上做了一些外設升級和優化,
所以對于 GD32F3x0 和 STM32F030 之間的差別,基本就是 GD32F1x0 和 GD32F3x0 之間的差別。
-
單片機
+關注
關注
6032文章
44525瀏覽量
633245 -
嵌入式
+關注
關注
5071文章
19026瀏覽量
303492 -
STM32
+關注
關注
2266文章
10876瀏覽量
354922 -
移植
+關注
關注
1文章
377瀏覽量
28111 -
GD32
+關注
關注
7文章
403瀏覽量
24233
發布評論請先 登錄
相關推薦
評論