板子还没捂热,先把串口线插上,电脑风扇声一响,U-Boot 日志刷刷往下滚——这种“从零把一个 MPU 跑起来”的体验,和以前玩 MCU 完全是两个世界。STM32MP157 这颗料在这波异构 MPU 里热度一直不低,双核 Cortex-A7 跑 Linux、Cortex-M4 做实时控制,一块板子能同时干应用处理器和单片机的活。很多人拿到评估板的第一反应是“我该先点灯还是先跑系统”,我的建议是:先把硬件手册里那些启动、供电、网络接口的说明吃透,再动手。这篇就围绕手头这块带 STM32MP157 的评估板,把从选板、上电、连网到配 Linux 的完整链路捋一遍,全是实操视角,适合刚入坑 MPU 开发的工程师,也适合正在评估板卡选型的朋友。
1. 先搞清这颗 MPU 能干什么,再谈评估板选型
1.1 MPU 和 MCU 不再是二选一:STM32MP157 的异构架构
很多从 STM32F4、H7 走过来的朋友,第一次听到 STM32MP157 是“MPU”而不是“MCU”,多少有点懵。简单区分:MCU 是单片机,跑裸机或者 RTOS,引脚多、外设丰富、实时性好;MPU 是微处理器,主频高、能跑 Linux,但传统上需要外部配 DDR、电源管理、存储,外围电路复杂得多。STM32MP157 把这两者的边界给抹掉了——片内集成了双核 Cortex-A7,最高跑到 650MHz,还有一颗 Cortex-M4,最高 209MHz。A7 跑 Linux 或 Android,负责用户界面、网络协议栈、文件系统这些重活;M4 跑裸机或 FreeRTOS,专门处理中断密集、时序要求高的实时任务。
这种异构架构的实际意义,得用场景说话。比如做一个带 HMI 的工业控制器:过去只能用“ARM9/Linux + 独立 MCU”的组合,两块芯片要设计两套供电、两套调试口、中间还得加串口或 SPI 通信协议。现在一颗 STM32MP157 就搞定了,A7 上跑 Qt/图形界面,M4 直接采集编码器或执行快速闭环,两边通过共享内存或 RPMsg 通信,省掉的 BOM 成本和联调时间相当可观。
所以评估板的价值,不只是“能跑 Linux”这么简单。对于第一次接触这类异构 MPU 的开发者,评估板把最小系统的坑全部替你踩完了——DDR 布线、电源时序、复位电路、启动配置,这些都是照着参考设计画 PCB 时最容易翻车的地方。买一块官方或者大厂的评估板,本质上是买一个“已验证可行”的硬件起点,后续要么直接在这块板子上做原型验证,要么等软件调通后再照着参考设计画自己的板子。
1.2 评估板选型时我重点看四样东西
评估板不是越贵越好,关键是看它跟你目标产品的重合度。我一般会重点检查四个方面:
第一是 DDR 类型和容量。STM32MP157 支持 DDR3、DDR3L、LPDDR2、LPDDR3,评估板上通常焊的是 DDR3L 或 LPDDR2,容量从 256MB 到 1GB 不等。如果你最终产品打算用 512MB 的 DDR3L,那选板时最好选同类型同容量的,因为软件侧的 DDR 初始化参数(训练序列、时序参数)是跟着具体颗粒走的,早期在评估板上把 DDR 调稳,后面移植到自己的板子能省很多事。
第二是存储介质和启动方式。绝大多数评估板会提供 SD 卡启动、eMMC 启动、USB 烧录这几条链路。SD 卡启动最适合开发阶段,因为换内核、换根文件系统只需要重新烧一张卡;eMMC 启动更接近量产形态。我建议优先选带 MicroSD 卡槽且支持从 SD 卡启动的板子,开发调试期间你会感谢这个设计。
第三是网络接口。STM32MP157 内部带千兆以太网 MAC,但 PHY 芯片是外置的,评估板通常会配一个 RGMII 接口的 PHY(比如 KSZ9031、RTL8211F)。网络接口对你后期调试至关重要——NFS 挂载根文件系统、SSH 登录、scp 传文件、在线装软件包,全都依赖网口。有些板子还带 WiFi 模块,但开发阶段有线网口永远比无线稳定,别为了省一个网口去买阉割版。
第四是调试和扩展接口。至少要有标准的 2.54mm 排针引出大部分 GPIO,这样接逻辑分析仪、传感器、外部设备才方便。调试接口方面,ST-Link 或者 JTAG/SWD 至少要有一个。另外留意板子上是否预留了 Arduino 兼容排针或 Raspberry Pi 兼容接口,这类生态兼容设计能让你复用很多现成的扩展板。
用一个表格总结 MCU 板和 MPU 板的选型关注点差异:
| 维度 | MCU 评估板(如 STM32F4) | MPU 评估板(如 STM32MP157) |
|---|---|---|
| DDR | 不需要关注 | 容量和型号直接影响后续移植 |
| 启动方式 | 一般 SWD 烧录即可 | SD/eMMC/USB 多链路,需要理解 boot 流程 |
| 网络 | 多为可选扩展 | 千兆网口是刚需,调试和挂载都用它 |
| 软件环境 | 裸机/RTOS,IDE 直接点运行 | Linux 交叉编译、设备树、U-Boot,工具链复杂得多 |
| 电源 | 3.3V/5V 简单供电 | 多路电源时序,不能随便上电 |
2. 从用户手册里拆解评估板的硬件设计
2.1 供电系统的分层设计:MPU 比 MCU 娇贵在哪
拿到用户手册,我第一件事不是看引脚定义,而是看供电框图。STM32MP157 评估板的外部输入通常是 5V DC(Type-C 或 DC 座),板载 PMIC 或 DC-DC 把它转换成多路电压:内核电压、DDR 电压、3.3V IO 电压、1.8V 模拟电压等。A7 内核和 M4 内核可能在不同的电压域,跑不同的频率等级(OPP),对电压的要求也不一样。
这里有个新手容易踩的坑:MCU 开发时你习惯了随便找个 USB 线供电就开始点灯,但 MPU 评估板对供电质量和时序有要求。手册里通常会画一个上电时序图,明确哪一路电压要先起来、哪一路要后起来、复位信号要等所有电压稳定后再释放。违反时序可能导致芯片进入异常状态,表现就是上电后串口无输出、U-Boot 跑不起来、或者跑起来后随机死机。
实操中我一般这样检查电源部分:先用万用表确认 5V 输入正常,再量 PMIC 输出的关键电压是否在手册标称范围内。上电时按住复位键,等电源灯稳定后再松开,这种方式可以减少上电瞬间电源抖动对启动流程的影响。另外要留意,很多评估板的 USB Type-C 口同时承担供电和串口/烧录功能,插拔 USB 线时不要带电去碰板子上的排针和接口,瞬时掉电容易损坏 SD 卡的文件系统。
2.2 DDR 与存储:最容易出问题的地方,评估板已经替你踩完坑
DDR 是 MPU 评估板硬件设计里风险最高的部分。STM32MP157 的 DDR 控制器支持 DDR3/DDR3L/LPDDR2/LPDDR3,跑在 533MHz 甚至更高。DDR 布线讲究等长、阻抗控制、参考平面完整,还要在数据线、地址线上加终端电阻,VTT 电源要单独设计。这些对 PCB 设计经验不足的人来说,几乎不可能一次画对;即使画对了,DDR 初始化参数(training 参数)也需要调试。
评估板的做法是:由原厂或板厂已经完成了 DDR 的布局布线和参数调优,并且在 U-Boot 里配置好了对应的 DDR 初始化序列。这意味着拿到的板子默认就能稳定跑 DDR,你不需要关心 VREF 校准、写电平校准这些底层细节。但要注意,U-Boot 里的 DDR 参数是从 DDR 颗粒型号和 PCB 布线情况推导出来的,如果你后续自己画板子但颗粒型号和布线方式变了,这套参数往往不能直接套用。
存储方面,SD 卡是开发阶段最常用的介质。评估板一般支持 SD 卡上的多分区布局:第一个分区通常是 FAT 格式的 bootfs,放 U-Boot、内核镜像、设备树文件;第二个分区是 ext4 格式的 rootfs,放根文件系统。有的板子还支持在 SD 卡上划分一个可选的 userdata 分区。这种布局的好处是,启动过程简单直观:SoC 上电后从 boot 引脚选择的介质读取 U-Boot,U-Boot 再根据环境变量加载 bootfs 里的内核和设备树,最后挂载 rootfs。
2.3 启动方式与拨码开关:选对介质才能开机
STM32MP157 的启动方式由 BOOT 引脚的上下拉状态决定,评估板上通常用拨码开关(DIP switch)或跳线帽来配置。常见的启动介质有 SD 卡、eMMC、USB、UART(串口烧录模式)等。查看手册时重点记住拨码开关的 ON/OFF 组合对应的启动介质,这个组合在不同厂商的评估板上不一样,甚至同一厂商不同批次也可能调整,所以一定要以手头板子的丝印和手册为准。
启动模式的优先级也值得注意。比如 SD 卡启动时,如果 SD 卡里没有有效的镜像,有的板子会回退到 USB 烧录模式;有的板子则会直接卡住。调试时我习惯先把拨码开关拨到 USB 烧录模式,用 STM32CubeProgrammer 连接一下,确认芯片能识别,再切回 SD 卡启动。这样能最快区分“硬件问题”还是“镜像问题”。
注意:调整拨码开关前务必断电。带电拨动 BOOT 引脚配置,轻则启动失败,重则可能损坏芯片内部启动 ROM 的配置寄存器状态。
3. 开机第一步:串口、网线直连与开发环境
3.1 电源连接与串口调试:你的第一块“屏幕”
MPU 开发里,串口就是你的主屏幕。评估板一般会板载 USB 转串口芯片(比如 ST-LINK 虚拟串口或独立 CH340/CP2102),通过一根 USB 线连接到电脑,就会在电脑上枚举出串口设备。Linux 下通常是/dev/ttyACM0或/dev/ttyUSB0,Windows 下是一个 COM 端口。
串口参数一般是 115200-8-N-1,用 minicom、PuTTY 或者 VS Code 的 Serial Monitor 插件都可以连接。上电后第一眼看到的是 ROM 代码输出的启动信息,接着是 U-Boot 的日志,最后是 Linux 内核的启动 log。这一串输出基本就是整个系统从无到有的完整生命线。
我之前遇到过一种情况:串口完全没有输出,但板子的电源灯是亮的。排查得很狼狈,最后发现是 USB 转串口芯片的驱动没装好,系统枚举出来的是未知设备。所以串口不通时,先查设备管理器,再查线材,最后才考虑板子的问题。另外串口波特率别凭经验猜,严格按照手册给的参数来,搞错了就是一堆乱码。
3.2 网线直连的 IP 规划:没有路由器也能干活
很多评估板附带的手册里会教你用网线把板子和电脑直连,也就是“网线直连”这种操作。它的应用场景很实际:手头没路由器,或者开发环境需要避免和办公网络冲突时,直接一根网线把电脑和板卡的网口接起来,组成一个临时的点对点局域网,就可以完成 SSH、NFS、文件传输等所有调试工作。
网线直连时,IP 要手动规划。常见做法是给电脑网口设置一个私有 IP,比如 10.0.0.2,子网掩码 255.255.255.0;板卡设置成同一网段的 10.0.0.1。板卡侧的 IP 可以在 U-Boot 里通过环境变量或者 Linux 里用ifconfig临时设置。网络直连后先用ping验证链路,能通再继续 SSH。
提示:电脑如果同时连着 WiFi,要先确认 WiFi 网段的地址和板卡直连网段不冲突。更稳妥的做法是在系统网络设置里把直连网卡的接口“仅用于本地网络”,或者直接临时禁用 WiFi,走完调试再恢复。
3.3 登录与文件传输:SSH、scp 和 NFS 三板斧
网络打通后,登录板卡基本都用 SSH。评估板 Linux 系统默认的账户和密码在手册里有,一般能直接 SSH 登录。登录后第一件事是确认当前的 IP、内核版本和文件系统剩余空间,这几个信息决定了后续能干什么。
文件传输最常用的是scp和rsync。交叉编译好的内核镜像、设备树文件、可执行程序,直接 scp 到板子上就能运行。如果开发的是大型应用,每次全量拷贝太慢,用 rsync 只同步差异文件,效率高很多。我在开发时喜欢在电脑上开一个 NFS 共享目录,把板卡的某个目录挂载到电脑上,这样电脑上编译完的文件板子立即可见,省去反复拷贝的过程,这个习惯在调试 kernel 模块时尤其好用。
4. 从 CubeMX 到设备树:Linux 侧的配置链路
4.1 为什么会用 CubeMX 去配置一颗 Linux 芯片
用惯了 STM32CubeMX 的 MCU 开发者,第一次打开 STM32MP1 系列的支持包时,会发现它确实也能用,但生成的“代码”不是.c文件,而是设备树源文件(DTS)和一堆用于 OpenSTLinux 构建的工程文件。这是因为 STM32MP1 上 Linux 内核对外设的描述,完全依赖设备树(Device Tree)。
设备树的作用是描述硬件资源:有哪些外设、挂在哪个地址、中断号是多少、引脚复用关系如何、时钟源是什么。Linux 内核启动时会解析设备树,根据里面的描述去初始化设备驱动。你可以把设备树理解成“硬件的说明书”,它跟内核代码分离,换一块定制板时不需要改内核源码,只需要改设备树。
整套配置链路是:CubeMX 里勾选外设、配置引脚复用,生成设备树源文件;然后放进 OpenSTLinux 的 SDK 或 Yocto 构建系统里编译,最终生成uImage、dtb文件;再把这两个文件放到 SD 卡的 bootfs 分区,复烧或替换后重启,内核就会按新的硬件描述初始化外设。理解了这条链路,开发时遇到“我配置了 GPIO 为什么没反应”这类问题,就能顺着链路一步步查,而不是盲目怀疑硬件。
4.2 改一个 GPIO 点灯,看看整条配置链路怎么走
拿最常见的 GPIO 点灯举例。假设评估板上有一颗 LED 接到了某个引脚,你要通过 Linux 控制它亮灭。在 MCU 上,直接写寄存器或者调 HAL 库就行;在 MPU 上,要经过这几步:
- 打开 CubeMX,选择对应芯片型号,导入评估板默认配置;
- 在引脚视图里找到 LED 对应的引脚,把它配置为 GPIO 输出;
- 生成设备树源文件,打开
.dts,能看到该引脚节点下多了一段gpios描述; - 用 OpenSTLinux SDK 里的编译脚本,重新编译设备树,得到新的
.dtb文件; - 把
.dtb传到板子的 bootfs 分区,覆盖原文件,重启; - 启动后进入 Linux,在
/sys/class/gpio或者用libgpiod工具控制这个引脚的电平。
这套流程里最容易出问题的是第 4 步。很多新手直接在板子上用dtc反编译修改 dts,改完再编译回去,结果因为语法错误把设备树搞坏了,启动卡在内核阶段。我的建议是:开发阶段始终保留一套“能用”的原始 dtb 备份,改任何设备树之前先手动拷贝一份。这套备份救了我好几次,尤其是在尝试修改 DDR 参数、新增 I2C 设备节点这类高风险操作时。
4.3 关于 AOTUSAR 与 M4 核:顺带澄清一个常见的认知混淆
在 MPU 相关的技术讨论里,会看到 AOTUSAR、Davinci Configurator 这些词,有的新手会把这些和 Linux 设备树混淆。简单梳理一下:STM32MP157 的 M4 核心既可以跑裸机、FreeRTOS,也可以作为 AOTUSAR 的 MCU 核心来用。如果你做的是汽车电子相关项目,并且需要 M4 跑 AOTUSAR CP 软件栈,那确实会用到 Davinci Configurator 这类 AOTUSAR 配置工具,它负责生成 RTE、SWC 描述、ECU 配置等——这是完全独立于 Linux 设备树的一套东西。
这里提醒一句:Dubai 评估板上的 M4 核心,多数时候不是直接跑 AOTUSAR,而是作为裸机/RTOS 核和 A7 协同工作。如果产品最终要上 AOTUSAR,一般是在量产板阶段由软件团队单独搭建 AOTUSAR 工程,和评估板自带的 Linux 参考实现没有太多重叠。不要把 Linux 侧的配置思路照搬到 AOTUSAR 工具链里,两者的抽象层次、配置流程和生成产物几乎没有交集。
至于 M4 和 A7 的通信,最常用的方式是 RPMsg 和共享内存。A7 上跑 Linux,加载一个 RPMsg 驱动;M4 上跑一个小型 RTOS 应用,通过 RPMsg 协议发消息。两边共用一段物理内存,硬件层面不需要额外连线。这套机制在评估板的参考例程里通常有现成的 demo,是异构开发入门很值得花时间研究的模块。
5. 常见问题与排查技巧实录
5.1 网线直连 ping 不通怎么办
这是新手提到最多的问题。网线直连 ping 不通,原因通常集中在几个方向:第一,板卡侧的 IP 没设好。很多评估板默认 IP 在出厂固件里可能和你的网段不同,需要进入系统后用ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up重新配置。第二,电脑侧的网卡没有启用或者被防火墙拦截。Ubuntu 下要检查 NetworkManager 是否接管了直连网卡,Windows 要确认“以太网”适配器的 IP 设置。第三,网线本身有问题——交叉线、直通线在千兆网卡下其实都能自适应,但劣质网线或接触不良会导致协商失败。
排查时我习惯先在电脑上ping 10.0.0.1,如果不通,看板卡串口日志里网络驱动有没有起来、有没有报 PHY 链接错误。再在电脑上arp -a看看有没有学习到板卡的 MAC 地址,如果 ARP 表里没有,说明二层都不通,问题在物理层或驱动层;如果 ARP 能学到 MAC 但 ping 不通,问题大概率在三层路由或防火墙。
5.2 板卡启动卡在某个位置,怎么看串口日志定位
系统启动卡住的定位,思路是分阶段看日志。第一阶段是 ROM 代码和 U-Boot 输出,如果卡在这一段,通常是 DDR 初始化失败、启动介质读取失败、或者镜像文件损坏。第二阶段是 U-Boot 加载内核和设备树,如果卡在这里,大概率是 bootfs 分区文件缺失、设备树有语法错误、或者内核镜像格式不对。第三阶段是内核解压和设备初始化,如果卡在内核 log 的半途,要看最后打印的几条信息,常见的有驱动 probe 失败、根文件系统挂载错误。
一个容易忽略的细节:内核启动时,有些日志默认被 console 的 loglevel 过滤掉了,串口上不一定能看到完整输出。临时在 U-Boot 环境变量里给内核传loglevel=8参数,就能看到更多调试信息。这是排查驱动问题时特别有用的手段。
5.3 烧录后没反应:从拨码开关开始排查
烧录完 SD 卡,上电后串口完全没输出,这是最让人头大的情况之一。我的排查顺序是:先断电,检查拨码开关是否拨到了对应介质的启动位置;然后确认 SD 卡是否插到位、分区格式是否正常;再在电脑上检查 SD 卡里的文件,比如boot.scr、uImage、dtb的文件名是否和 U-Boot 环境变量里设置的一致;最后才考虑重新用 STM32CubeProgrammer 擦除 eMMC 或恢复出厂镜像。
特别提醒:SD 卡烧录后不要急着拔卡,多等几秒等系统把缓存写回。开发阶段我至少遇到过两次因为“写完就拔卡”导致分区表损坏的情况,重新烧一次虽然不麻烦,但来回折腾很浪费时间。
5.4 一个速查表:常见现象、原因和排查方向
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 上电后串口无输出 | BOOT 拨码错误、电源不稳、串口驱动问题 | 先查拨码,再量电压,最后查驱动枚举 |
| 启动卡在 U-Boot 阶段 | DDR 参数不对、存储介质读取失败 | 检查 DDR 配置、重新烧写 bootfs |
| 内核启动 log 中途停止 | 设备树错误、驱动 probe 失败 | 用loglevel=8查看完整日志,逐行定位 |
| Linux 能启动但没网口 | PHY 驱动没加载、设备树没有网口节点 | 检查设备树以太网节点、dmesg中的 PHY 信息 |
| SSH 连不上 | IP 不在同一网段、sshd 服务没启动 | 串口登录后确认 IP 和 sshd 状态 |
5.5 另外几个值得养成的习惯
从我自己的实操体会来说,玩 MPU 评估板,有几个习惯越早养成越好。第一是勤备份:U-Boot 环境变量、原始 dtb、可用的内核镜像,都单独备份一份到电脑上,不要只存在板子里。第二是善用版本管理:设备树、根文件系统改动、测试脚本,都放到 Git 仓库里管理,哪怕只是一个人开发,也能帮你回溯到底改了什么导致系统起不来。第三是记录手册偏差:评估板手册可能与实际板卡有极少数出入(比如某个电阻默认不焊、某个引脚丝印和手册不一致),遇到这种情况随手记录,后期会省下很多复盘的精力。
最后再分享一个我自己的小技巧:开发阶段可以给板卡固定一个静态 IP,并且把电脑的 SSH 公钥放到板卡的 authorized_keys 里,之后每次连接都免密登录,配合 NFS 挂载根文件系统,整个开发迭代的效率会提升一个档次。等你把软件链路都调顺了,再回头去优化电源设计、DDR 参数或者 PCB 布局,那个时候你手上的评估板就不再是一块“开发板”,而是一个真正帮你把产品雏形跑通了的参考基准。