前言
在上篇內容中主要介紹了marlin2.0安裝到已有開發板的實例。這篇內容將通過marlin2.0安裝到BLACK_STM32F407VE開發板的實踐介紹如何爲新定製的開發板燒入固件並詳細介紹前期的處理過程,希望能爲那些想深入固件研究苦於不會編譯安裝和想繪製3D打印機開發板又不知如何燒錄固件的marlin愛好者一些幫助。
BLACK_STM32F407VE開發板的硬件開源資料鏈接:https://github.com/mcauser/BLACK_F407VE
構建過程
類似於上篇文章的內容,首先將配置內容修改爲適合於BLACK_STM32F407VE的開發板。
-
將
platformio.ini
文件中的[plarformio]
下的default_envs
修改爲default_envs = STM32F407VE_black
-
將
configuration.h
文件中的MOTHERBOARD
修改爲:#ifndef MOTHERBOARD #define MOTHERBOARD BOARD_BLACK_STM32F407VE #endif
-
將
configuration.h
文件中的串口1SERIAL_PORT
修改爲-1
或1
#define SERIAL_PORT -1 //USB虛擬串口
SERIAL_PORT
定義爲-1
是選擇USB端口作爲虛擬串口使用(可能需要STM32的虛擬串口驅動)。#define SERIAL_PORT 1 //普通串口1
SERIAL_PORT
定義爲1
是選擇開發板的串口1作爲通信端口,當然也可以定義爲2,3,4等,此時選擇的便是串口2、串口3、串口4等串口。
Note
對於串口端口2
SERIAL_PORT_2
的註釋不要去除,保持原樣,在需要一定的配置後才能使用串口端口2,否則會編譯出錯(當然如果串口端口1使用串口1/USB虛擬串口,串口端口2使用USB虛擬串口/串口1的情況下不需要額外配置,若要使用其它串口則需要配置)。後面我們會說到如何使用它。//#define SERIAL_PORT_2 -1
正常情況下通過以上3步的過程,就能夠編譯通過了,也可以下載到開發板中體驗一番了。
構建分析
-
platformio.ini
文件在將default_envs
配置爲STM32F407VE_black
之後實際起作用的就是下文中的這些內容:[platformio] src_dir = Marlin boards_dir = buildroot/share/PlatformIO/boards default_envs = STM32F407VE_black [common] default_src_filter = +<src/*> -<src/config> -<src/HAL> +<src/HAL/shared> extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py build_flags = -fmax-errors=5 -g -D__MARLIN_FIRMWARE__ -fmerge-all-constants lib_deps = LiquidCrystal TMCStepper@>=0.6.2,<1.0.0 Adafruit NeoPixel U8glib-HAL=https://github.com/MarlinFirmware/U8glib-HAL/archive/bugfix.zip Adafruit_MAX31865=https://github.com/adafruit/Adafruit_MAX31865/archive/master.zip LiquidTWI2=https://github.com/lincomatic/LiquidTWI2/archive/master.zip Arduino-L6470=https://github.com/ameyer/Arduino-L6470/archive/0.8.0.zip SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip SailfishRGB_LED=https://github.com/mikeshub/SailfishRGB_LED/archive/master.zip SlowSoftI2CMaster=https://github.com/mikeshub/SlowSoftI2CMaster/archive/master.zip # # STM32F407VET6 with RAMPS-like shield # 'Black' STM32F407VET6 board - http://wiki.stm32duino.com/index.php?title=STM32F407 # Shield - https://github.com/jmz52/Hardware # [env:STM32F407VE_black] platform = ststm32 board = blackSTM32F407VET6 platform_packages = framework-arduinoststm32@>=3.107,<4 build_flags = ${common.build_flags} -DTARGET_STM32F4 -DARDUINO_BLACK_F407VE -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 -DUSB_PRODUCT=\"BLACK_F407VE\" -IMarlin/src/HAL/HAL_STM32 build_unflags = -std=gnu++11 extra_scripts = pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py lib_ignore = Adafruit NeoPixel, TMCStepper, SailfishLCD, SailfishRGB_LED, SlowSoftI2CMaster, SoftwareSerial src_filter = ${common.default_src_filter} +<src/HAL/HAL_STM32>
這裏僅是簡單的介紹一下幾個必要的概念,剩餘的內容請大家參考
platformio
官方文檔介紹—platformio.ini部分:-
board_dir
:指定板子描述文件的位置,platformio
首先會根據指定位置尋找板子描述文件,找不到則到安裝目錄下尋找。這裏指定了板子描述文件的位置:buildroot/share/PlatformIO/boards
-
board
:指定板子描述文件的名稱根據上面兩點的指示我們可以準確的找到板子描述文件:
buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json
。文件通過JSON
消息描述了硬件的具體信息。這裏我們注意一下19行的位置:指定了編譯時需要的與板子相關的源文件的文件夾名稱(後面會用到,這裏知道即可)。 -
platform_packages
:指定編譯的平臺框架,這裏用到的是framework-arduinoststm32
,實際這是ST官方爲STM32開發板使用Arduino平臺開發的庫。該庫的結構很清晰整潔,兼容STM32全系列的芯片,裏面已經包含了許多開發板樣例,當然也可以仿照樣例將自己的開發板添加到其中。 -
extra_scripts = pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
:這一行是執行python腳本文件,前面有一個前綴pre:
表示在主腳本執行之前執行(這裏可以理解爲在編譯之前執行即可)。該腳本文件可以在上述路徑下找到。打開該文件後可以看到一段python原碼,主要做了一件事情:將buildroot/share/PlatformIO/variants
路徑下的全部內容複製到,C:\Users\{用戶名}\.platformio\packages\framework-arduinoststm32\variants
路徑下(針對於windows)。這些內容都是編譯會用到的內容。還記得之前板子描述文件中提到過的MARLIN_F407VE
嗎?在buildroot/share/PlatformIO/variants
目錄下有一個名爲MARLIN_F407VE
的文件夾,這可不是恰巧同名,前面的名稱就是指代的這個文件夾的名稱。MARLIN_F407VE
中存放了和硬件直接相關的源碼配置文件。
-
-
瞭解到上面的信息後,便可以根據自己的開發板仿照已有案例完成兩項工作
- 基於樣例修改板子描述文件
- 基於樣板修改板子相關的源碼文件
如何配置使用多個串口
— 基於framework-arduinoststm32
框架,以BLACK_F407VE爲例
現在marlin可以配置雙串口支持,且可以支持串口屏(串口屏支持會在後續文章中講解)。如果我們只是在marlin代碼層配置了多串口,編譯是會報錯的。下面開始正文:
-
打開
buildroot/share/PlatformIO/variants/MARLIN_F407VE
文件夾下的variant.h
文件,在文件307行左右的// UART Definitions
下添加如下使能即可:#define ENABLE_HWSERIAL 2 //使能串口2 #define ENABLE_HWAERIAL 3 //使能串口3
這樣配置完成後marlin開啓多串口編譯就不會報錯了。