手把手教你刷机,这次刷的是无人机!
面向希望真正吃透飞控原理、又想制作自己的飞控的开发者。本指南将基于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+无人机开发者和你共同进步!