01 PX4 HAL 导读与 micoair/h743-v2 增加 PWM11(PD14/TIM4_CH3)实录

拿 boards/micoair/h743-v2 当例子,这一篇先说 PX4 的硬件抽象层(HAL)长什么样,再顺着"加一路 PWM"这个最小需求,看改一块飞控到底要动哪些文件。 1. PX4 的代码组织(三层视角) 第一次打开 PX4 仓库容易迷路,其实跟硬件相关的就三个根目录: 目录 角色 改它的频率 boards/<vendor>/<board>/ 板级:每块飞控一份 加新板必改 platforms/ HAL:把外设抽象成可复用的 C++ 类 加通用能力才动 src/drivers/、src/modules/ 设备驱动与飞行控制模块 加新传感器/新算法时改 硬件的真相都在板级目录里。HAL 看到的 io_timers、i2c_hw_description,都是板级文件用 constexpr 表填出来的,HAL 自己不写死。 1.1 HAL 内部的分层 platforms/nuttx/src/px4/(NuttX 是 PX4 跑的 RTOS,所有 STM32 飞控都在它上面): platforms/nuttx/src/px4/ ├── common/ # 跨架构共用:board_ctrl, hrt, cpuload, console_buffer ├── stm/ │ ├── stm32_common/ # STM32 跨系列共用 │ │ ├── dshot/ # DSHOT 协议驱动 │ │ ├── hrt/ # 高分辨率定时器 │ │ ├── io_pins/ # PWM/输入捕获/触发(io_timer.c, pwm_servo.c) │ │ ├── led_pwm/ # LED PWM │ │ ├── spi/ # SPI 总线抽象 │ │ ├── tone_alarm/ # 蜂鸣器 │ │ └── ... │ ├── stm32f4/ stm32f7/ stm32h7/ # 系列特定(目前主要是 ADC 寄存器布局) │ └── stm32_common/include/px4_arch/ │ ├── io_timer.h # MAX_IO_TIMERS / MAX_TIMER_IO_CHANNELS 宏 │ ├── io_timer_hw_description.h │ ├── dshot.h │ ├── spi_hw_description.h │ ├── i2c_hw_description.h │ └── ... 几个关键点: ...

2026年8月9日 · 10 分钟 · emofog