前言
這一份文檔是STM32duino的github的wiki裏面所包含的教程,目前這一個項目支持的板子(他們叫做varient,變體)還很少,所以就有了這樣一個自己添加板子的教程。
正文
Frederic Pillon 在6月12日的時候編輯了這一個頁面 · 23 revisions
此文檔中顯示了以下所有步驟的示例: Add Nucleo-F207ZG (無視最後兩項)
自從此PR創建以來,已經做了一些改進。
- 不需要定義CMSIS啓動文件,因爲它們現在都是在覈心中定義的。 See #70
- 現在可以定義自定義的啓動文件了(startup file). #353
- 在
variant.h
.中使用define而不是enum來定義引腳 詳情見 #356 - 不需要做更多對STM32 HAL 庫的配置了. See #518
創建一個新的板子
到STM32 core的variant' 文件夾下
可以參考這一個頁面: Where are sources
1 - 建立一個stm32/variants/board_template 文件夾的新的拷貝,你可以隨便命名它
舉個例子: 添加一塊 Nucleo-F207ZG
cp -a board_template NUCLEO_F207ZG
(linux)
也可以複製最相似的板子的文件
2 - 添加引腳映射
適用於所有STM32 MCU的STM32工具包還有PeripheralPins.c
文件和PinNamesVar.h
文件都已提供了,你可在這裏獲得你想要的資料: Arduino_Tools/genpinmap/Arduino
也可以手動生成它們,請參見genpinmap。
將PeripheralPins.c和PinNamesVar.h文件複製到創建的板子文件夾中。
genpinmap/Arduino/STM32F207Z(C-E-F-G)Tx/PeripheralPins.c
和
genpinmap/Arduino/STM32F207Z(C-E-F-G)Tx/PinNamesVar.h
放在
variant/NUCLEO_F207ZG/
文件夾裏面
3 預覽引腳映射
添加PeripheralPins.c之後,請仔細檢查。
如果針對相同的IP多次生成了引腳,則註釋一行
如果不使用該引腳(例如,在板上屏蔽掉一些硬件)
你可以使用相關的用戶手冊來定義最佳的引腳映射:
以Nucleo-F207ZG 爲例:
UM1974: STM32 Nucleo-144 boards
也可以檢查mbed os的等效文件: ST-Nucleo-F207ZG
4 - 查看引腳和信號引腳編號
按需求來編輯variant.h和variant.cpp文件。
在variant.cpp中:
- 你要填寫數組const PinName digitalPin []。 該數組的功能是將Arduino引腳號(Dx或x或PYx)對應到STM32引腳(PY_x)。
在variant.h文件中:
- 對齊variant.h中digitalPin []數組中上面定義的PinName的數量。
定義所有可用的引腳及其鏈接的引腳號,該數字是digitalPin []數組中的索引。
舉個例子:
#define PG9 0
#define PG14 1
#define PF15 2
#define PE13 3
#define PF14 4
- 查看宏以指向正確的引腳名稱/編號:LED_BUILTIN,MOSI,MISO,SCLK,SDA,SCL,...
請注意,其中一些在內核中具有默認值。 僅當與默認值不同時才重新定義它們。
參考: https://github.com/stm32duino/Arduino_Core_STM32/blob/c392140415b3cf29100062ecb083adfa0f59f8b1/cores/arduino/pins_arduino.h#L142
到這裏,你能添加自定義的定義,去匹配你的需求了
5 - 系統時鐘配置
在variant.cpp文件中, void SystemClock_Config(void)
需要定義。
可以通過STM32CubeMX或複製自STM32CubeYY項目示例(其中“ YY”是MCU系列)
關於操作STM32CubeMX :
- 運行STM32CubeMX,創建一個新項目,然後選擇目標MCU或開發板(如果列表中有列出)。
- 轉到“引腳分配”選項卡,啓用所需的外圍設備:I2C,SDIO,SPI,USB,...
配置時鐘:
- 如果電路板具有外部晶振:在“ Pinout”選項卡RCC-> HSE外設中設置爲Crystal。
- 在“時鐘配置”中,將HSE輸入頻率設置爲晶體1,然後將PLL Source Mux設置爲HSE。
- 將HCLK設置爲最大頻率,STM32CubeMX將自動配置時鐘樹並解決衝突問題。
生成代碼:
- 設置工具鏈/ IDE:SW4STM32
- 在生成代碼的時候,還將生成外設的時鐘配置
- 將src / main.c中生成的void SystemClock_Config(void)複製到variant.cpp中
6 - 更新 ldscript.ld
可以通過STM32CubeMX或
複製自STM32CubeYY項目示例(其中“ YY”是MCU系列)
將變體文件夾中的ldscript.ld替換爲根文件夾中STM32CubeMX生成的STM32YYxxxxxx_FLASH.ld。
Nucleo-F207ZG的示例:STM32F207ZGTx_FLASH.ld
7 - HAL庫的配置
如果說你的核心版本大於1.5.0,那麼每個STM32系列均提供默認的STM32 HAL配置。 請參閱hal-configuration。
在variant.h中添加任何其他的HAL庫的模塊定義。
以Nucleo-F207ZG爲例:
/ *額外的HAL模塊* /
#定義HAL_DAC_MODULE_ENABLED
#定義HAL_ETH_MODULE_ENABLED
在variant.h中添加任何其他HAL配置。
Example #define HSE_VALUE 25000000U
8 - 聲明板子,添加到ArduinoIDE
仍然要手動的添加菜單並添加相關信息(閃存和SRAM大小,CPU頻率等)。
更多可選項可以看這一份文檔 Arduino Boards.txt specifications
編輯boards.txt 文件,操作如下:
- 複製文件中與你的芯片最類似的部分內容
- 通過menu.pnum。<new_board_name>重命名所有menu.pnum下的<old_board_name>
- 將build.mcu =和build.cmsis_lib_gcc =更新到正確的cortex-mX版本
- 將build.series =更新爲正確的STM32YYxx(其中YY是MCU系列,比如F4比如G0)
- 將build.product_line =更新爲正確的STM32YYXXxx MCU版本。
- 將upload.maximum_size =和upload.maximum_data_size =更新爲正確的Flash和SRAM大小
9 - 重新啓動
重新啓動Arduino IDE,並且使用Blink-example 測試你的板子