尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

用VSCode和Ubuntu从零编译Betaflight固件:AT32F437DEV完整实践指南

发布时间:2026/9/28 15:44:22

资讯中心
01
ARTICLE

用VSCode和Ubuntu从零编译Betaflight固件:AT32F437DEV完整实践指南

用VSCode和Ubuntu从零编译Betaflight固件:AT32F437DEV完整实践指南
如果你和我一样平时飞的是Betaflight固件的穿越机手里又正好想折腾一批用AT32F437DEV做主控的飞控板那你大概率会撞上一个很实际的问题Betaflight这个项目从STM32时代一路发展过来编译工具链、脚本和官方文档天然偏向Linux环境想在Windows下硬编译不是不行但光是依赖环境就能折腾掉一个晚上。这篇文章就记录我用VSCode加Ubuntu从零编译Betaflight固件AT32F437DEV版的完整过程包括环境搭建、源码获取、编译命令、VSCode工程化配置以及我实际踩过的几个坑。适合刚入手AT32飞控、想本地编译固件的新手也适合已经会刷预编译固件但没碰过源码编译的老玩家。先说结论这条路没有想象中难但有几个关键的认知前置必须做对——比如target是什么、交叉编译器和普通编译器的区别、Betaflight源码目录的组织方式。把这些搞明白之后编译指令本身反而不是重点。下面按我的实际操作顺序一步步拆开讲。1. 为什么选AT32F437DEVBetaflight新硬件目标的选型逻辑1.1 AT32F437是颗什么样的芯片先花点时间认识主控。AT32F437是雅特力推出的一颗Cortex-M4内核MCU主频最高可以跑到288MHz片上Flash和RAM的配置也相当舍得给。相比大家熟悉的STM32F405168MHz主频AT32F437的算力明显高一个档次跑Betaflight这种需要高频姿态解算、多路外设实时响应的固件余量会更足。用个不太严谨但好懂的类比STM32F405像一台老款自然吸气发动机稳定、皮实、资料多社区里随便搜都是案例AT32F437更像是新出的涡轮增压机账面参数漂亮但周边配套和调校经验需要你多花点心思。Betaflight会把AT32纳入支持名单根本原因其实是芯片供货和成本。近几年的无人机行业里STM32的供应波动太大飞控厂商需要可替代方案AT32在硬件接口、外设设计上又做了不少兼容性考虑迁移成本相对低于是慢慢在Betaflight社区里站稳了脚跟。1.2 DEV版本和量产板卡目标的区别Betaflight里“目标”target这个概念是整个编译流程的核心。每个target对应一块具体的飞控板里面定义好了MCU型号、引脚映射、外设初始化、LED、蜂鸣器、接收机串口这些硬件配置。比如常见的STM32F405、STM32F411、MatekF405都是target名它们决定了“这份固件是给哪块板子用的”。“AT32F437DEV”里的DEV我理解是Development的意思。它通常不是一个具体品牌飞控的成品固件命名而是给开发板或者通用硬件平台准备的工程目标。好处是灵活性极高引脚定义、外设映射你都可以按需改坏处是你不能指望刷完它就直接匹配你的整机配置很多硬件细节需要你自己根据飞控的原理图去做适配。标题里的“DEV版”其实还隐含了一个要求你需要掌握target文件的结构至少知道src/main/target/AT32F437DEV/目录里那些.h、.mk文件是干什么用的。1.3 动手编译前先搞清固件的目录骨架Betaflight源码仓库的根目录一眼望去挺唬人但对编译来说重点关注这几块就够了src/main/固件核心源码飞控逻辑、传感器驱动、姿态算法基本都在这。src/main/target/按target分目录每个target一个文件夹存放该板卡的配置头文件和构建描述。Makefile整个编译流程的入口所有make命令都靠它调度。lib/main/芯片厂商提供的标准外设库和驱动库AT32相关的驱动也会在这里。编译的本质就是用交叉编译器把src/main/下的C语言源码结合target目录里的硬件配置编译成能在Cortex-M4内核上运行的机器码最后打包成.hex或.bin文件。这个流程和你在PC上gcc hello.c没有本质区别只是目标CPU变了工具链从系统自带的gcc换成了arm-none-eabi系列。理解这一点之后后面所有命令看起来都不会再觉得神秘。2. Ubuntu环境准备从零搭建编译工具链的细节2.1 先决定用哪种Ubuntu形态动手装软件之前第一步是想清楚用哪种Ubuntu环境。我实际试过三种方案各有取舍方案优点缺点原生安装Ubuntu性能最好编译最快没有虚拟化损耗需要单独分区或整盘安装平时还要在Windows和Linux之间切换VMware/NV虚拟机跑Ubuntu不破坏原系统快照方便折腾坏了能回滚编译速度略慢内存占用高磁盘要提前留足WSL2启动快和Windows文件系统互通纯命令行编译很顺手GUI和USB设备转发比较折腾依赖VSCode Remote-WSL才能获得较好体验如果你只是偶尔编译固件不想重装系统我推荐虚拟机或者WSL2。如果你编译频率高、还打算接调试器调参那就老老实实装原生Ubuntu或者在局域网里放一台Ubuntu服务器做远程编译。我目前的主力方案是Windows下VSCode加Remote-SSH连到Ubuntu机器上编译写代码、敲命令都在VSCode里完成体验很统一。这一点第5章会详细展开。2.2 安装基础工具链Ubuntu装好之后第一件事是更新软件源索引sudo apt update sudo apt upgrade -y然后安装编译Betaflight所需的基础软件包sudo apt install -y git build-essential cmake python3 python3-pip sudo apt install -y gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi第一行是通用工具git用来拉取代码build-essential包含make、gcc等基础构建工具cmake部分新版本Betaflight的构建脚本会用到python3是很多辅助脚本的运行依赖。第二行是ARM交叉编译三件套gcc-arm-none-eabi是编译器本体binutils-arm-none-eabi提供链接器、汇编器这些底层工具libnewlib-arm-none-eabi是嵌入式C运行库里面包含printf、memcpy这些标准库函数的嵌入式实现。有些教程会建议去ARM官网手动下载工具链压缩包再配置环境变量。就Betaflight来说我认为没必要apt源里的版本足够稳定而且和Betaflight的Makefile脚本兼容性更好。唯一要注意的是系统版本别太老Ubuntu 20.04及以上的源基本都能满足要求。装完验证一下三条命令都有正常输出就说明工具链没毛病arm-none-eabi-gcc --version make --version git --version2.3 中文输入法和编辑器可选项如果你打算在Ubuntu图形界面里保持中文使用习惯可以装中文字体和输入法搜狗输入法、fcitx这类方案网上教程非常多。不过就编译固件这个场景来说纯英文环境完全够用我反而建议不要在桌面美化、输入法配置上花太多时间把状态最好的精力留给后面的编译链路。真正让日常操作变舒服的是VSCode的外挂配置这个放到第5章细讲。3. 源码获取与目标配置分支、仓库和AT32F437DEV的对应关系3.1 拉取Betaflight源码Betaflight的官方仓库托管在GitHub上项目名是betaflight/betaflight。克隆的时候有两个关键点一是要带submodule二是分支要选对。git clone --recursive https://github.com/betaflight/betaflight.git cd betaflight--recursive参数是整个流程里最容易忽略的坑。Betaflight依赖若干个子模块比如统一目标配置脚本和部分驱动库如果不带这个参数后面编译会直接报找不到头文件或者驱动文件。如果你已经不小心clone了不用删掉重来在仓库根目录执行这一句就能补上git submodule update --init --recursive分支选择上Betaflight的发布节奏是固定版本号分支比如4.4、4.5、4.6。AT32F437的支持在较新的版本里才进入主线建议选4.5或4.6的稳定taggit checkout 4.6.0如果你想用最新开发版master分支也行但要有心理准备主分支可能带来自动化测试没覆盖到的新问题。用tag编译的好处是网上提问、搜教程时大家说的是同一份代码不容易出现“我改了某个文件为什么你截图里没有”这种对不上号的情况。3.2 确认AT32F437DEV target是否真的存在这是很多新手卡住的地方光知道目标名没用得先确认你本地仓库里有没有这个target。在Betaflight根目录执行make list或者直接过滤target目录ls src/main/target/ | grep -i at32我本地较新版本仓库里能看到AT32相关的target目录。如果你用的版本里找不到AT32F437DEV这个确切名字多半是上游命名有调整比如拆成了更具体的板卡名。遇到这种情况最稳妥的做法是去仓库的src/main/target/目录里搜AT32关键词看官方target到底叫什么再决定是直接编译还是基于某个相近target自己补一个配置。不要小看这一步。我见过不少人在网上找了个教程里的target名结果本地仓库版本不同、target名对不上编译报错后就怀疑自己环境装错了其实只是名字不对。3.3 target目录里到底有什么以AT32F437DEV为例进入对应目录后通常会有几个核心文件target.h板卡配置的C头文件里面全是宏定义比如USE_ACC、USE_GYRO、USE_FLASH这些宏决定了编译时带哪些传感器驱动、哪些外设功能。target.mk构建描述文件列出了这个target需要编译哪些源码文件以及需要额外链接的驱动库。部分target还会带.json或.config文件用于新的统一目标配置流程。这些文件就是“板卡的身份证”。你想精简固件、增加对新传感器的支持本质就是改这些配置。比如想支持某个特定陀螺仪就在target.h里加对应的宏定义想删掉用不上的传感器驱动就注释掉对应宏。改完重新编译固件体积能肉眼可见地缩小。4. 核心编译流程详解make命令背后发生了什么4.1 Betaflight编译的入口MakefileBetaflight沿用了Linux内核风格的Makefile组织结构外层Makefile统一调度所有target的编译流程。你不必深入理解Makefile的每一行语法但至少要知道它替你做了三件事根据指定的target名找到src/main/target/下对应的配置目录递归扫描src/main/下的C源码结合target配置决定哪些文件参与编译调用arm-none-eabi-gcc完成交叉编译和链接最终生成.hex、.bin、.elf文件。一句make命令背后是几十条编译规则在协同工作。这有点像点外卖你只看到下单成功背后是采购、备菜、烹饪、打包一整条链路。4.2 标准编译命令第一次编译之前建议先清理历史编译产物避免旧文件干扰然后指定target编译make clean make AT32F437DEV有些版本也支持这种写法效果相同make TARGETAT32F437DEV如果你是修改了源码后重新编译每次都要make clean吗其实不用。Makefile会检查文件时间戳只编译改过的那部分这个增量编译机制能省很多时间直接make AT32F437DEV就行。第一次全量编译会比较慢几十秒到几分钟不等取决于CPU核心数和磁盘性能。建议加-j参数并行编译make AT32F437DEV -j$(nproc)nproc会输出你CPU的逻辑核心数-j让make同时跑多个编译任务。我在八核机器上全量编译大概两分钟不加-j可能要七八分钟。并行数也不是越大越好内存和CPU温度都得照顾我一般用-j8到-j12就够。编译完成后产物在obj/目录下里面能看到类似betaflight_4.6.0_AT32F437DEV.hex的文件这个就是Betaflight Configurator可以直接加载刷写的固件。4.3 编译日志里怎么看问题编译过程中会滚动输出大量日志新手容易看懵。其实只需要盯住两件事有没有error:字样。有就是编译失败往上翻日志找第一条报错那才是根因后面所有错误多半是连锁反应。有没有warning:字样。警告一般不影响固件生成但如果是宏定义冲突、类型转换不匹配这类警告建议处理一下省得后面飞控行为诡异时排查半天。编译成功时日志末尾会出现链接、生成hex/bin的提示。如果看到Error 1、Error 2说明编译中断了这时候别直接重跑先解决报错。4.4 用Docker编译隔离环境依赖如果你不想在Ubuntu里装一堆工具链或者公司电脑权限受限装不了包可以用Betaflight提供的Docker镜像编译。在仓库根目录执行类似下面的命令docker run --rm -it -v $(pwd):/betaflight ghcr.io/betaflight/betaflight-build:latest make AT32F437DEV这条命令把当前目录挂载到容器里的/betaflight然后在容器内执行make。好处是编译环境完全隔离镜像里的工具链版本都是官方验证过的不会出现“apt源的gcc版本和源码不兼容”这种玄学问题。缺点是要先拉镜像如果网络或磁盘条件不好反而比本地编译更折腾。5. VSCode配置让阅读和编译体验接近IDE5.1 安装VSCode和必要插件Ubuntu下装VSCode最简单的方式是去官网下载.deb安装包然后sudo apt install -y ./code_xxx_amd64.deb装完之后插件市场里首推这几个按优先级排C/C微软官方插件提供IntelliSense、代码跳转、调试支持这是核心中的核心。Remote-SSH如果你的代码在远程Ubuntu服务器或虚拟机上这个插件让你直接在VSCode里打开远程文件夹终端也是远程的编译、调试全在远程环境跑体验和本地几乎一样。GitLens快速查看git历史、每行代码是谁在什么时候改的排查奇怪问题的时候很管用。Chinese Language Pack想要中文界面就装这个不装英文界面也不影响使用。Cortex-Debug后面想接调试器看MCU内部寄存器、单步调代码这个插件价值很大。5.2 配置IntelliSense让代码跳转不飘Betaflight源码体量很大如果不配好IntelliSenseVSCode里跳转定义大概率会“飘”到错误位置上。我建议在项目根目录新建.vscode/c_cpp_properties.json内容大致如下{ configurations: [ { name: Betaflight AT32F437DEV, includePath: [ ${workspaceFolder}/src/main, ${workspaceFolder}/src/main/target/AT32F437DEV, ${workspaceFolder}/src/main/startup, ${workspaceFolder}/lib/main/** ], defines: [ AT32F437DEV ], compilerPath: /usr/bin/arm-none-eabi-gcc, cStandard: gnu11, intelliSenseMode: linux-gcc-arm } ], version: 4 }核心作用是把src/main、target/AT32F437DEV、lib/main这些头文件搜索路径告诉VSCode再指定交叉编译器的路径。这样#include头文件、跳转宏定义就都能正常工作。注意compilerPath一定要指向你实际安装的交叉编译器如果不确定先执行which arm-none-eabi-gcc确认一下路径。5.3 把编译命令集成到VSCode任务虽然每次切到终端敲make AT32F437DEV也不算麻烦但配好tasks.json之后一键编译、错误双击跳转源码的体验完全不一样。在.vscode/tasks.json里写{ version: 2.0.0, tasks: [ { label: Build AT32F437DEV, type: shell, command: make AT32F437DEV -j$(nproc), group: { kind: build, isDefault: true }, problemMatcher: [ $gcc ] }, { label: Clean, type: shell, command: make clean, group: build } ] }配置完成后按CtrlShiftB直接触发编译编译日志里的错误和警告会被VSCode的“问题”面板自动收集双击错误条目还能直接跳到源码出错行。这个体验比纯终端好太多了尤其适合从改target.h宏定义起步的新手。5.4 远程开发模式VSCode Remote-SSH如果你和我一样日常工作在Windows编译环境在UbuntuRemote-SSH几乎就是必备的。装了插件后CtrlShiftP输入“Remote-SSH: Connect to Host”填上Ubuntu的IP和用户名VSCode就会重新打开一个远程窗口。左下角显示远程主机名打开远程文件夹所有终端、任务、插件都跑在远程环境里。这比在Windows上用共享文件夹映射再手动同步代码爽太多因为你是直接在目标环境里改代码并编译不存在“本地改了忘同步”的问题。第一次连接需要输密码后面如果要免密可以配置SSH密钥网上大量现成教程。这套方式同样适合多人协作——大家连到同一台编译服务器上工具链版本统一再也不会出现“在我电脑上是好的”这种经典问题。6. 编译踩坑实录依赖、版本和报错排查链路这一章我用自己的真实踩坑经历来写按“现象、定位、解决”的顺序讲几个高频问题希望对得起“踩坑实录”这四个字。6.1 报错“arm-none-eabi-gcc: Command not found”现象执行make后立刻出现arm-none-eabi-gcc: Command not found或类似提示。定位这是最基础的环境问题说明交叉编译器没装或者装了但不在PATH环境变量里。解决重新执行安装命令sudo apt install -y gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi装完再跑arm-none-eabi-gcc --version确认。如果确认装了还是提示找不到检查是不是用snap装的版本snap的路径和apt不太一样可能需要重新登录一下让PATH刷新。6.2 报错缺头文件比如驱动库找不到现象编译中途报fatal error: xxx.h: No such file or directory。定位先看缺的是哪个头文件。如果缺的是芯片厂商的HAL库文件多半是submodule没拉全。Betaflight的驱动源码大量依赖子模块克隆时没带--recursive或者子模块列表有更新而本地没同步都会导致头文件缺失。解决回到仓库根目录执行git submodule update --init --recursive然后重新编译。如果还缺再看是不是target.h里定义的宏引用了某个驱动目录但当前分支不支持这个驱动。这时候就要检查分支版本和target的匹配关系换个tag再试。6.3 增量编译导致“莫名其妙”的报错现象第一次编译通过改了几行代码后编译报错而且报错位置指向的是你没改过的文件。定位这种情况十有八九是增量编译的缓存出问题了。Makefile依赖文件时间戳来判断是否重新编译如果你用了某些文件同步方式改代码共享目录、网盘同步、虚拟机映射时间戳会乱掉导致Makefile对文件是否变更判断出错。解决先别慌执行make clean make AT32F437DEV -j$(nproc)全量重来一遍。如果clean之后再编译还是同样报错才需要怀疑代码本身的问题。6.4 磁盘空间不足现象编译过程中报No space left on device或者链接阶段生成固件时报错。定位Betaflight单个固件产物不算大但如果你在虚拟机里只分了20GB磁盘系统更新、源码仓库、工具链全堆在一起确实容易爆。尤其git仓库加上编译中间文件占几个GB很正常。解决用df -h看磁盘占用删掉不再需要的软件包或旧内核或者给虚拟机扩容虚拟磁盘。注意不要在编译进行到一半的时候去删源码目录里的东西很容易把目录弄坏。6.5 AT32芯片烧录和调试的小坑编译不是终点烧录才是。AT32F437DEV固件编译完成后可以通过Betaflight Configurator进入DFU模式刷写前提是飞控板已经进入引导模式且USB连接正常。这一步和STM32时代刷写流程很相似但有两点值得留意。第一如果你用独立调试器比如J-Link、ST-LinkAT32和STM32的调试接口协议大体兼容但具体接线和软件配置可能不完全一样一定要去查对应调试器是否明确支持AT32内核别上来就按ST的教程硬套。第二如果你在虚拟机里烧录记得把USB设备直接连接到虚拟机或者确保宿主机上的USB转发正常。这一步搞不定固件编译得再漂亮也上不了飞机。6.6 玄学问题特定版本的gcc编译出来的固件飞控不工作这个坑不太常见但遇到了会很痛苦。某次我升级了Ubuntu的gcc-arm-none-eabi版本编译出来的固件能正常刷入但飞控上电后传感器数据异常换回旧版本gcc重新编译就一切正常。遇到这种“编译成功但运行行为诡异”的情况优先怀疑编译器版本。解决方法是锁定工具链版本或者在Docker镜像里编译官方镜像用的gcc版本是固定的。这条经验也是我后来推荐Docker方案的原因之一编译环境可复现省得隔几个月一升级系统就出幺蛾子。7. 编译完之后的进阶方向7.1 精简固件体积AT32F437DEV这种通用target默认会打开很多外设驱动如果只是自用很多功能其实用不上。改掉target.h里的宏定义能显著减小固件体积。比如关掉不用的传感器型号、去掉LED和蜂鸣器驱动几句话的功夫就能省出几十KB空间。编译完看输出的.hex文件大小对比一下就能体会到“配置驱动固件体积”的直观关系。7.2 自定义默认PID和参数Betaflight固件里很多默认参数是写在源码里的。如果你手里有一批飞控要统一下发一套PID和配置可以直接在target配置里改默认值然后编译刷写。这样以后每次重刷固件不需要再进CLI手动敲参数飞机一起飞就是你要的手感。这个做法对批量装机特别有用能省掉大量重复劳动。7.3 尝试加自己的驱动或算法如果你对飞控开发有更深的想法可以继续在src/main/里加自己的模块。比如试验一个新的滤波算法或者给某个外设写驱动。Betaflight的模块结构相对清晰驱动、调度、算法分层明确花时间读代码能学到不少嵌入式设计经验。这里没有捷径就是多读、多改、多编译验证。改坏了大不了make clean再来一次又不会把板子刷坏放心折腾。我本来只是想给手里的AT32F437DEV板子编一版固件结果从工具链到源码结构到VSCode工程化绕了一大圈。回头看这个过程的真正价值不在于最后那条编译命令而在于你开始理解“固件是怎么从一个开源仓库变成飞机上跑的那段二进制”的。如果你也卡在编译这一步对照上面的链路走一遍大概率半小时内能出固件。后续想深入就从改target配置开始改坏了大不了clean再来一次试错成本低收益却不小。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。