4. PX4固件编译与烧录:下载PX4源码、编译第一个固件、使用J-Link烧录、验证烧录是否成功

好,咱们进入实操环节。前面聊了那么多工具链的理论,现在该动手了。这一章,我带你走一遍完整的流程:从拉取PX4源码,到编译出固件,再到用J-Link烧进去,最后验证它跑没跑起来。

说实话,我第一次搞PX4编译的时候,光环境就折腾了两天。后来发现,只要把几个关键步骤理顺了,其实没那么玄乎。咱们一步步来。

4.1 下载PX4源码

先得把代码搞下来。PX4的源码托管在GitHub上,我们用git clone就行。

git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot

这里有个坑——--recursive参数不能省。PX4依赖了很多子模块,比如uORB、drivers这些。不加这个参数,你编译到一半会报一堆找不到头文件的错误。我刚开始就吃过这个亏,编译到80%突然崩了,排查了半天才发现是子模块没拉全。

小技巧: 如果网络不好,子模块容易拉失败。可以分两步走:先 git clone 主仓库,再执行 git submodule update --init --recursive。这样失败了可以重试,不用从头再来。

拉完代码后,建议先切到一个稳定的版本。我个人习惯用最新的LTS版本,比如1.14.x。你可以用 git tag 看看有哪些版本,然后 git checkout v1.14.3。别直接跑main分支,那上面可能正在开发,说不定哪天就编译不过了。

4.2 编译第一个固件

源码到手了,接下来编译。咱们的目标板是Pixhawk FMUv5,对应的编译命令是:

make px4_fmu-v5

这条命令会做几件事:

  • 自动检测交叉编译工具链
  • 编译PX4内核、中间件、驱动和应用层
  • 生成固件文件 .px4.bin

第一次编译会比较慢,因为要下载依赖的库,还要编译整个RTOS。我建议你泡杯咖啡等着。正常情况下,十几分钟到半小时能搞定。如果超过一小时还没动静,那多半是网络问题或者工具链没装对。

注意: 编译前确保你已经安装了arm-none-eabi-gcc。版本要求是9-2020-q2-update或更高。用 arm-none-eabi-gcc --version 检查一下。版本太老的话,编译会报一些莫名其妙的链接错误。

编译成功后,终端会显示类似这样的信息:

-- Build files have been written to: /home/user/PX4-Autopilot/build/px4_fmu-v5_default
[100%] Built target px4_fmu-v5_default
固件路径: build/px4_fmu-v5_default/px4_fmu-v5_default.px4

看到这个,说明固件已经生成好了。嗯,到这里只完成了一半,还得把它烧进板子里。

4.3 使用J-Link烧录固件

J-Link是SEGGER公司的调试器,稳定可靠。我个人在项目中一直用它,没出过什么幺蛾子。烧录前,先确认硬件连接:

  • J-Link的SWD接口连到飞控板的SWDIO和SWCLK
  • GND连好
  • 如果板子不自供电,还需要连VCC(3.3V)

连接好之后,打开终端,启动J-Link GDB Server:

JLinkGDBServer -device STM32F765 -if SWD -speed 4000

参数说明:

参数 含义
-device STM32F765 FMUv5的主控芯片型号
-if SWD 使用SWD接口,比JTAG简单
-speed 4000 SWD时钟频率,4MHz比较稳妥

然后另开一个终端,用arm-none-eabi-gdb连接上去:

arm-none-eabi-gdb build/px4_fmu-v5_default/px4_fmu-v5_default.elf
(gdb) target remote localhost:2331
(gdb) load
(gdb) monitor reset
(gdb) continue

这里要注意,load 命令会把固件写入Flash。写入完成后,monitor reset 复位芯片,continue 让程序跑起来。

核心要点: 烧录时一定要确保J-Link和板子共地。我曾经有一次没接GND,结果烧录到一半就卡死了,还以为板子烧了。后来发现是地线没接好,虚惊一场。

4.4 验证烧录是否成功

固件烧进去了,怎么知道它跑没跑?我一般用三种方法验证:

  1. 看LED灯:PX4启动后,飞控板上的LED会按特定模式闪烁。FMUv5上电后,蓝色LED会先快闪几下,然后变成慢闪。如果灯完全不亮,说明固件没跑起来。
  2. 串口输出:用USB连上飞控,打开串口工具(比如screen或PuTTY),波特率设为115200。启动时应该能看到PX4的启动日志,包括传感器初始化、参数加载等信息。
  3. QGroundControl连接:打开QGC,如果它能自动识别到飞控,并且显示固件版本号,那基本就稳了。

我个人最常用的是第二种方法。串口日志最直观,能看到系统启动到哪一步卡住了。比如有一次我烧完固件,LED正常闪,但QGC就是连不上。一看串口日志,发现GPS模块初始化失败,导致整个系统卡在等待状态。这种问题光看LED是看不出来的。

快速检查: 在终端执行 ls /dev/ttyACM*ls /dev/ttyUSB*,看看有没有新设备出现。如果有,说明飞控的USB虚拟串口已经工作了。

下面这张图,是我总结的整个编译烧录流程,你可以对照着走一遍:

PX4固件编译与烧录流程 1. 下载源码 git clone --recursive 2. 编译固件 make px4_fmu-v5 3. 连接J-Link SWD接口连接 4. 启动GDB Server JLinkGDBServer 5. GDB烧录 load + monitor reset 6. 验证烧录 LED / 串口 / QGC ❌ 失败? 检查连接/重新编译 ✅ 烧录成功,飞控正常运行

最后说一句,烧录失败别慌。先检查硬件连接,再看J-Link驱动有没有装好。如果还不行,试试降低SWD速度到1000kHz。我遇到过好几次,板子布线不太好,跑4MHz就掉线,降到1MHz就稳了。

嗯,这一章的内容就到这儿。固件烧进去只是第一步,后面还有参数调优、传感器校准这些活儿等着你。不过先把基础打牢,后面就顺了。


公众号:蓝海资料掘金营,微信deep3321