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 选择目标板编译前需要指定目标板类型。对于NAZE32make TARGETNAZE第一次编译可能会遇到各种依赖问题常见的有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 TARGETNAZE make TARGETNAZE4.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工具如CH340python3 -m serial.tools.miniterm /dev/ttyUSB0 1152005.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系列的性能提升非常明显最后提醒一点老飞控的硬件可靠性可能下降飞行前务必做好充分测试特别是失控保护等安全功能。