MCU软件架构分层设计
架构分层就是各自负责各自的功能,不该你负责的就™️不要管。
-我说的

搞懂这张图,BOSS直聘上横着走!
这种架构的核心就是解耦:将底层硬件的差异性与上层业务的复杂性隔离开来,提高代码的可移植性、可维护性和可扩展性。
根据图片内容,我们可以从下往上逐层解析这个架构的设计逻辑:
1. 微控制器 (MCU)
这是最底层。
-
包含内容:ST(意法半导体)、GD(兆易创新)、ESP(乐鑫)、TI(德州仪器)、NXP(恩智浦)等不同厂商的芯片。
-
设计意义:这一层的存在提醒我们,软件架构必须能够屏蔽不同芯片之间的差异。无论底层换成 STM32 还是 ESP32,上层的业务逻辑 ideally (这个单词不懂的赶紧去查字典)不需要修改。
2. 硬件抽象层 (Hardware Abstract Layer, HAL)
这一层直接操作硬件寄存器。
-
System(系统级):DMA(直接存储器访问)、NVIC(中断控制)、RCC(时钟配置)、看门狗(IWDG/WWDG)、GPIO 等。这些是 MCU 运行的基础环境。
-
Connectivity(通信接口):CAN、I2C、UART、SPI、USB、ETH 等。这一层负责定义数据如何传输,但不关心传输的内容是什么。
-
Timers(定时器):RTC(实时时钟)、TIM(通用定时器)、PWM(脉宽调制)。用于时间基准和波形生成。
-
Analog(模拟量):ADC(模数转换)、DAC(数模转换)。
-
Computing(计算单元):CRC(循环冗余校验)。用于硬件加速的数据校验,这个新手基本不会用到。
-
核心作用:屏蔽硬件细节。例如,它提供 HAL_UART_Send() 函数,上层只需要调用这个函数发数据,而不需要去查阅几百页的手册去配置 UART 的控制寄存器。
3. 外设抽象层 (Peripheral Abstract Layer, PAL)
这一层是对 HAL 的进一步封装,它将“通信接口”转化为具体的“设备对象”。
-
Controller(执行器/控制器):电机、加热棒、LED、显示器、蜂鸣器、泵、WIFI 模块等。
-
例子:HAL 层只负责控制 GPIO 输出高低电平或 PWM 波;而 PAL 层的“电机”模块则负责将这些信号组合成“启动”、“停止”、“调速”等具体动作。
-
Sensor(传感器):温度、压力、编码器、湿度、激光传感器等。
-
例子:HAL 层只负责读取 ADC 的原始数值(如 0-4095);而 PAL 层的“温度传感器”模块则负责将 ADC 值通过公式转换为具体的摄氏度(℃),并处理滤波算法。
-
核心作用:面向对象化。这一层让代码看起来像是在操作真实的物理设备,而不是在操作寄存器。如果更换了同功能的传感器型号,只需修改这一层,上层业务无需感知。
4. 中间层 (Middleware Layer) – 通用服务与算法
这一层提供了跨平台的、通用的软件组件,它们不依赖于具体的业务,但为业务提供支持。
-
BasicServer / AlgorithmLibrary:基础算法库(如数学运算、信号处理)。
-
PIDController:经典的闭环控制算法,用于电机控制或温控。
-
Logger:日志记录系统,用于调试和追踪运行状态。
-
GUI:图形用户界面库,负责屏幕显示逻辑。
-
TCP/IP:网络协议栈,处理复杂的网络通信。
-
核心作用:复用性。这些模块通常是通用的,可以在不同的项目中直接拿来使用,避免重复造轮子。
5. 应用层 (App Layer) – 业务逻辑与调度
这是软件的顶层,直接对应产品的功能需求。
-
任务调度:
-
裸机运行:基于时间片轮询或前后台系统(超级大循环)。
-
RTOS (FreeRTOS, uC/OS-II):引入实时操作系统,进行多任务管理、信号量同步、消息队列通信。
-
业务逻辑层:
-
业务处理:具体的产品功能实现(如“当温度超过30度且有人靠近时开启风扇”)。
-
状态管理:通常使用状态机(FSM)来管理设备的运行模式(待机、运行、故障、升级中)。
-
芯片升级 (OTA):利用底层的 Flash 读写能力实现远程固件更新。
-
数据存储:管理配置参数、历史记录等。
-
异常检测:监控系统健康,处理报错。
-
核心作用:实现价值。这一层只关注“做什么”,完全不关心“怎么做”(底层是如何驱动电机的,网络是如何发包的,都由下层处理)。

总结:为什么要这样分层?
-
高内聚,低耦合:每一层只做自己该做的事。修改 LED 的驱动引脚(HAL层变动),不会影响到“报警逻辑”(App层)。
-
易于移植:如果要把代码从 STM32 迁移到 ESP32,你只需要重写 HAL 层 和部分 PAL 层,中间层 和 应用层 的代码几乎可以原封不动地复用。
-
并行开发:硬件工程师调试好 HAL 层后,软件工程师就可以利用桩代码(Mock)在 PAL 层之上先行开发业务逻辑,无需等待硬件完全就绪。
-
代码清晰:新人接手项目时,可以根据层级快速定位问题。如果是通信不通查 HAL/PAL,如果是逻辑错误查 App 层。
夜雨聆风