<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>FMU on emofog</title>
    <link>https://emofog.github.io/blog/tags/fmu/</link>
    <description>Recent content in FMU on emofog</description>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Sun, 09 Aug 2026 00:43:41 +0800</lastBuildDate>
    <atom:link href="https://emofog.github.io/blog/tags/fmu/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>01 PX4 HAL 导读与 micoair/h743-v2 增加 PWM11(PD14/TIM4_CH3)实录</title>
      <link>https://emofog.github.io/blog/posts/px4/01/</link>
      <pubDate>Sun, 09 Aug 2026 00:43:41 +0800</pubDate>
      <guid>https://emofog.github.io/blog/posts/px4/01/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;拿 &lt;code&gt;boards/micoair/h743-v2&lt;/code&gt; 当例子,这一篇先说 PX4 的硬件抽象层(HAL)长什么样,再顺着&amp;quot;加一路 PWM&amp;quot;这个最小需求,看改一块飞控到底要动哪些文件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;1-px4-的代码组织三层视角&#34;&gt;1. PX4 的代码组织(三层视角)&lt;/h1&gt;
&lt;p&gt;第一次打开 PX4 仓库容易迷路,其实跟硬件相关的就三个根目录:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;目录&lt;/th&gt;
          &lt;th&gt;角色&lt;/th&gt;
          &lt;th&gt;改它的频率&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;boards/&amp;lt;vendor&amp;gt;/&amp;lt;board&amp;gt;/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;板级:每块飞控一份&lt;/td&gt;
          &lt;td&gt;加新板必改&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;platforms/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;HAL:把外设抽象成可复用的 C++ 类&lt;/td&gt;
          &lt;td&gt;加通用能力才动&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;src/drivers/&lt;/code&gt;、&lt;code&gt;src/modules/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;设备驱动与飞行控制模块&lt;/td&gt;
          &lt;td&gt;加新传感器/新算法时改&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;硬件的真相都在板级目录里。HAL 看到的 &lt;code&gt;io_timers&lt;/code&gt;、&lt;code&gt;i2c_hw_description&lt;/code&gt;,都是板级文件用 &lt;code&gt;constexpr&lt;/code&gt; 表填出来的,HAL 自己不写死。&lt;/p&gt;
&lt;h2 id=&#34;11-hal-内部的分层&#34;&gt;1.1 HAL 内部的分层&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;platforms/nuttx/src/px4/&lt;/code&gt;(NuttX 是 PX4 跑的 RTOS,所有 STM32 飞控都在它上面):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;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
│       └── ...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;几个关键点:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
