1.本文簡介
GD32F30x 系列 MCU 是基于 Arm? Cortex?-M4 處理器的 32 位通用微控制器,與 STM32F10x 系列 MCU 保持高度兼容。本文主要從以下三個方面進行介紹:硬件資源對比、外設及性能對比以及從 STM32F10x 移植到 GD32F30x 的移植步驟,旨在讓開發者能夠快速從 STM32F10x 移植到 GD32F30x,縮短研發周期,加快產品開發進度。
2.GD32F30x vs STM32F10x 硬件資源對比
GD32F30x 和 STM32F10x 硬件引腳對比如表 2-1. GD32F30x 和 STM32F10xpin 對比所示,由該表可知,GD32F30x 與 STM32F10x 完全硬件兼容。
表 2-1. GD32F30x 和 STM32F10x pin 對比
3.GD32F30x vs STM32F10x 外設及性能對比
GD32F30x 外設資源較豐富,可實現對 STM32F10x 外設資源的覆蓋。其中GD32F303 對應 STM32F103,GD32F305 對應 STM32F105,GD32F307 對應STM32F107。具體系統及外設資源對比如表 3-1. GD32F30x 和 STM32F10x 系統及外設資源對比所示。
4.從 STM32F10x 到 GD32F30x 系列移植步驟
4.1.集成開發環境選型及工程配置
4.1.1.使用 Keil 開發 GD32F30x
目前市面通用的 MDK for Arm?版本有 Keil4 和 Keil5,使用 Keil4 建議安裝 4.74及以上,使用 Keil5 建議安裝 5.20 以上版本。
4.1.2.在 Keil4 中添加 GD32F30x MCU
1. 從 MCU 官 網 或 網 盤 下 載 相 關 的 GD32F30x 系 列 插 件 MDKARM_AddOn_GD32F30x_V1.0.0.rar。
圖 4-1. GD32F30x 系列 MCU 型號支持 pack 包名稱(Keil4)
2. 雙擊解壓安裝至Keil4的目錄,一般都會默認選擇,如若同時安裝了Keil4和Keil5才需要手動選擇。
圖 4-2. Pack 包安裝示意圖(Keil4)
3. 安裝成功后,重新打開Keil4,則可以在File->Device Database中出現GigaDevice的下拉選項,點擊可以查看到相應的型號。
圖 4-3. Pack 包成功安裝示意圖(Keil4)
4. 為了后續debug工作的順利進行,建議檢查一下安裝路徑下是否有下載算法,可以通過如下方式查看:打開一個工程,將型號選為GD32F30x的型號,然后Options for Target -> Debug ->Settings -> Flash Download-> Add,如果下拉選項中有GD32F30x的下載算法則完全安裝成功。
圖 4-4. Flash 算法文件選擇示意圖(Keil4)
4.1.3.在 Keil5 中添加 GD32F30x MCU
1. 從相關網站下載相關的GD32F30x系列插件Keil.GD32F30x_DFP.1.1.0.rar。
圖 4-5. GD32 MCU 型號支持 pack 包名稱(Keil5)
2. 解壓并安裝至Keil5的目錄,一般都會默認選擇。
圖 4-6. Pack 包安裝示意圖(Keil5)
3. 安裝完后重新打開Keil5工程,即可在Device->Database中出現GigaDevice的型號。
圖 4-7. Pack 包安裝成功示意圖(Keil5)
4. 在Options for Target -> Debug ->Settings ->Flash Download 中添加flash算法,會出現GD32F30x的算法,即說明安裝成功。根據相應的芯片選擇合適的算法,即可下載仿真。
圖 4-8. Flash 算法文件添加示意圖(Keil5)
5. 用Keil5打開Keil4工程,如果報找不到器件信息等錯誤,將Keil4的插件安裝在Keil5的目錄下,具體操作方式參考Keil4插件相關內容。
4.1.4.MDK 使用常見問題解答
1. Keil4打開Keil5工程
如果沒有安裝Keil5,也是能夠使用Keil4來編譯Keil5的工程,具體做法就是修改工程的后綴名,將Keil5工程的后綴名xxxx.uvprojx修改為xxxx.uvproj,即可使用Keil4來查看編譯了。
2. Keil5打開Keil4工程
如果使用Keil5打開Keil4工程,打開時會遇到找不到MCU器件的情況,這種可以直接將Keil4工程的后綴名xxxx.uvproj修改為xxxx.uvprojx,即可正常使用Keil5來查看編譯了。
3. GigaDevice.GD32F30x_DFP.pack特性
1. 支持在線安裝方式;
2. 支持本地安裝方式;
3. 自動生成GD32F30x系列MCU列表及對應的特征信息;
4. 自動匹配所選芯片對應的Flash算法;
5. 支持用戶在Debug模式下查看寄存器狀態;
6. 利用Books選項卡獲取文檔資料。
4. Pack包對Keil版本要求
Pack包適用于Keil5.15及以上版本,對于Keil5.13和5.14版本,有如下兩個問題:
1. Debug模式下無法調用SVD文件查看寄存器狀態;
2. 對Pack進行Schema check會報錯。
5. Keil5打開Keil4工程,編譯報錯
圖 4-9. 編譯錯誤示意圖
錯誤原因是core_cmInstr.h文件的路徑在Keil5和Keil4中不同,可在Option forTarget的C/C++中添加core_cmInstr.h的文件路徑,如圖4-10所示:
圖 4-10. 文件路徑添加示意圖
4.1.5.使用 GD-LINK 開發 GD32F30x
GD32F30x的開發板自帶GD-LINK,可以用電路板上的GD-LINK調試仿真代碼,操作方法如下。
1. 在Options for Target -> Debug 中選擇“CMSIS-DAP Debugger”,部分客戶反饋找不到這一驅動器選項,那是因為MDK版本過低,只有Keil4.74以上的版本和Keil5才支持CMSIS-DAP Debugger選項。
圖 4-11. GD-LINK 選擇 Debugger 類型
2. 在Options for Target -> Utilities,也要選擇“CMSIS-DAP Debugger”。
圖 4-12. GD-LINK 在 Utilities 中選擇 Debugger 類型
3. 在Options for Target -> Debug ->Settings勾選SWJ、Port選擇 SW。右框IDcode會出現”0xXBAXXXXX”。
圖 4-13. GD-LINK 成連接目標板示意圖
4. 在Options for Target -> Debug ->Settings -> Flash Download中添加GD32的flash算法。
圖 4-14. GD-LINK 添加 Flash 算法文件示意圖
5. 單擊下圖的快捷方式“debug”,即可使用GD-LINK進行仿真。
圖 4-15. GD-LINK 仿真示意圖
4.1.6.使用 J-Link 開發 GD32F30x
使用J-Link來debug GD MCU,具體配置如下:
1. 在Options for Target -> Debug中選擇“J-LINK/J-Trace Cortex”。
圖 4-16. J-Link 在 Keil 中選擇 Debugger 示意圖
2. 在Options for Target -> Debug ->Utilities,也要選擇“J-LINK/J-Trace Cortex”。
圖 4-17. J-Link 在 Utilities 下選擇 Debugger 示意圖
3. 在Options for Target -> Debug ->Settings勾選SWJ,Port選擇 SW。右框IDcode會出現“0xXBAXXXXX”。
圖 4-18. J-Link 成功連接目標板示意圖
4. 在Options for Target -> Debug ->Settings -> Flash Download中添加GD32的flash算法。
圖 4-19. J-Link 在 Keil 下添加 flash 算法文件示意圖
5. 單擊下圖的快捷方式“debug”,即可使用J-Link進行仿真。
圖 4-20. J-Link 成功仿真示意圖
4.1.7.使用 IAR 開發 GD32F30x
IAR版本眾多,版本之間的兼容性并不好,如果初次使用建議安裝7.3以上的版本,安裝好IAR以后再根據該文檔來添加GD的器件型號,進行相關的debug工作。
4.1.8.在 IAR 中添加 GD32F30x MCU Device
1. 從 相 關 網 站 下 載 相 應 的 GD32F30x 系 列 插 件IAR_GD32F30x_ADDON.1.0.0.exe:
2. 運行IAR_GD32F30x_ADDON.1.0.0.exe,單擊start開始安裝插件。
圖 4-21. IAR 中安裝支持 GD32 型號 pack 包示意圖
3. 安裝成功后單擊Finish,結束插件安裝。
圖 4-22. IAR 下 pack 包安裝示意圖
4.1.9.在 IAR 中編譯調試 GD32F30x
在上一小節中我們已經添加了GD32F30x系列的插件,這一小節我們介紹應如何使用它。
使用IAR編譯GD的型號,有兩個辦法,一種是使用現有的工程進行修改,還有就是重新建立工程,這里就不細說具體工程應該如何建立,GD的工程建立和別的平臺都一致,建立工程時選擇GD的相應型號。如果沒有安裝GD的插件,可以選擇別的M3廠家型號。
圖 4-23. 在 IAR 下選擇芯片型號示意圖
6.1以后的IAR不需要添加CMSIS文件(core_cm4.c和core_cm4.h),但是需要勾選General Options->Library Configuration的Use CMSIS,如果軟件代碼有使用到printf函數,還需要修改Library為FULL。
圖 4-24. 在 IAR 下添加 CMSIS 文件示意圖
芯片的Link文件建立工程時會默認根據型號選定,但是編譯前還是要有檢查的習慣,檢查一下ICF文件是否有配置,是否正確。
圖 4-25. 在 IAR 下添加 ICF 文件示意圖
配置Debugger->Setup選項,新建立的工程默認是Simulator模擬,如果需要調試那么需要根據實際情況來選擇:
1. 使用GD-LINK選擇CMSIS DAP(兼容性不好,不建議在IAR下使用);
2. 使用J-Link選擇J-Link/J-Trace。
圖 4-26. 在 IAR 下選擇 Debugger 示意圖
配置Debugger->Download選項,新建的工程有可能沒有配置download選項,如果我們需要調試代碼那么務必要勾選User flash loader選項,且保證board file準確,否則程序無法正常下載至芯片內部。
圖 4-27. 在 IAR 下配置 flash loader 示意圖
如果選擇了Debugger選項,那么還需要根據Debugger選項設定對應的調試選項;如果選擇的是GD的型號,在IAR下面已經固定將所有的調試接口都配置為SWD接口,可以忽略該選項配置,直接進行相關的代碼debug工作。
4.2.System 模塊使用注意事項
4.2.1.HXTAL 時鐘丟失后,程序如何運行
程序使用外部晶振正常運行之后,如果將外部晶振去掉或者短路,GD32F30x 的程序不會取指執行。若將晶振重新恢復正常,程序會接著之前的地址運行,如果程序對丟時鐘這種場景有特殊要求,應用中需要手動使能時鐘安全系統,在其中做相關的保護措施。
4.2.2.如何區分 standby 復位和上電復位
僅通過 RCU 的 RCU_RSTSCK 寄存器無法區分是 standby 復位還是上電復位,需要結合查詢 PMU 的 PMU_CS 寄存器解決問題。
4.2.3.HSE 注意事項
GD32F30x 外部晶體起振時間會比 STM32F10x 系列要長,所以原有的晶體超時時間需要加大:
調整前:
調整后:
4.2.4.如何通過軟件區分 GD32 和 STM32
GD32F30x 在設計階段,已經預留了相關寄存器,用戶只需要軟件讀取寄存器,即可獲取到相關的型號信息,GD32F30x 每個型號此處值都為固定值。
Code_Num=*( uint32_t *)( 0x40022100 );
4.2.5.GD32F30x Flash 取值零等待,軟件方面注意事項
GD32F30x 系列 Flash 為零等待設計,在同主頻下,帶來了更高的性能體驗。如果用戶代碼有用到 for 循環或者是 while 循環語句來做延時,延時時間在GD32F30x系列上會變短,需要適當的加大延時參數或改用Timer來做延時函數。
4.2.6.GD32F30x 上電啟動異常常見原因
1. 檢查板子上 Boot 0 引腳是否懸空,GD32F30x 運行用戶程序必須要求 Boot0經 10K 電阻接 GND;
2. 如果板子上有大功率器件(Wifi、GSM、GPS 等),檢查大功率器件開啟瞬間
VDD 是否存在跌落情況,如存在跌落可以適當加大電源輸出端的負載電容;
3. 觀察芯片的復位管腳,復位管腳是否一直處于拉低狀態,檢查是否供電異常
或者是芯片硬件看門狗使能了,芯片處于反復復位狀態。
4.2.7.MCU 無法正常使用 SWD 下載程序
1. 接線異常,SWD 相關的調試口未正常接好;
2. 芯片是否被讀保護或者處于反復復位狀態;
3. SWD 的調試線過長或者是通信速率過高,適當減短 SWD 數據線,同時降低SWD 速率;
4. 按照硬件指南給 SWD 添加相應的上下拉電阻,提高通信抗干擾能力。
4.2.8.MCU 上電時間較長
由于設計架構差異,GD32F30x 比 STM32F10x 的上電時間和 Standby 喚醒時間較長,時間約 144ms,若對時間沒有要求,可忽略。
4.2.9.代碼超過 256K 后執行速度慢
GD32F30x 系列的 Flash 分為 Code 區(前 256K)和 Data 區(256K 以后的區域),二者在擦寫操作上沒有區別,但是讀操作時間上存在較大差別,Code 區代碼取值零等待,Data 區執行代碼會有較長延時。應用中如果涉及該架構影響到使用可以通過分散加載來改善,具體做法參考分散加載應用文檔。
4.3.CAN 模塊使用注意事項
4.3.1.CAN 發送出現 ACK 錯誤
假如出現類似 ACK 出錯的問題,可以修改采樣點,一般做法是將 BS1 值增大,BS2 減小。
4.3.2.CAN 接收異常,接收兩幀數據會丟一包數據
STM32 固件庫會調用 CAN_FIFORelease 函數,如果手動多調用一次清緩存的動作會導致 CAN 接收丟包,也就是軟件中無需主動調用 CAN_FIFORelease 函數,CAN FIFO 會被自動釋放。
4.4.低功耗注意事項
4.4.1.在 Stop 模式下,少數芯片功耗偏高
為了使功耗恢復正常,需要將沒用到的 IO 口全部配置成模擬輸入(AN)模式,芯片內部未引出來的也要配置。
4.4.2.在 Stop 模式下,概率性不能喚醒
在不斷進出 Stop,并且不斷有 timer 或者 systick 中斷時,運行很長時間后,在 Stop模式下有概率性的無法喚醒。
解決方案:
當進入 Stop 時(WFI/WFE),屏蔽掉除喚醒源中斷外的所有中斷,出 Stop 之后再打開其他中斷,代碼修改如下。
4.5.ADC 模塊使用注意事項
4.5.1.ADC 采集數據異常問題分析
1. ADC 通道的采集引腳未配置為模擬輸入,GD32 要求通道 IO 口必須配置為模擬輸入;
2. ADC 時鐘過高,ADC 采樣時鐘高于 40M 獲取到的數據不具有參考意義;
3. ADC 不耐 5V 的 IO 口被接入超過 VDDA 的電平信號;
4. ADC 采樣值偏小或不穩定,應該適當的降低 ADC 時鐘,加大采樣周期的值。
4.5.2.ADC1 和 ADC2 同步模式下,注意事項
如果 ADC1 和 ADC2 同步采集,ADC2 是跟著 ADC1 同步觸發,此時 ADC2 的注入組的觸發方式需要手動配置成軟件觸發(默認是 TIMER1_TRGO),否則可能導致 ADC 注入組無數據。
4.5.3.ADC_CR2 中的 ADCON 使用注意事項
ADC 使能以后需要在代碼里面插入 1 個通道的 ADC 轉換周期以上;
4.5.4.ADC 查詢法采集數據,出現通道錯亂的情況
ADC 使用查詢法采集數據時,如果使能了 ADC 的 SCAN 模式,就有可能會出現ADC 數據錯亂的情況;ADC 采集通道 SCAN 功能只適用于多通道注入采樣和DMA 模式。
4.5.5.ADC 在每次復位之后采樣值有偏差
由于 MCU 上電或者復位階段,ADC 校準時,電源不穩定,導致校準時出現偏差,ADC 值采樣均出現偏大或者偏小,可以關閉校準,或者等電源穩定后再校準解決該問題。
4.6.RCU 模塊使用注意事項
當 IAP 時,使用 GD32 的固件作為 boot,跳轉到 STM32 固件庫的 APP 后,可能造成系統時鐘不對,例如 uart 打印異常,timer 異常。
GD32F30x 系列 MCU 最高主頻可以運行 120MHz,PLL 倍頻參數比 STM32 的多幾個 bit,如下,出現異常時,需要跳轉前將相關的 bit 復位。
GD32 的 CFG0 寄存器的 bit30 bit28 bit27 為有效位。
STM32 的 RCC_CFGR 寄存器的 bit30 bit28 bit27 為保留位。
4.7.SPI 模塊使用注意事項
4.7.1.SPI 通信 BSY 標志位
在 SPI 程序編寫的過程中,輪詢使用 BSY 作為通信標志位,導致傳送數據丟失或者是錯誤。
這主要是因為 GD32 的 BSY 標志位不是在寫入 DR 后就置位的,而是發送完第一個 bit 才被置位,傳輸過程中不要使用 BSY 作為每次傳輸的判斷,使用 TXE 和RXNE 來進行判斷。
4.7.2.SPI 使能之后配置參數不生效
當需要修改 SPI 模式或者速度的時候,需要將 SPI 先 disable,再修改參數,最后再 enable.
4.7.3.SPI 從機模式管腳模式
從機模式下 CLK、MISO、NSS 需要將 IO 配置成 Input_floating,才能正常工作。
4.8.UART 模塊使用注意事項
4.8.1.UART DMA 注意事項
使用 UART DMA 發送數據的時候,可能丟掉一幀中的第一個 byte 數據,注意盡量不要在發送的時候頻繁的開關 UART 發送,若測試無問題,可以忽略。
usart_transmit_config(USARTx,USART_TRANSMIT_ENABLE)假如要關閉 UART 發送,需要按照以下流程:
先開啟 usart_transmit_ enable 再去打開 dma_channel_enable,如下圖。
4.9.RTC 模塊使用注意事項
4.9.1.LSE 驅動模式
GD32 MCU 的 RTC 驅動能力分四檔,默認是強驅動能力,若不使用 GD32 本身的固件庫,可能會強驅動改成弱驅模式,造成部分機器不起振,則需要將寄存器RCU_BDCTL 的 LXTALDRI[1:0]配置成 11
4.10.USB 模塊使用注意事項
USBD 通訊假如出現 PMOUIF 和 ERRIF 錯誤,可以通過屏蔽 CNTR_ESOFM 標志來解決該問題。
4.11.Flash 模塊使用注意事項
4.11.1.Flash 擦寫差異
GD32 MCU Flash 執行速度快,但是寫操作慢,所以在對 Flash 操作的時候需要修改下面幾個函數:
4.11.2.Flash 操作地址差異
寫 Flash,必須采用絕對地址,也就是 0x08000000 為首地址。而對于讀操作,既可以使用絕對地址,也可以用相對地址 0x00000000。
-
單片機
+關注
關注
6032文章
44514瀏覽量
632941 -
嵌入式
+關注
關注
5068文章
19014瀏覽量
303226 -
STM32
+關注
關注
2266文章
10871瀏覽量
354786 -
開發板
+關注
關注
25文章
4943瀏覽量
97188 -
GD32
+關注
關注
7文章
403瀏覽量
24218
發布評論請先 登錄
相關推薦
評論