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 --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 让程序跑起来。
4.4 验证烧录是否成功
固件烧进去了,怎么知道它跑没跑?我一般用三种方法验证:
- 看LED灯:PX4启动后,飞控板上的LED会按特定模式闪烁。FMUv5上电后,蓝色LED会先快闪几下,然后变成慢闪。如果灯完全不亮,说明固件没跑起来。
- 串口输出:用USB连上飞控,打开串口工具(比如screen或PuTTY),波特率设为115200。启动时应该能看到PX4的启动日志,包括传感器初始化、参数加载等信息。
- QGroundControl连接:打开QGC,如果它能自动识别到飞控,并且显示固件版本号,那基本就稳了。
我个人最常用的是第二种方法。串口日志最直观,能看到系统启动到哪一步卡住了。比如有一次我烧完固件,LED正常闪,但QGC就是连不上。一看串口日志,发现GPS模块初始化失败,导致整个系统卡在等待状态。这种问题光看LED是看不出来的。
ls /dev/ttyACM* 或 ls /dev/ttyUSB*,看看有没有新设备出现。如果有,说明飞控的USB虚拟串口已经工作了。
下面这张图,是我总结的整个编译烧录流程,你可以对照着走一遍:
最后说一句,烧录失败别慌。先检查硬件连接,再看J-Link驱动有没有装好。如果还不行,试试降低SWD速度到1000kHz。我遇到过好几次,板子布线不太好,跑4MHz就掉线,降到1MHz就稳了。
嗯,这一章的内容就到这儿。固件烧进去只是第一步,后面还有参数调优、传感器校准这些活儿等着你。不过先把基础打牢,后面就顺了。
公众号:蓝海资料掘金营,微信deep3321