概述
上一篇《MCU 项目软件分层设计规范——以 MCU 项目为例》介绍了 MCU 软件分层的设计原则、各层职责以及模块依赖关系。
有了分层规范,接下来更重要的问题是:如何把这些原则真正落到一个可运行、可持续迭代的 STM32 工程中?
接下来我准备了一系列文章,介绍软件分层工程目录怎样创建,还将以 GPIO、UART、ADC、TIM、I2C、SPI 等常用外设为例,演示外设驱动如何在 BSP、Driver、Device、Service、Application 等层中完成封装与调用。
文章不会把外设拆成彼此独立的示例,而是让每个模块都在同一个工程中逐步演进。每完成一篇文章,工程都会增加一个可编译、可下载、可验证的功能模块。
最终,这些模块将组成一个具备设备监测、阈值告警、参数保存、历史记录和通信控制能力的小型 STM32 RT-Thread 工程项目。
通过本系列文章,你将学会:
- 如何搭建一个基于 STM32 和 RT-Thread 的软件分层工程框架;
- 如何建立 BSP、Driver、Device、Service、Application 等分层目录;
- 如何明确各层模块的职责、接口与依赖关系;
- 如何将 GPIO、UART、ADC、PWM、I2C、SPI、UDP 等外设纳入统一工程;
- 如何完成 UART DMA 不定长接收、命令解析和日志输出;
- 如何实现 ADC 数据采集、电压换算、滤波和阈值告警;
- 如何使用 PWM 实现蜂鸣器告警和 LED 呼吸效果;
- 如何通过 EEPROM 实现参数掉电保存与上电恢复;
- 如何使用 SPI Flash 保存历史告警和运行日志;
- 如何通过 UDP 实现设备状态上报和远程控制;
- 如何让多个外设模块在同一个 STM32 工程中协同工作。
最终得到的不是一组零散的外设例程,而是一个可以运行、便于理解、能够继续扩展的 STM32 分层工程。
一、开发环境
| 项目 | 内容 |
|---|---|
| MCU / 开发板 | STM32F429 正点原子开发板 |
| 操作系统 | RT-Thread |
| 开发工具 | Keil MDK、STM32CubeMax |
| 底层驱动方式 | RT-Thread 设备框架为主,STM32 HAL 为辅 |
不同开发板的引脚、外设实例和 BSP 配置可能有所差异,但工程组织方式、模块边界和实现思路可以复用。
二、最终工程目标
最终工程将包含以下模块,每层职责明确:
| 层级 | 职责 | 不应做的事 |
|---|---|---|
| app | 收敛业务变化,业务编排、状态机 | 不直接调用下层硬件接口 |
| service | 收敛通用能力,数据处理、策略、告警判断 | 不直接操作 HAL 或寄存器 |
| device | 收敛设备差异,具体设备接口抽象 | 不决定系统工作模式 |
| bsp | 收敛板级资源差异,引脚定义、外设实例配置 | 不放业务逻辑 |
| platform | 承接底层平台环境(RT-Thread 内核、HAL 驱动) | 不包含业务相关定制 |
| component | 沉淀可复用能力(环形缓冲区、CRC、滤波算法等) | 不依赖具体业务或硬件实例 |
GPIO
├── LED 状态指示
└── 按键输入与模式控制
Timer
├── 软件定时器
└── 周期任务处理
UART
├── 日志输出
├── FinSH / MSH 调试终端
├── DMA 不定长接收
└── 串口命令处理
ADC
├── 模拟量采集
├── 电压换算
├── 数据滤波
└── 阈值告警
PWM
├── 蜂鸣器控制
├── LED 呼吸效果
└── 声光告警策略
I2C
└── AT24Cxx EEPROM 参数保存与上电恢复
SPI
└── W25Q128 Flash 历史告警与运行记录存储
UDP
├── 设备状态上报
└── 外部控制命令接收
最终将形成如下业务闭环:
ADC 检测到低电压
↓
换算、滤波、阈值判断
↓
生成低压告警
├── LED 切换故障状态
├── PWM 驱动蜂鸣器提示
├── UART 输出告警日志
├── UDP 上报告警信息
└── W25Q128 保存历史记录
系统阈值、工作模式等配置也支持掉电保存:
按键 / UDP 修改参数
↓
更新系统配置
↓
AT24Cxx EEPROM 保存
↓
下次上电自动恢复
三、文章路线
| 篇章 | 主题 | 版本 | 重点内容 |
|---|---|---|---|
| 第 1 篇 | 基础工程框架搭建 | v0.1 | 分层目录[[]]、初始化流程、公共配置、FinSH、版本信息 |
| 第 2 篇 | GPIO:LED 与按键封装 | v0.2 | LED 控制、按键事件、输入输出封装 |
| 第 3 篇 | 定时器与周期任务 | v0.3 | 软件定时器、周期执行、状态更新 |
| 第 4 篇 | UART:日志、DMA 接收与命令处理 | v0.4 | DMA 接收、环形缓冲区、日志与命令解析 |
| 第 5 篇 | ADC:采集、滤波与阈值告警 | v0.5 | 电压采样、数据滤波、告警事件 |
| 第 6 篇 | PWM:蜂鸣器与呼吸灯 | v0.6 | PWM 输出、声光告警效果 |
| 第 7 篇 | I2C:AT24Cxx EEPROM 参数存储 | v0.7 | 页写处理、CRC、掉电保存与恢复 |
| 第 8 篇 | SPI:W25Q128 Flash 历史记录 | v0.9 | 擦除、页编程、历史日志管理 |
| 第 9 篇 | UDP: 通信与状态上报 | v0.10 | lwIP 移植、UDP 通信、状态上报、远程命令 |
| 第 10 篇 | 数据处理:指令解析与参数管理 | v0.11 | 上位机指令解析、参数管理、状态上报 |
| 第 11 篇 | 综合案例:设备监测系统 | v1.0 | 多模块协作、完整业务闭环 |
| 第 12 篇 | 工程复盘与扩展方向 | v1.1 | 工程结构、模块关系、扩展思路 |
四、下一篇预告
下一篇将从 v0.1 开始,搭建基于 STM32F429 和 RT-Thread 的分层基础工程框架,完成:
- STM32F429 BSP 正常启动
- RT-Thread 基础运行环境配置
- FinSH / MSH 串口终端可用
- 建立 app、service、device、bsp、platform、component 分层目录
- 配置公共头文件、项目配置与版本信息
- 设计工程统一初始化入口
- 输出工程启动日志
- 为后续外设模块预留目录和接口位置
从 v0.1 开始,后续每增加一个模块,都会在同一个 STM32 工程中持续演进。
关注我,一起从零构建一个可运行、可维护、可持续迭代的 STM32 分层工程。
101

被折叠的 条评论
为什么被折叠?



