【无人机】1.从零编译Betaflight/Cleanflight固件:针对STM32F103的实战指南
1. 为什么需要自己编译固件?
如果你手头有一块基于STM32F103的飞控板,比如经典的NAZE32,可能会发现最新的Betaflight固件已经不再支持这个老旧的芯片了。而Cleanflight虽然最后一个版本还支持F103,但项目早已停止更新。这时候自己动手编译固件就成了唯一的选择。
我去年就遇到过这种情况,手头有几块闲置的NAZE32飞控,想用来做个小项目,结果发现官方固件要么不支持,要么功能不全。经过一番折腾,终于搞定了从源码编译的全过程。下面就把我的经验分享给大家,让你也能给老飞控注入新生命。
2. 搭建编译环境
2.1 准备Ubuntu系统
编译Cleanflight/Betaflight固件最好在Linux环境下进行。我推荐使用Ubuntu 20.04 LTS,这个版本比较稳定,社区支持也好。你可以选择:
- 直接在物理机安装Ubuntu
- 使用虚拟机(VMware或VirtualBox)
- 通过WSL在Windows下运行Ubuntu
我个人习惯用虚拟机,因为可以随时做快照,遇到问题能快速回滚。安装好系统后,记得先更新软件包:
sudo apt update && sudo apt upgrade -y2.2 安装必要的工具链
编译需要安装一些基础开发工具:
sudo apt install -y git make gcc python3 python3-pip然后是ARM交叉编译工具链。Cleanflight官方推荐使用特定的gcc版本,我们可以直接从他们提供的链接获取:
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2018q2/gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2 sudo tar -xjf gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2 -C /opt最后把工具链路径加入环境变量:
echo 'export PATH=$PATH:/opt/gcc-arm-none-eabi-7-2018-q2-update/bin' >> ~/.bashrc source ~/.bashrc3. 获取和准备源码
3.1 下载源代码
Cleanflight的最后一个正式版本是3.2.0,我们可以直接从GitHub克隆:
git clone https://github.com/cleanflight/cleanflight.git cd cleanflight git checkout 3.2.0如果你想尝试Betaflight的老版本(比如4.2.x,最后一个支持F103的版本),可以用类似的命令:
git clone https://github.com/betaflight/betaflight.git cd betaflight git checkout 4.2.x3.2 理解代码结构
Cleanflight的代码结构很清晰,几个关键目录:
src/main:核心飞控代码src/main/target:不同飞控板的配置文件make:编译相关的Makefilelib:依赖的库文件
对于NAZE32飞控,我们需要重点关注src/main/target/NAZE目录下的文件,特别是target.h和target.c。
4. 配置和编译固件
4.1 选择目标板
编译前需要指定目标板类型。对于NAZE32:
make TARGET=NAZE第一次编译可能会遇到各种依赖问题,常见的有:
- Python包缺失:用
pip3 install -r requirements.txt解决 - 工具链路径不对:检查
.bashrc中的PATH设置 - 权限问题:确保
/opt目录有读写权限
4.2 解决Flash空间不足
STM32F103C8T6只有64KB Flash,很容易就超了。我第一次编译时就遇到了这个问题:
region `flash' overflowed by 1232 bytes解决方法是在target.h中注释掉不需要的功能。比如:
// 注释掉不用的传感器 // #define USE_BARO // #define USE_MAG // 关闭不必要的外设 // #define USE_SOFTSERIAL1 // #define USE_SOFTSERIAL2我的经验是,先保留最基本的功能(接收机、电机控制),等编译通过后再逐步添加其他功能。每次修改后都要执行:
make clean TARGET=NAZE make TARGET=NAZE4.3 生成最终固件
编译成功后,会在obj目录下生成.hex和.bin文件。注意:
_naked.hex:不带元数据的精简版本.hex:标准Intel HEX格式.bin:原始二进制文件,适合某些烧录工具
我一般使用.bin文件,因为体积最小,烧录也快。
5. 烧录和测试
5.1 烧录固件到飞控
有几种常用的烧录方法:
ST-Link:最可靠的方式
st-flash write obj/cleanflight_NAZE.bin 0x8000000DFU模式:需要先按住Bootloader键上电
dfu-util -a 0 -D obj/cleanflight_NAZE.bin -s 0x08000000串口:通过USB转TTL工具(如CH340)
python3 -m serial.tools.miniterm /dev/ttyUSB0 115200
5.2 连接地面站
烧录完成后,用USB连接飞控,打开Cleanflight Configurator:
- 选择正确的串口(通常是
/dev/ttyACM0或COMx) - 点击连接,如果成功会显示飞控信息
- 检查各传感器是否工作正常
如果连接不上,可能是以下原因:
- 驱动没装好(Linux一般免驱,Windows可能需要装驱动)
- 串口被其他程序占用
- 固件配置错误(比如串口功能没开启)
5.3 功能测试
建议按以下顺序测试:
- 接收机输入:打杆看通道数据是否变化
- 电机输出:拆桨测试,检查电机转向和顺序
- 传感器数据:晃动飞控看陀螺仪数据变化
- 模式切换:测试ARM/DISARM和其他飞行模式
6. 高级定制技巧
6.1 添加自定义功能
如果你想添加自己的代码,比如特殊的混控逻辑,可以:
- 在
src/main下新建你的模块 - 修改
target.h启用相关功能 - 在
main.c中初始化你的模块
记得每次修改后都要重新编译和测试。
6.2 优化性能
对于资源紧张的F103,可以尝试:
- 降低主循环频率(修改
target.h中的LOOP_TIME) - 关闭调试输出(
#define DEBUG OFF) - 使用更高效的算法(比如快速平方根近似)
6.3 解决常见问题
我遇到过的一些坑:
- 电机不转:检查PWM输出配置,确保
resource分配正确 - 传感器数据异常:可能是I2C地址冲突,检查
target.h中的定义 - 随机重启:可能是堆栈溢出,尝试减少任务数量
7. 后续维护建议
虽然F103已经老旧,但通过固件定制还是能发挥余热。我的几点建议:
- 定期备份你的定制配置(特别是
target.h) - 关注社区动态,有时会有针对老硬件的优化补丁
- 考虑逐步迁移到新硬件,F4/F7系列的性能提升非常明显
最后提醒一点,老飞控的硬件可靠性可能下降,飞行前务必做好充分测试,特别是失控保护等安全功能。
