
1. STM32MP157 这块评估板到底解决的是什么问题我最早接触 STM32MP157是在一个工业 HMI 项目里。产品要求既要跑一套像样的图形界面又要同时处理多路串口和 EtherCAT 从站通信。如果在 SoC 上加一颗 MCU成本、功耗、PCB 面积全都要让步。ST 的 MP1 系列就是在这种场景下被拉出来的在同一个封装里放上 Cortex-A7 和 Cortex-M4让 Linux 负责“管大局”让 M4 核心负责“抠实时”两边用共享内存和通信协议握手。评估板在这里面的角色不是让你拿来做最终产品的而是帮你把“这颗芯片到底能不能扛住我的业务逻辑”这个问题在一个月内搞清楚。STM32MP157 不同于纯 MCU 的地方在于它的启动流程、系统烧录、外设资源分配、双核通信全都比 STM32F4 那一代要复杂一个量级。很多新手拿到板子的头一周不是死在写代码上而是死在“怎么把系统跑起来”这个环节上。所以这块评估板真正解决的问题是帮你把硬件、软件、工具链、启动链路的坑全部提前踩一遍。1.1 双核架构一台机器里住着两个性格完全不同的处理器Cortex-A7 是应用处理器跑 Linux 或者 Android 这类大型操作系统讲究的是虚拟内存、进程调度、丰富的驱动生态。Cortex-M4 是实时处理器讲究的是确定性的中断响应、精确到微秒级的时序控制典型地跑裸机代码或者 FreeRTOS 这种轻量级 RTOS。这两者在同一颗芯片里协同工作的方式是 STM32MP157 的核心卖点。举个最直观的例子你在 A7 侧用 Qt 写一个触摸屏界面显示产线上每台设备的实时电流同时在 M4 侧跑一个 1kHz 的电流采样任务采样数据通过共享内存写到一块环形缓冲区。A7 那边即使系统崩溃重启了M4 这边的采样和控制逻辑依然不会停。这在纯 MCU 方案里很难做到在双芯片方案里要额外加通信电路而在 STM32MP157 上就是一颗芯片、一段共享内存、一个 rpmb 通知的事。这里要单独说明一下STM32MP157 还有更细的型号区别。后缀带 A 的是单核 Cortex-A7带 C 的是双核带 D 的是低成本封装的单核带 F 的是主频更高的双核版本。如果产品规划中打算用双核 A7 跑重负载业务那选型时要一开始就锁定 C 或 F 系列别在单核上硬扛。1.2 官方评估板家族怎么选DK1、DK2、EV1 各有各的定位意法半导体为 STM32MP157 官方出了几个层次的评估板很多人第一次看到型号会有点懵A-DK1、C-DK2、F-EV1价格差了好几倍到底差在哪。型号处理器典型板载资源适合的人STM32MP157A-DK1单核 A7 M43.5 寸 LCD 接口、USB、以太网评估单核场景验证 Linux 基础能力STM32MP157C-DK2双核 A7 M4带电容触摸的 4.3 寸 LCD、Wi-Fi 模块、以太网多核应用、图形界面快速原型STM32MP157F-EV1双核 A7800MHz M4千兆以太网、MIPI CSI/DSI、更大的内存与存储完整功能评估、音视频、工业网关开发如果你只是想把 Linux 跑起来、看看 A7 的性能表现A-DK1 已经足够价格也更友好。如果你明确知道自己的业务需要两个 A7 核或者要做带触摸屏的交互界面C-DK2 是最平衡的选择官方出厂系统已经把一个完整的 Qt 触摸界面跑起来了。至于 EV1那是给严苛的原型验证留的比如同时接多路摄像头、走 HDMI、跑视频流这种场景下 DK1 和 DK2 的接口密度和内存容量都会成为瓶颈。除了官方板市面上还有不少基于米尔、正点原子等开发的第三方评估板。它们一般会额外集成串口转 USB 芯片、更大的 eMMC、甚至板载传感器有的还直接把底板和核心板做成可拆卸结构方便你后期直接复用核心板量产。选型时的核心思路是评估板的本质是“芯片能力的加速验证平台”不要只看板卡价格更要看你关心的外设接口是否齐全、是否有多余的 GPIO 拉出、官方 BSP 是否支持这块板子。2. 开箱第一步先让串口说话再把网线直连搞定很多人拿到评估板后犯的第一个错误是迫不及待地把 Type-C 线插上去想看到屏幕亮起。实际上对于 STM32MP157 这种 MPU串口控制台才是你与系统最直接、最可靠的交互通道。屏幕可以没有网口可以没配置但串口永远是你排查问题的最后一条退路。2.1 供电与串口控制台别在这里图省事STM32MP157 评估板通常用 USB-C 供电一般要求 5V/3A 左右的电源。注意这里对电源线材质有要求不要拿那种只有供电没有数据线的“充电线”来连因为它同时还要承担 USB 转串口的通信功能。我在项目里遇到过好几次控制台完全没有任何输出折腾了很久才发现是用户换了一根只有电源引脚的劣质线数据引脚根本没接。具体接线是这样的官方评估板板上有一颗 ST-LINK/V2除了给 STM32MP157 提供调试烧录能力之外还虚拟出一个串口。用 USB-C 线连接评估板的 USB 口和电脑后电脑上会出现一个 COM 口Windows或 /dev/ttyACM0Linux 开发主机。串口参数固定为 115200-8-N-1用 MobaXterm、PuTTY 或者 minicom 连接即可。如果是第三方评估板有的把串口单独用板对板连接器引出来需要准备一根 USB 转 TTL 串口线。接线时特别注意交叉连接开发板的 TX 接串口线的 RX开发板的 RX 接串口线的 TXGND 必须共地。我见过很多新手在这一步把 TX 对 TX、RX 对 RX 接了然后抱怨没输出。2.2 网线直连的两种玩法SSH 开发和 NFS 挂载根文件系统“stm32mp157网线直连”这个词最近在社区里热度挺高其实说的就是在没有路由器的情况下用一根普通网线把开发板和电脑直连用于调试和文件传输。评估板的以太网口大多是百兆或者千兆电脑的网卡也基本都支持自适应交叉所以不需要找交叉网线普通超五类线就行。第一种玩法是纯 SSH 访问。给开发板和电脑配上同一网段的静态 IP。开发板端我一般喜欢设为 192.168.1.10电脑端设为 192.168.1.100。如果开发板系统是官方 OpenSTLinux 发行版默认用户名是 root不用密码或者空密码直接ssh root192.168.1.10就能进去。这种方式适合把编译好的可执行文件用scp传上去然后跑起来看结果。第二种玩法更进阶把根文件系统挂在主机的 NFS 目录上。这样你在电脑上改代码、交叉编译完直接生成到 NFS 目录然后开发板重启就能运行最新程序。对内核模块调试、应用反复迭代的场景特别有用。配置时开发板上的 bootargs 要改成类似root/dev/nfs nfsroot192.168.1.100:/srv/nfs/rootfs,v3,tcp ip192.168.1.10:192.168.1.100::255.255.255.0::eth0:off这种玩法对网线直连的稳定性要求很高。网线接头、交换机端口、网卡驱动、防火墙任何一个环节出问题都会导致挂载失败。新手阶段我更建议先用第一种 SSH 方案把系统跑熟了再尝试 NFS。2.3 启动模式拨码开关决定系统的生死STM32MP157 支持从 SD 卡、eMMC、USB、串口等多种介质启动。评估板上一般有拨码开关或者跳线帽用于选择启动源。上电时 ROM 会根据启动引脚的电平配置自动从指定介质读取 FSBL第一级引导加载程序。我在实际开发中最常用的是 SD 卡启动。先把官方 OpenSTLinux 的 SD 卡镜像用工具写入一张 16GB 以上的高速 SD 卡插入评估板卡槽拨码拨到 SD 启动档位上电后从串口就能看到 U-Boot 的启动日志。U-Boot 出现之后系统基本上就成功了一大半。如果串口上完全没有输出先查电源灯是否亮起再查拨码档位是否正确最后查 SD 卡是否被正确识别。这个排查顺序能解决 90% 的开机无输出问题。3. 把 Linux 完整跑起来的实操链路镜像、SDK、第一行代码STM32MP157 的软件体系比普通 MCU 要重不少。官方给的是 Yocto 构建的 OpenSTLinux 发行版整个构建过程如果没有一台高性能 Linux 机器会非常痛苦。所以我强烈建议除非你有特殊定制需求否则直接用官方发布预编译好的镜像和 SDK不要从零开始跑 Yocto。这一步能把整个评估周期缩短至少一周。3.1 烧录 SD 卡启动镜像STM32CubeProgrammer 不只是调试器官方镜像下载下来之后解压得到一个.raw或者.img格式的文件。Linux 主机用dd直接写入 SD 卡sudo dd ifflashlayout_st-image-weston/FlashLayout_sdcard_stm32mp157c-dk2.raw of/dev/sdX bs8M convfsyncWindows 下可以用 Win32DiskImager 直接写。写完之后不要急着拔卡先用sync确保数据落盘最好再重新插拔一次电脑确认分区表是否被正确识别。写入成功后把 SD 卡插进评估板上电即可看到启动画面。STM32CubeProgrammer 的另一个典型用途是烧录 eMMC。当评估板从 USB 或串口进入 ROM 模式后用命令行工具烧写整个镜像STM32_Programmer_CLI -c portUSB1 -w flashlayout_st-image-weston/FlashLayout_emmc_stm32mp157c-dk2.tsv这个方式在公司产线批量烧录时也很常见因为它支持脚本化处理。我第一次用的时候也以为它只能连 ST-LINK 调试器实际它还能通过 USB DFU 直接和 ROM 里的 bootloader 对话烧写过程中完全不需要额外的调试器。3.2 搭建交叉编译环境官方 SDK 是最省心的选择交叉编译说白了就是在一台 x86 电脑上编译出能在 ARM 处理器上运行的程序。我见过有人在主机的/usr/bin/gcc上硬编然后把编译出来的 x86 程序拖到开发板上运行报错后一脸茫然。务必要用交叉编译工具链。ST 官方提供了 SDK 安装脚本装完后会在你的用户目录生成一个环境变量文件cd /opt/st/stm32mp1/3.1/openstlinux-5.10-digi-23.06.20 ./st-image-weston/install_weston_sdk.sh安装完成后每次打开新终端先执行source /opt/st/stm32mp1/3.1/sdk/environment-setup-cortexa7t2hf-neon-vfpv4-openstlinux_weston-lts-gnueabi然后就可以直接使用$CC变量来编译了。写一个最简单的 C 程序验证#include stdio.h int main(void) { printf(STM32MP157 hello, board!\n); return 0; }编译命令$CC hello.c -o hello file hello如果file输出显示ARM架构说明工具链环境正常。再用scp hello root192.168.1.10:/home/root/传到开发板运行即可看到输出。3.3 内核模块与 GPIO 小实验让系统真正为你所用跑通 u-boot 和 Linux 后很多人就不知道该干嘛了。我个人建议第一个正式实验是做 GPIO 控制。STM32MP157 的 GPIO 在 Linux 下有两种常见操作方式老的 sysfs 接口和新的 gpiod 接口。官方内核默认支持 gpiod可以直接在用户态用 libgpiod 工具操作。比如想把评估板上某个空闲 GPIO 拉高先在开发板上查看可用 GPIOgpioinfo输出会列出每个 gpiochip 和对应的引脚号。假设找到了一个空闲引脚比如 gpiochip0 的第 10 号gpioset gpiochip0 101执行之后用万用表量对应引脚如果电压变成高电平说明 Linux 侧 GPIO 驱动已经正常运转。这个实验看起来简单但它同时验证了设备树、pinctrl、GPIO 驱动、用户态工具链四个环节是否都配置正确。后续如果要做 LED 指示、继电器控制、按键检测都基于这一套。如果要做内核模块开发步骤也不复杂。用 SDK 里的内核源码编译一个最简单的.ko文件传到开发板用insmod加载。不过这要求内核源码和开发板运行的内核版本完全一致建议直接使用 SDK 自带的linux-stm32mp源码目录不要自己从内核官网拉一个新版本。4. Cortex-M4 协处理器的开发套路与 MPU 配置思路STM32MP157 的另一个重头戏是 Cortex-M4。这颗核心不跑 Linux而是跑裸机或者 RTOS。在 Linux 系统里M4 更像是 A7 的一个“远程处理器”由 remoteproc 框架管理它的加载和启动。4.1 用 STM32CubeMX 生成 M4 裸机工程ST 提供了一个很好的工具链路径用 STM32CubeMX 创建针对 Cortex-M4 的裸机工程。启动 STM32CubeMX 后选择型号 STM32MP157C 或具体评估板型号软件会自动载入芯片的引脚定义和外设配置视图。这里要特别注意M4 和 A7 分属两个不同的“上下文”CubeMX 界面里会用不同的选项卡区分。你在配 M4 的 GPIO、UART、定时器时要确保选择的是 Cortex-M4 context否则生成的代码会被错误地放到 A7 侧。工程生成后选择你要用的工具链比如 GCC/arm-none-eabiCubeMX 会生成一个完整的裸机工程。编译得到可执行文件.elf核心问题就变成这个固件怎么加载到 M4 里去运行。4.2 remoteproc 加载让 Linux 帮你把 M4 固件跑起来在 OpenSTLinux 里面M4 固件的常见加载方式有两种。第一种是把固件放到/lib/firmware/目录下然后在 sysfs 里触发加载cp cortex_m4_firmware.elf /lib/firmware/ echo start /sys/class/remoteproc/remoteproc0/state执行后M4 就会从 A7 指定的内存地址开始执行。硬件上 M4 和 A7 通过共享内存通信常见配合是 RPMSG 协议Linux 侧有rpmsg_char驱动M4 侧有 ST 提供的openamp库。跑通一个简单的 ping-pong 测试程序两个核之间就能互发字符串了。另一种是直接在 U-Boot 阶段加载 M4 固件。这种方式适合 M4 需要在 Linux 启动前就工作的场景比如工业现场需要 M4 在上电瞬间就接管 IO 控制。在 U-Boot 环境变量中指定 M4 固件地址和入口地址U-Boot 会在跳转 Linux 前把 M4 启动起来这样两个核心几乎同时开始工作互不干扰。4.3 RTOS/AUTOSAR 下的 OS MPU 配置与 DaVinci Configurator 的定位在很多工业客户的实际工程里M4 上跑的并不是简单的裸机循环而是带内存保护的操作系统比如 FreeRTOS 打开 MPU 支持或者走 AUTOSAR OS 路线。这里就涉及到一个热词OS 层的 MPUMemory Protection Unit配置。MPU 的作用是给内存访问做权限控制。嵌入式系统里最怕的就是一个野指针把系统栈区或关键外设寄存器区给破坏了。打开 MPU 后你可以把内存划分为不同的 region比如任务栈区域只允许读写、外设寄存器区域只允许特权模式访问、共享内存区域允许 A7 和 M4 双端读写。一旦有非法的内存访问触发CPU 会立刻进入 MemManage 异常而不是让程序悄悄崩掉。配置 MPU 的方法取决于你用哪个 OS。裸机场景可以直接写寄存器比如MPU-RNR选 region 号MPU-RBAR设置基地址MPU-RASR设置访问属性和大小。FreeRTOS 则需要在其FreeRTOSConfig.h中开启configUSE_MPU_WRAPPERS然后用它的封装 API 创建受保护任务。如果你走的是 AUTOSAR 路线事情会更标准化一点。AUTOSAR OS 内核里会用到 MPU 来做任务隔离和内存保护。在配置这类 OS 工程时很多人会用 DaVinci Configurator 这种 AUTOSAR 工具链它可以在图形界面上把 OS 的调度表、任务优先级、内存分区和 MPU region 一次性定义好。工具自动生成配置代码避免手写寄存器带来的低级错误。对 STM32MP157 的 M4 核来说AUTOSAR OS 配合 DaVinci Configurator 的流程在汽车电子和高端工业控制领域是非常常见的配套组合。不过这类工具链本身有授权门槛一般不适用于小团队快速原型所以我个人的建议是入门阶段先把裸机和 FreeRTOS 的 MPU 配置玩明白再决定是否上 AUTOSAR。5. 实测中容易翻车的几类问题与完整排查链路这部分是整篇文章里我最想写的内容。STM32MP157 评估板的问题排查和单片机开发完全是两种思路。这里没有 IDE 里的“一键下载”也没有仿真器里的“单步执行”那么直觉化。问题往往不会直接出现在表面而是藏在链路中层。5.1 网线直连后 SSH 连不上的完整排查思路热词里“stm32mp157网线直连”是搜索量最高的一个说明很多人栽在了这里。我按实际发生的频率列出排查步骤第一步确认物理链路。开发板网口指示灯是否亮起不亮就换网线。插好后在开发板串口控制台执行ip link show确认 eth0 是否有UP状态。如果没有先ip link set eth0 up手工拉起。第二步确认 IP 地址。直连场景下建议两边都用静态 IP。在开发板执行ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up电脑端把网卡 IP 改为 192.168.1.100。两边互相 ping 一下。如果 ping 通但 SSH 连不上多半是 SSH 服务没启动或者防火墙检查开发板的 sshd 进程和电脑端防火墙对 22 端口的限制。第三步如果 ping 不通回到串口控制台看是否有网络驱动相关的错误。有些第三方评估板的以太网 PHY 芯片和官方板不同需要修改设备树中 PHY 的地址或者驱动匹配否则网口驱动默认去探测不存在的 PHY导致 eth0 起不来。5.2 上电后串口只有 ROM 模式输出系统就是不启动这是一个非常典型的现象串口能看到类似下面的输出然后系统卡住U-Boot 2021.10-stm32mp1 ...如果卡在 U-Boot 中段屏幕上没有任何后续信息先怀疑以下几种情况。第一是 SD 卡镜像没写完整或卡本身质量不行。用dd写完后拔卡前务必sync写完后还可以在电脑上用fdisk -l /dev/sdX检查是否出现了多个分区。如果分区表都看不到重新写并且换一张知名品牌的高速卡。我遇到过很多次镜像没问题就是卡是翻新卡读取时偶发错误。第二是设备树里指定的内核镜像文件不存在或者 bootargs 里的分区名不对。在 U-Boot 界面按任意键进入命令行执行mmc dev 0 ls mmc 0:4查看 rootfs 分区的内容确认uImage或Image文件是否在正确位置。如果文件在但始终加载失败看 U-Boot 环境变量里的kernel_image名称是否和设备树中一致。第三如果 U-Boot 完成加载但 Linux 启动到一半停止多数是内核启动参数问题。特别是你在调试 NFS 启动或者改过 console 参数后很容易因为 root 设备找不到而挂掉。回到原始默认启动方式确认能正常进入系统再逐步改动 bootargs。5.3 评估板选型时容易被忽略的几个隐性成本最后再说说选型。很多人以为选评估板就是对比价格和尺寸但真正开发时隐性成本往往比板卡价格更值得关注。首先是文档和 BSP 的完整度。官方板因为用户量大资料更新快遇到问题容易在社区搜到解决方案。第三方板卡如果选的是冷门型号厂家提供的 BSP 可能长期不更新内核版本停留在老版本后面你想用新驱动或安全补丁会很痛苦。其次是外设引出的便利性。评估板好不好用很大程度上取决于板子上拉出了多少可用的 GPIO 和接口。有的板子虽然便宜但大量引脚被封在底板连接器内部你需要自己飞线调试起来非常费劲。选板时优先看有没有引出排针、有没有板载传感器、有没有标准的摄像头和屏幕接口这些直接决定你搭原型环境的速度。第三是功耗和散热。STM32MP157 在 A7 满载运行时的发热量不能低估。官方 DK 板在小负载下摸起来只是温热但如果跑图形界面加网络传输温度会明显上升。如果是长时间高负载验证尤其是做压力测试建议给评估板加一个主动散热风扇。很多莫名其妙的死机、重启、USB 断开现象排查到最后都是过热引起的。我自己在选型时还有个习惯先明确三个月后要交付的 demo 是什么形态。如果你的 demo 是“Linux 界面 M4 实时控制”那就必须选同时能方便调试两个核的板卡最好串口控制台和第二路调试口都齐备。如果 demo 只是验证一下 A7 跑 Linux 的能力那入门级 DK1 就够用没必要为用不上的外设多花钱。前期把需求边界想清楚后面能省掉很多换板子的痛苦。STM32MP157 评估板的乐趣在于它把“跑 Linux 的低成本硬件”和“实时控制能力”结合在了一起。动手之前别急着写代码先把核心链路跑通串口能输出、网线能直连、SD 卡能启动、M4 固件能加载。把这四关过了这颗芯片的能力边界你也就摸得差不多了。后面不管是上 Qt 界面、接 Modbus 总线还是跑 EtherCAT 主站都只是在完成四大件之后按部就班地填外设驱动而已。