betaflight 的代码结构主要如下, 整体上我们移植需要关注的是 src/main/drivers 文件夹下的驱动,其他文件夹各自用途标注
+---docs -- bf 的文档文件夹,包括如何设置、搭建编译环境等,如果英语不太差建议多读 +---lib -- MCU 以及引用的一些外部lib 文件,mcu 的驱动库比如HAL、at32 的bsp放这里
| +---main | | +---AT32F43x | | +---BoschSensortec | | | \---BMI270-Sensor-API | | +---CMSIS --- ARM 核心的驱动,必须要 | | +---dyad | | +---google --google的glc序列化协议 | | \---MAVLink --mavlink 数传协议 | \---test -- 自动化单元测试用例 +---make -- makefile 的主要文件夹, 包括target引入、特定MCU 的编译链接配置等, at32 需要新建一个 makefile文件 | \---mcu +---src --主要源代码文件夹 | +---link -- gcc 的ld 文件夹,主要声明程序的内存、flash布局,需要根据mcu 仔细调整, 声明内存起始、flash起始、程序的 bss、ess 等段声明,bf 的配置数据管理体系 PG (flash 模拟eeprom )重点在这里。F4的重启到bootloader 也是在这里
+---main | | +---blackbox 黑匣子代码 | | +---build 构建的一些设置 | | +---cli bf 地面站的cli 功能实现 | | +---cms OSD 设置菜单的实现 | | +---common 通用配置文件 | | +---config 读写config 的配置 | | +---drivers 驱动层 ,mcu和传感器的驱动代码,移植的代码主要在这里 | | | +---accgyro 加速度计与陀螺仪,基本不需要修改 | | | +---accgyro_legacy “史前”古老的加速度计和陀螺仪 | | | +---barometer 气压计驱动 | | | +---compass 罗盘驱动 | | | +---rangefinder 遥控测试用的 | | | \---rx 所有接收机的驱动,包括elrs、cc2500 、sbus 等,大部分不需要移植,ppm 、elrs 用到timer 需要修改 | | +---fc init、飞控核心代码无需移植
| | +---flight 飞行状态代码,无需移植 | | +---io 对于输入输出的抽象代码,不需要修改 | | | \---asyncfatfs | | +---msc U盘模式,需要移植 | | +---msp bf configuator 和bf 串口配置通信的协议,无需移植 | | +---osd OSD 的抽象层无需修改 | | +---pg 配置信息读写库,无需修改 | | +---rx 接收机上层代码,无需修改 | | +---scheduler 核心调度器,无需修改 | | +---sensors 传感器抽象代码,无需修改 | | +---startup mcu 启动初始化代码,需要根据mcu配置 startup.s ,修改初始化静态变量、预加载内存变量等部分 | | +---target 硬件目标配置信息,需要根据板子自己定义 | | | +---AT32F437DEV 本次移植用的开发板target.h target.c target.mk 文佳 | +---test --单元测试代码 | | \---unit | | \---timer_definition_unittest.include | | +---drivers | | \---pg | \---utils --工具代码无需修改 \---unified_targets --统一化的固件配置信息,无需修改 \---configs
整体上代码的结构,可以看下
bf 代码结构图 https://blog.csdn.net/github_37459410/article/details/126372389 可以看到bf 代码呈沙漏型,中间的driver文件夹对上下层进行了抽象隔离,也便于bf 向各个mcu移植。 不过总体来说stm32 系列mcu 的结构变化不是很大,除了F7、H7 内存、DMA有部分的差异之外, 代码中夹杂着宏定义来实现1套代码不同target 打包。