Betaflight 的Makefile 体系与移植

betaflight 的 makefile体系是整体构建固件的基础, 因为支持基本整个全系列STM 芯片,从F103 一直到 H7 (目前官方已经移除F1、F3 的支持,仅支持F4、F7、H7系列),芯片的架构、配置、存储布局、内存布局等各不相同,另外还要考虑一部分特定目标需要配置特定的信息,所以betaflight 实现了一个十分复杂的makefile体系。 所以构建betaflight 最好的方式是按照官方文档,使用 make +arm-gcc + binutils 工具链进行构建。 调试最好使用 gdb+openocd +Jlink/STlink/Daplink 进行仿真调试。
所需背景知识:
1、makefile 语法
2、linux 下 make、gcc、gdb、binutils 等编译工具链基础知识
3、git 、python 等基本工具知识
如果以上背景知识不够扎实,可以边看边搜边补充。
先介绍 betaflight 的makefile体系:
整体betaflight的makefile 包括3部分:
betaflight/make 目录,
betflight/Makefile
betaflight/src/main/targets/target.mk
第一部分:betaflight/make 文件夹相关目录结构与用途如下:
make
----mcu 具体MCU 的定义,如果新增MCU 需要在这里配置
--------AT32F43x.mk 本次移植新增的at32f435/7 系列mcu构建脚本,新建
--------SITL.mk 软件仿真构建目标
--------STM32F1.mk stm32f103 mcu 构建脚本
--------STM32F3.mk
--------STM32F4.mk
--------STM32F7.mk
--------STM32G4.mk
--------STM32H7.mk
---source.mk betaflight 公用源文件清单、usb以及其他库文件清单,速度、大小优化裁剪文件清单等 需要微调,增加at系列source file
---targets.mk 所有的目标信息配置,需要配置 at新增的target
---targets_list.mk 所有目标清单,包括支持的、淘汰的等,不需要动
---tools.mk 自动安装构建相关工具的清单,不需要动
---checks.mk 相关校验清单,不需要动
---openocd.mk openocd 仿真配置清单,包括jlink、stlink等,本次移植没有用
---system-id.mk 其他配置相关清单,判断当前系统是什么系统 ,不需要动
---macosx.mk mac os下 的编译环境配置,不需要动
---windows.mk windows 下的编译环境配置,不需要动
--- linux.mk linux 下的编译环境配置 ,不需要动
--- build_verbosity.mk 交互式构建的设置,不需要动
第二部分:主Makefile
betaflight/ Makefile makefile 是bf的 主makefile文件,通过include make文件夹和target文件夹下的makefile来实现根据命令自动构建具体的目标固件的构建规则。 主makefile 不需要做修改。
第三部分: betaflight/src/main/target/AT32F437DEV
具体的target 配置文件夹,主要包括 targe.h target.c target.mk 三个文件,为了移植到at32 的starter 开发板上,新增 AT32F437DEV 目标
target.h :新增目标头文件配置,主要是配置spi、i2c、uart、beeper、timer、led 等针脚配置以及启用的timer 、gpio端口等,这部分信息会被编译后的 转换为 PG 配置信息,对应到 bf 地面站 CLI 命令行里的Resource 信息 ,另外还包括具体使用什么 ACC 和GYRO、 具体传感器信息等,通过 #define USE_xxxx 等宏定义打开编译时包含的传感器驱动代码等。 一般考虑到mcu 的flash 大小以及构建的目标硬件配置来设定
target.c 与target.h 配套使用,但是主要配置的是
timerHardware[USABLE_TIMER_CHANNEL_COUNT]
通过 DEF_TIM 宏来给需要通过timer 输出PWM 的针脚定义配置信息, 主要包括:CameraControl、LedStrip、Motor、Servo 等需要pwm 驱动的外设针脚定义以及使用的DMA 通道。
以上target.h和target.c 的相关针脚映射不可以随便定义,需要查具体芯片的用户手册与数据手册GPIO 复用表格,来设定具体目标板的针脚IO分配。 配置错误可能会导致硬件无法使用。所以移植过程中需要反复的核对配置信息。
target.mk 这个文件是 target 的关键, 通过targets.mk 通过扫描 target 目录下的具体子目录名称作为 BASE_TARGET 参数,而 target.mk 文件里
为了移植AT32F43x 系列MCU ,需要做以下工作:
1、搭建编译环境,可以在linux 或者安装了cygwin 的windows bash 中,在betaflight 目录下执行 :make arm_sdk_install 命令,会自动安装 arm 相关工具链到 betaflight/tools/文件夹下,后面的固件构建也会自动引用这个文件夹下的工具 。
2、新建target 配置,如上文分析
3、增加 targets.mk 配置
4、新增 mcu/AT32F43X.mk 配置
通过以上几步基本构建了新移植的at32f435/7 系列mcu 的makefile体系,后面的移植过程中通过make命令进行目标固件的构建工作。