1. 课程导入与STM32MP平台认知

《STM32MP设备数据采集与边缘服务》这门课程要解决的核心问题很具体:如何让一台嵌入式设备在现场把传感器、仪表、PLC 或总线的数据稳定读进来,经过必要的处理与缓存,再以标准协议对外提供服务,并在网络中断、掉电、数据异常等情况下仍然保持可恢复、可诊断。它不是单纯的“单片机读写寄存器”,也不是纯粹的“Linux 应用开发”,而是把实时采集与网络服务这两类差异很大的任务放到同一颗芯片上协同完成。

先厘清两个关键词。数据采集指从物理世界获取量测值并转化为可用的数字量:包括传感器接口(I²C、SPI、模拟量)、工业总线(RS-485/Modbus、CAN)、采样周期、量程与单位换算、时间戳、质量码。边缘服务指在靠近数据源的位置完成数据组织与对外交付:包括本地缓存、协议转换(Modbus TCP、MQTT、HTTP/REST)、断网续传、设备状态上报、远程配置。二者不是先后关系,而是持续耦合的闭环:采集决定服务的输入质量,服务的反馈(如采样周期调整、阈值下发)又反过来影响采集行为。

采集与服务的耦合点通常有三处:一是时间基准,采集时间戳必须与服务上报时间可对齐;二是数据模型,采集通道编号、单位、量程要能直接映射为服务端可识别的点位;三是异常语义,采集侧的“超时、越限、无效”要能作为服务质量位传递出去,而不是被静默丢弃。

STM32MP 系列是 ST 推出的微处理器产品线,定位介于传统 MCU 与通用应用处理器之间。它内部集成 Arm Cortex-A 应用核与 Cortex-M 实时核,形成双核异构架构。以 STM32MP157 为例,常见配置为双核 Cortex-A7(最高约 650MHz~800MHz,视具体型号与等级)+ 单核 Cortex-M4(约 209MHz),A7 侧运行 Linux(如 OpenSTLinux),M4 侧可运行裸机或 RTOS 固件。A7 与 M4 之间通过硬件 IP 通信,典型通道包括 IPCC(核间中断控制器)与共享内存,配合 OpenAMP/RPMsg 框架实现消息传递。

这种分工的价值在于:Cortex-M 负责确定性任务,Cortex-A 负责复杂性与连接性。M4 适合处理硬实时采集——固定周期采样、编码器计数、PWM 触发 ADC、CAN 报文收发、看门狗喂狗;它的中断响应确定、无操作系统调度抖动。A7 适合处理文件系统、网络协议栈、数据库、Web 服务、TLS 加密、日志与远程升级。把两者放在一颗芯片上,既避免了“MCU 跑不动协议栈、AP 做不了硬实时”的两难,也减少了板级互连与功耗开销。

STM32MP 双核异构:采集与服务分工 现场与传感器 温度/压力变送器 4–20mA / 0–10V I²C / SPI 数字传感器 RS-485 Modbus RTU CAN 总线节点 编码器 / 脉冲计数 DI/DO 开关量 ADC 多通道采样 PWM 触发同步采集 看门狗 / 复位信号 时间同步 (PPS/IRIG) 物理量 Cortex-M4 实时核 裸机 / FreeRTOS · 约209MHz 定时器触发 ADC 采样 I²C/SPI 读取传感器 UART 收发 Modbus RTU CAN 报文过滤与解析 量程换算 / 单位归一 时间戳 / 质量码标注 看门狗 / 异常复位 核间通信 IPCC 共享内存 RPMsg OpenAMP Cortex-A7 应用核 Linux / OpenSTLinux · 约650MHz 数据缓存 / 环形队列 SQLite / 时序数据存储 Modbus TCP 服务端 MQTT 客户端 / 断网续传 HTTP/REST 配置接口 TLS 加密 / 证书管理 日志 / 远程升级 OTA 云 平 台 MQTT Broker SCADA M4 侧保证采样周期确定性与硬实时响应;A7 侧承担协议栈、存储、加密与远程运维;IPCC + 共享内存完成数据与控制指令的双向传递

理解这张分工图后,可以进一步明确本课程的能力目标。第一,能在 Cortex-M4 侧用定时器触发 ADC 或通过 I²C/SPI 读取传感器,按固定周期完成采样,并给每个采样值打上时间戳与质量码。第二,能通过 IPCC/RPMsg 把采集数据从 M4 传递到 A7 侧的 Linux 用户空间,理解消息通道、缓冲区大小与阻塞/非阻塞语义。第三,能在 A7 侧用 Python 或 C 编写边缘服务,把数据写入本地缓存,并通过 Modbus TCP 或 MQTT 对外发布。第四,能处理断网、掉电、数据积压等异常,验证缓存续传与数据完整性。

一个具体的教学示例可以帮助建立数量级概念。假设 M4 侧以 100Hz 采集 4 路 16 位 ADC 通道,每帧数据包含 4 个通道值、1 个 32 位时间戳和 1 个 8 位质量码,则每帧约 4×2+4+1=13 字节,100Hz 下约 1.3KB/s。这个速率对共享内存和 RPMsg 都很轻松,但若在 A7 侧用逐条 SQLite 插入,可能因事务开销导致写入延迟累积。合理做法是批量提交:每 100 帧(约 1 秒)组成一个事务写入,或先写入内存环形队列再由独立线程落盘。这类“采集速率—传输通道—存储方式”的匹配关系,是本课程反复要训练的判断能力。

学习本课程时建议始终带着三个问题看每一节:数据从哪个物理接口进来?在 M4 和 A7 之间以什么形式、什么频率传递?最终以什么协议、什么数据模型对外提供服务?这三个问题能把零散的寄存器配置、驱动移植和服务代码串成一条完整链路。

需要特别注意的是,双核异构并不意味着可以随意把任务丢给某一侧。M4 侧资源有限(SRAM 通常几百 KB 量级,无 MMU),不适合跑 TCP/IP、文件系统或复杂加密;A7 侧 Linux 调度存在毫秒级抖动,不适合直接承担微秒级硬实时采样。正确的做法是让 M4 做“确定性的前端”,让 A7 做“灵活的后端”,两者通过明确定义的消息格式解耦。消息格式一旦确定,两侧可以独立开发、独立测试,这也是本课程后续实践的基本工程方法。