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 做不了硬实时”的两难,也减少了板级互连与功耗开销。
理解这张分工图后,可以进一步明确本课程的能力目标。第一,能在 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 侧资源有限(SRAM 通常几百 KB 量级,无 MMU),不适合跑 TCP/IP、文件系统或复杂加密;A7 侧 Linux 调度存在毫秒级抖动,不适合直接承担微秒级硬实时采样。正确的做法是让 M4 做“确定性的前端”,让 A7 做“灵活的后端”,两者通过明确定义的消息格式解耦。消息格式一旦确定,两侧可以独立开发、独立测试,这也是本课程后续实践的基本工程方法。