news 2026/6/11 22:50:36

【无人机】1.从零编译Betaflight/Cleanflight固件:针对STM32F103的实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【无人机】1.从零编译Betaflight/Cleanflight固件:针对STM32F103的实战指南

1. 为什么需要自己编译固件?

如果你手头有一块基于STM32F103的飞控板,比如经典的NAZE32,可能会发现最新的Betaflight固件已经不再支持这个老旧的芯片了。而Cleanflight虽然最后一个版本还支持F103,但项目早已停止更新。这时候自己动手编译固件就成了唯一的选择。

我去年就遇到过这种情况,手头有几块闲置的NAZE32飞控,想用来做个小项目,结果发现官方固件要么不支持,要么功能不全。经过一番折腾,终于搞定了从源码编译的全过程。下面就把我的经验分享给大家,让你也能给老飞控注入新生命。

2. 搭建编译环境

2.1 准备Ubuntu系统

编译Cleanflight/Betaflight固件最好在Linux环境下进行。我推荐使用Ubuntu 20.04 LTS,这个版本比较稳定,社区支持也好。你可以选择:

  1. 直接在物理机安装Ubuntu
  2. 使用虚拟机(VMware或VirtualBox)
  3. 通过WSL在Windows下运行Ubuntu

我个人习惯用虚拟机,因为可以随时做快照,遇到问题能快速回滚。安装好系统后,记得先更新软件包:

sudo apt update && sudo apt upgrade -y

2.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 ~/.bashrc

3. 获取和准备源码

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.x

3.2 理解代码结构

Cleanflight的代码结构很清晰,几个关键目录:

  • src/main:核心飞控代码
  • src/main/target:不同飞控板的配置文件
  • make:编译相关的Makefile
  • lib:依赖的库文件

对于NAZE32飞控,我们需要重点关注src/main/target/NAZE目录下的文件,特别是target.htarget.c

4. 配置和编译固件

4.1 选择目标板

编译前需要指定目标板类型。对于NAZE32:

make TARGET=NAZE

第一次编译可能会遇到各种依赖问题,常见的有:

  1. Python包缺失:用pip3 install -r requirements.txt解决
  2. 工具链路径不对:检查.bashrc中的PATH设置
  3. 权限问题:确保/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=NAZE

4.3 生成最终固件

编译成功后,会在obj目录下生成.hex.bin文件。注意:

  • _naked.hex:不带元数据的精简版本
  • .hex:标准Intel HEX格式
  • .bin:原始二进制文件,适合某些烧录工具

我一般使用.bin文件,因为体积最小,烧录也快。

5. 烧录和测试

5.1 烧录固件到飞控

有几种常用的烧录方法:

  1. ST-Link:最可靠的方式

    st-flash write obj/cleanflight_NAZE.bin 0x8000000
  2. DFU模式:需要先按住Bootloader键上电

    dfu-util -a 0 -D obj/cleanflight_NAZE.bin -s 0x08000000
  3. 串口:通过USB转TTL工具(如CH340)

    python3 -m serial.tools.miniterm /dev/ttyUSB0 115200

5.2 连接地面站

烧录完成后,用USB连接飞控,打开Cleanflight Configurator:

  1. 选择正确的串口(通常是/dev/ttyACM0COMx
  2. 点击连接,如果成功会显示飞控信息
  3. 检查各传感器是否工作正常

如果连接不上,可能是以下原因:

  • 驱动没装好(Linux一般免驱,Windows可能需要装驱动)
  • 串口被其他程序占用
  • 固件配置错误(比如串口功能没开启)

5.3 功能测试

建议按以下顺序测试:

  1. 接收机输入:打杆看通道数据是否变化
  2. 电机输出:拆桨测试,检查电机转向和顺序
  3. 传感器数据:晃动飞控看陀螺仪数据变化
  4. 模式切换:测试ARM/DISARM和其他飞行模式

6. 高级定制技巧

6.1 添加自定义功能

如果你想添加自己的代码,比如特殊的混控逻辑,可以:

  1. src/main下新建你的模块
  2. 修改target.h启用相关功能
  3. main.c中初始化你的模块

记得每次修改后都要重新编译和测试。

6.2 优化性能

对于资源紧张的F103,可以尝试:

  1. 降低主循环频率(修改target.h中的LOOP_TIME
  2. 关闭调试输出(#define DEBUG OFF
  3. 使用更高效的算法(比如快速平方根近似)

6.3 解决常见问题

我遇到过的一些坑:

  1. 电机不转:检查PWM输出配置,确保resource分配正确
  2. 传感器数据异常:可能是I2C地址冲突,检查target.h中的定义
  3. 随机重启:可能是堆栈溢出,尝试减少任务数量

7. 后续维护建议

虽然F103已经老旧,但通过固件定制还是能发挥余热。我的几点建议:

  1. 定期备份你的定制配置(特别是target.h
  2. 关注社区动态,有时会有针对老硬件的优化补丁
  3. 考虑逐步迁移到新硬件,F4/F7系列的性能提升非常明显

最后提醒一点,老飞控的硬件可靠性可能下降,飞行前务必做好充分测试,特别是失控保护等安全功能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 12:23:25

Alpha Shape参数调优:从凸包到精细轮廓的边界提取实践

1. Alpha Shape算法入门:从凸包到精细轮廓 第一次接触Alpha Shape算法时,我正处理一组城市建筑物的LiDAR扫描数据。传统凸包算法生成的边界就像用橡皮筋粗暴地套住所有点,完全丢失了建筑之间的空隙和凹陷结构。而Alpha Shape通过一个简单的α…

作者头像 李华
网站建设 2026/4/14 12:22:09

从3GPP官网精准定位与下载V2X协议:以TR 36.885为例的实战指南

1. 3GPP协议与V2X技术背景 如果你是第一次接触3GPP协议下载,可能会被各种编号搞得一头雾水。我刚开始研究车联网(V2X)时也是这样,看到论文里引用"3GPP TR 36.885 V14.0.0"这样的编号完全不知道从哪找起。其实3GPP就像是一个庞大的技术图书馆&…

作者头像 李华
网站建设 2026/4/14 12:17:50

如何快速掌握UltraVNC:远程控制的终极完整指南

如何快速掌握UltraVNC:远程控制的终极完整指南 【免费下载链接】UltraVNC 👁️ UltraVNC Server, UltraVNC Viewer, UltraVNC Repeater and UltraVNC SC | Official repository: https://github.com/ultravnc/UltraVNC 项目地址: https://gitcode.com/…

作者头像 李华
网站建设 2026/4/14 12:16:47

如何5秒完成B站视频永久保存:m4s-converter完整使用指南

如何5秒完成B站视频永久保存:m4s-converter完整使用指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾因B站视频突然下架而…

作者头像 李华
网站建设 2026/4/14 12:16:47

如何快速上手GoCelery:5分钟搭建高性能分布式任务系统

如何快速上手GoCelery:5分钟搭建高性能分布式任务系统 【免费下载链接】gocelery Celery Distributed Task Queue in Go 项目地址: https://gitcode.com/gh_mirrors/go/gocelery GoCelery是一个用Go语言实现的分布式任务队列系统,它允许开发者轻松…

作者头像 李华