手把手教你刷机,这次刷的是无人机!

面向希望真正吃透飞控原理、又想制作自己的飞控的开发者。本指南将基于STM32H743开发板,用最少的步骤、最直白的语言,手把手带你完成飞控移植的全部流程。

学习移植有哪些好处?

  • 开发板硬件开放、结构清晰

  • 非常适合初学者学习PX4结构

  • 为后续做自己定制的飞控板打基础

  • 更适合科研或商业自研项目

01 前期准备

硬件:stlink*1 、stm32h743开发板*1 PX4源码版本选择:PX4官方代码(v1.15.4)



了解飞控的基本原理

飞控启动本质是硬件资源层层移交的过程。Bootloader 完成最底层初始化后,将控制权交给 NuttX;NuttX 建立操作系统环境后,最终由飞控固件接管硬件外设。



02 关键移植文件解析

引导程序相关文件

bootloader脚本与配置
nuttx-config/bootloader/defconfig: 配置bootloader中需要调用的底层资源,比如最基础的USB驱动、TIM定时器驱动、系统控制台System Console的驱动等。
bootloader.px4board: 配置哪些源码被编译到bootloader中,一般不需要修改。

飞控固件核心文件

硬件抽象层配置/外设驱动模块

  • default.px4board:配置每个串口的映射,配置哪些源码被编译到飞控固件中。

  • board_config.h:定义了硬件外设接口、引脚映射、电源管理及初始化逻辑硬件的一些参数配置。

  • bootloader_main.c:bootloader的主函数(引导程序专用于fmu的早期启动代码)。

  • can.c:CAN总线初始化与注册配置驱动。

  • hw_config.h:PX4 Bootloader 与硬件交互的核心配置,确保飞控在不同硬件平台上可靠启动和升级。

  • i2c.cpp:PX4飞控系统的I2C总线管理模块,实现I2C总线初始化配置以及设备内外部分类。

  • init.c:PX4 飞控系统的板级初始化入口,负责在 NuttX启动早期完成:硬件外设复位与电源管理,基础硬件初始化,关键子系统启动,故障安全机制。

  • led.c:PX4 飞控系统的 LED 驱动模块,负责管理硬件板载 LED 的初始化、控制逻辑与状态指示。

  • manifest.c:PX4飞控系统的硬件清单管理模块,通过动态匹配硬件版本与组件配置,实现多硬件变种的兼容性支持。

  • mtd.cpp:飞控系统的存储设备管理清单,用于定义飞控板上非易失性存储介质(如FRAM、EEPROM)的分区结构与访问方式。

  • sdio.c:PX4 飞控系统的 SD卡 驱动模块,负责管理硬件板载 SD的初始化、以及挂载检测。

  • spi.cpp:PX4飞控系统的SPI总线管理模块,实现不同版本硬件上SPI总线初始化配置。

  • timer_config.cpp:PX4 飞控系统定时器配置模块,实现处理器pwm管脚的映射。

  • usb.c:PX4飞控系统的USB初始化。

  • rc.board_defaults:飞控默认参数的设置。

  • rc.board_sensors:飞控传感器启动配置。

  • firmware.prototype:修改飞控板ID、名称和闪存大小。

NuttX操作系统配置文件

  • board_dma_map.h:定义了DMA通道分配策略。DMA用来提供在外设和存储器之间或者存储器和 存储器之间的高速数据传输。

  • board.h:配置NuttX操作系统中的时钟和引脚,各种接口的io定义,根据硬件的实际定义修改。

  • nsh/defconfig:飞控固件中需要调用的底层资源,比如命令行交互、多外设驱动、文件存储,串口驱动、SPI驱动、I2C驱动等等。

  • script.ld:用于分配飞控固件内存地址和大小的链接脚本。

  • bootloader_script.ld:用于分配bootloader内存地址和大小的链接脚本。

03 移植步骤

硬件引脚规划

由于我们开发板选择的是STM32H743,所以参考MicroAir743飞控进行引脚规划,后续移植管脚定义基于此规划。
geek_h743pinout文件: https://kdocs.cn/l/cvr7JHhjfoAm

创建移植目录

/PX4-Autopilot/boards目录下新建geek/h743文件夹,并将micoair/h743文件下内容拷贝到新建的文件夹下,后续基于此文件下内容进行修改。

配置文件分析与修改

board.h: 由于该开发板外部晶振为25MHZ,与MicroAir不同,需要修改,修改内容参考文末源码。
board_dma_map.h: 串口和spi接口DMA配置,可自行开启或关闭。
default.px4board: 根据自己需求修改串口映射关系,其他编译向根据需求选择。
firmware.prototype: 根据自己需求修改board_id,magic,description,summary等。
逐一更改src下的所有文件,并根据需要修改,参考文末提供的源码。

board_config.h
1、系统状态显示
LED控制:
#define GPIO_nLED_BLUE       /* PE12 */  (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN12)
蜂鸣器管脚配置:
#define GPIO_TONE_ALARM         GPIO_TIM2_CH1OUT_2
2、模拟信号采集(ADC)
电池监控:
#define ADC_BATTERY_CURRENT_CHANNEL    /* PA4 */  ADC1_CH(18)
#define ADC_BATTERY_VOLTAGE_CHANNEL            /* PB1 */  ADC1_CH(5)
3、pwm通道数量
#define DIRECT_PWM_OUTPUT_CHANNELS   6
4、电源控制引脚配置
#define GPIO_nPOWER_IN_C                /* PE15  */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN15)
#define GPIO_nVDD_USB_VALID             GPIO_nPOWER_IN_C /* USB     Is Chosen */
5、usb vbus引脚配置
#define GPIO_OTGFS_VBUS         /* PA8 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_SPEED_100MHz|GPIO_PORTA|GPIO_PIN8)
6、接收机端口配置
#define RC_SERIAL_PORT          "/dev/ttyS3"
#define BOARD_SUPPORTS_RC_SERIAL_PORT_OUTPUT
7、STDIO/USB/SPI/初始化以及复位:
int stm32_sdio_initialize(void);
extern void stm32_spiinitialize(void);
extern void stm32_usbinitialize(void);
extern void board_peripheral_reset(int ms);

编译流程

执行:make geek_h743_bootloader生成bootloader固件存储在extras文件夹下面。
执行:make geek_h743_default生成飞控固件存储在build目录下。

04 功能验证

固件烧写方法

bootloader烧写:将stlink与开发板连接,使用STM32CubeProgrammer或者ST-LINK Utility软件进行固件烧写。



px4固件烧写: 使用qgc地面站进行飞控固件烧写。



QGC地面站连接测试

固件烧写后,连接到QGC地面站,进入QGC终端可查看飞控固件版本等。



资源速递

点击阅读全文即可获取源码: https://github.com/amovlgf/PX4-Autopilot/tree/geek\_h743\?sessionid=1496494836

如有错误的地方欢迎大家指正,后续将继续为大家介绍基础外设(imu/sd/baro/gps/flow/flsah等)添加以及调试,敬请期待。

开发遇到棘手难题可以上阿木官方论坛:bbs.amovlab.com**

有工程师亲自解答10000+无人机开发者和你共同进步!