2. STM32MP1异构架构与工业网关系统框图
STM32MP1 与常见的单核 MCU 或纯应用处理器最大的区别,在于它把一颗 Cortex-A7 应用核和一颗 Cortex-M4 实时核封装在同一颗芯片内,两者共享部分存储与外设资源,又各自拥有独立的运行域。理解这种“异构”结构,是设计工业网关硬件架构的起点:A7 负责跑 Linux、协议栈、Web 服务与数据汇聚,M4 负责硬实时采集、PWM、快速保护与确定性响应。本节围绕分工、内存映射、外设分配和硬件框图设计方法展开。
一、A7 与 M4 的分工逻辑
STM32MP157 内部集成双核 Cortex-A7(最高 650MHz~800MHz,视型号与散热而定)和单核 Cortex-M4(最高 209MHz)。A7 侧运行 OpenSTLinux,具备 MMU、Cache、DDR 控制器,适合处理非确定性任务:Modbus TCP/RTU 协议解析、MQTT 上云、SQLite 数据缓存、Web 配置界面、文件系统与 OTA。M4 侧运行裸机或 RTOS(如 FreeRTOS),没有 MMU,中断延迟可稳定在微秒级,适合处理:高速 ADC 采样、编码器计数、PWM 输出、看门狗喂狗、急停信号捕获、以及需要严格周期性的现场总线从站响应。
分工的核心判断依据是时间确定性与软件复杂度。凡是“必须在确定时间内完成、且不能因 Linux 调度抖动而延迟”的任务,交给 M4;凡是“需要网络、文件、图形、复杂协议栈”的任务,交给 A7。两者通过 IPCC(处理器间通信控制器)和共享内存进行数据交换,典型方式为 RPMsg 或 OpenAMP。
二、内存映射与共享区域
STM32MP1 的存储空间需要从两个视角看:A7 视角和 M4 视角。A7 启动后由 TF-A、U-Boot、Linux 依次接管,DDR 被划分为 Linux 内核区、用户空间、以及预留的共享内存区。M4 可以访问 MCU SRAM(如 384KB)、Retention RAM、以及部分 DDR 区域。工业网关设计中,通常把 DDR 中一段固定物理地址(例如 0xDFF00000 起 1MB)划为共享内存,A7 侧通过 reserved-memory 设备树节点声明,M4 侧通过链接脚本定位,双方约定环形缓冲区结构。
外设寄存器方面,M4 通过 AHB 总线访问大部分外设,但部分外设默认分配给 A7。需要通过 ETZPC(扩展信任区控制器)和 RCC 配置,把特定外设“分配”给 M4 或 A7。例如把 ADC1、TIM2、USART2 分配给 M4,把以太网 MAC、USB、SDMMC 留给 A7。分配错误会导致 M4 访问外设时触发总线错误或读回全零。
三、外设资源分配原则
工业网关常见外设包括:双以太网(现场网 + 上云)、多路 RS485、CAN、DI/DO、ADC、以及本地存储。分配时遵循三条原则:
- 实时性优先:RS485 半双工收发切换、CAN 报文过滤、DI 去抖、DO 互锁,放在 M4,避免 Linux 用户态调度造成毫秒级抖动。
- 带宽与协议优先:以太网、USB、WiFi 模组、文件系统,放在 A7,利用 Linux 成熟驱动。
- 共享外设谨慎处理:若同一外设需双核访问,必须通过 IPCC 做互斥,或干脆只由一侧控制,另一侧通过消息请求。
下面这张系统框图给出一个典型的 STM32MP157 工业网关硬件架构:左侧是现场侧,右侧是云端与本地侧,中间是双核与共享资源。
四、硬件架构设计方法
设计一块 STM32MP1 工业网关板,建议按以下顺序推进,而不是先画原理图再想软件分工。
第一步,列出现场接口清单与实时性要求。例如:4 路 RS485 需要 10ms 内响应 Modbus 查询;2 路 CAN 需要 1ms 周期收发;8 路 DI 需要 1ms 去抖;4 路 AI 需要 100μs 采样。把这些指标写成表格,标注“硬实时 / 软实时 / 非实时”。
第二步,按实时性把接口划到 M4 或 A7。硬实时全部归 M4;软实时可归 A7 但需评估抖动;非实时归 A7。划分后检查 M4 的引脚、定时器、ADC 通道是否够用。STM32MP157 的 M4 可访问的外设数量有限,若 RS485 超过 4 路,可能需要外扩 SPI 转 UART 芯片,或改用 A7 侧 USB 转串口。
第三步,确定共享内存布局与通信协议。在设备树中预留 reserved-memory,例如:
reserved-memory {
m4_shared: m4_shared@dff00000 {
reg = <0xDFF00000 0x100000>;
no-map;
};
};
M4 侧链接脚本把 .shared_data 段定位到同一地址。双方约定环形缓冲区头结构:写指针、读指针、长度、校验。A7 通过 /dev/rpmsg0 收发,M4 通过 IPCC 中断触发。
第四步,分配外设并验证。在 TF-A 的 etzpc 配置中把 ADC1、TIM2、USART2、FDCAN1 标记为 M4 可访问;在 Linux 设备树中把这些节点 status = "disabled",避免 A7 驱动抢占。上电后,M4 先启动,初始化外设并点亮心跳 LED;A7 启动后通过 RPMsg 发送“握手”消息,M4 回复版本号,确认通信链路正常。
五、一个可参考的分配示例
| 资源 | 归属 | 理由 | 示例参数 |
|---|---|---|---|
| RS485 ×4 | M4 | 半双工切换需 μs 级 | USART2/3/6 + TIM 控制 DE |
| CAN ×2 | M4 | 报文过滤与周期发送 | FDCAN1/2,1Mbps |
| DI/DO | M4 | 去抖与互锁 | GPIO + EXTI,1ms 扫描 |
| AI ×4 | M4 | 100μs 采样 + 滤波 | ADC1 多通道 + DMA |
| 以太网 ×2 | A7 | Linux 网络栈成熟 | GMAC1/2,RGMII |
| USB / SD | A7 | 文件系统与配置导入 | USB2.0 OTG + SDMMC1 |
| 共享内存 | 双核 | 数据交换 | 0xDFF00000,1MB |
这张表不是固定答案,而是示范“如何把实时性要求翻译成资源归属”。实际项目中,若 RS485 只需 100ms 响应,也可放到 A7 用用户态串口处理,从而释放 M4 资源给更关键的电机控制。架构设计的本质,是在确定性、成本、开发难度之间做取舍,而 STM32MP1 的异构结构恰好提供了这种取舍的硬件基础。