Betaflight 的Makefile 體系與移植

betaflight 的 makefile體系是整體構(gòu)建固件的基礎(chǔ), 因為支持基本整個全系列STM 芯片,從F103 一直到 H7 (目前官方已經(jīng)移除F1、F3 的支持,僅支持F4、F7、H7系列),芯片的架構(gòu)、配置、存儲布局、內(nèi)存布局等各不相同,另外還要考慮一部分特定目標(biāo)需要配置特定的信息,所以betaflight 實現(xiàn)了一個十分復(fù)雜的makefile體系。 所以構(gòu)建betaflight 最好的方式是按照官方文檔,使用 make +arm-gcc + binutils 工具鏈進行構(gòu)建。 調(diào)試最好使用 gdb+openocd +Jlink/STlink/Daplink 進行仿真調(diào)試。
所需背景知識:
1、makefile 語法
2、linux 下 make、gcc、gdb、binutils 等編譯工具鏈基礎(chǔ)知識
3、git 、python 等基本工具知識
如果以上背景知識不夠扎實,可以邊看邊搜邊補充。
先介紹 betaflight 的makefile體系:
整體betaflight的makefile 包括3部分:
betaflight/make 目錄,
betflight/Makefile
betaflight/src/main/targets/target.mk
第一部分:betaflight/make 文件夾相關(guān)目錄結(jié)構(gòu)與用途如下:
make
----mcu ????????????????????????????????????具體MCU 的定義,如果新增MCU 需要在這里配置
--------AT32F43x.mk???????????????? 本次移植新增的at32f435/7 系列mcu構(gòu)建腳本,新建
--------SITL.mk?????????????????????????? 軟件仿真構(gòu)建目標(biāo)
--------STM32F1.mk????????????????? stm32f103 mcu 構(gòu)建腳本
--------STM32F3.mk
--------STM32F4.mk
--------STM32F7.mk
--------STM32G4.mk
--------STM32H7.mk
---source.mk???? ???????????????????? betaflight 公用源文件清單、usb以及其他庫文件清單,速度、大小優(yōu)化裁剪文件清單等????????? 需要微調(diào),增加at系列source file
---targets.mk???? ????????????????????所有的目標(biāo)信息配置,需要配置 at新增的target
---targets_list.mk?? ????????????????所有目標(biāo)清單,包括支持的、淘汰的等,不需要動
---tools.mk????????????????????????????自動安裝構(gòu)建相關(guān)工具的清單,不需要動
---checks.mk?????????? ????????????? 相關(guān)校驗清單,不需要動
---openocd.mk? ????????????????????openocd 仿真配置清單,包括jlink、stlink等,本次移植沒有用
---system-id.mk? ????????????????????其他配置相關(guān)清單,判斷當(dāng)前系統(tǒng)是什么系統(tǒng) ,不需要動
---macosx.mk ????????????????????????mac os下 的編譯環(huán)境配置,不需要動
---windows.mk????????????????????????windows 下的編譯環(huán)境配置,不需要動
--- linux.mk ????????????????????????????linux 下的編譯環(huán)境配置 ,不需要動
--- build_verbosity.mk? ?????????? 交互式構(gòu)建的設(shè)置,不需要動
第二部分:主Makefile
betaflight/ Makefile?????????????????? makefile 是bf的 主makefile文件,通過include make文件夾和target文件夾下的makefile來實現(xiàn)根據(jù)命令自動構(gòu)建具體的目標(biāo)固件的構(gòu)建規(guī)則。 主makefile 不需要做修改。
第三部分: betaflight/src/main/target/AT32F437DEV
具體的target 配置文件夾,主要包括 targe.h? target.c? target.mk 三個文件,為了移植到at32 的starter 開發(fā)板上,新增 AT32F437DEV 目標(biāo)
target.h? :新增目標(biāo)頭文件配置,主要是配置spi、i2c、uart、beeper、timer、led 等針腳配置以及啟用的timer 、gpio端口等,這部分信息會被編譯后的 轉(zhuǎn)換為? PG 配置信息,對應(yīng)到 bf 地面站 CLI 命令行里的Resource 信息 ,另外還包括具體使用什么 ACC 和GYRO、 具體傳感器信息等,通過 #define? USE_xxxx? 等宏定義打開編譯時包含的傳感器驅(qū)動代碼等。 一般考慮到mcu 的flash 大小以及構(gòu)建的目標(biāo)硬件配置來設(shè)定
target.c? 與target.h 配套使用,但是主要配置的是
timerHardware[USABLE_TIMER_CHANNEL_COUNT]
通過 DEF_TIM 宏來給需要通過timer? 輸出PWM 的針腳定義配置信息, 主要包括:CameraControl、LedStrip、Motor、Servo 等需要pwm 驅(qū)動的外設(shè)針腳定義以及使用的DMA 通道。
以上target.h和target.c 的相關(guān)針腳映射不可以隨便定義,需要查具體芯片的用戶手冊與數(shù)據(jù)手冊GPIO 復(fù)用表格,來設(shè)定具體目標(biāo)板的針腳IO分配。 配置錯誤可能會導(dǎo)致硬件無法使用。所以移植過程中需要反復(fù)的核對配置信息。
target.mk?? 這個文件是 target 的關(guān)鍵, 通過targets.mk 通過掃描 target 目錄下的具體子目錄名稱作為 BASE_TARGET? 參數(shù),而 target.mk 文件里
為了移植AT32F43x 系列MCU ,需要做以下工作:
1、搭建編譯環(huán)境,可以在linux 或者安裝了cygwin 的windows bash 中,在betaflight 目錄下執(zhí)行 :make arm_sdk_install? 命令,會自動安裝 arm 相關(guān)工具鏈到 betaflight/tools/文件夾下,后面的固件構(gòu)建也會自動引用這個文件夾下的工具 。
2、新建target 配置,如上文分析
3、增加 targets.mk 配置
4、新增 mcu/AT32F43X.mk 配置
通過以上幾步基本構(gòu)建了新移植的at32f435/7 系列mcu 的makefile體系,后面的移植過程中通過make命令進行目標(biāo)固件的構(gòu)建工作。