1. 准备工作认识你的工具和材料第一次接触STM32MP135开发板时我完全被各种专业术语搞晕了。经过几次实战后才发现只要理清几个关键点烧录系统镜像其实比想象中简单得多。首先你需要确认手头有以下几样东西硬件部分STM32MP135开发板带eMMC存储、USB Type-C数据线注意必须是支持数据传输的不是所有Type-C线都能用、一台Windows/Linux电脑软件工具STM32CubeProgrammer建议用最新版我实测2.12.0版本最稳定系统镜像文件包括TF-ATrusted Firmware-A、OP-TEE安全执行环境和U-Boot引导加载程序的编译输出文件特别提醒新手朋友开发板上的拨码开关非常重要烧录时需要设置为000模式全部拨到0位置这个细节很多教程都没强调我第一次就栽在这里折腾了半天才发现问题。2. 文件准备别漏掉关键组件编译好的系统文件通常存放在FIP_artifacts文件夹内这里我整理了一份完整的文件清单和说明文件路径作用说明是否必须arm-trusted-firmware/tf-a-stm32mp135-atk-usb.stm32USB模式下的初始引导程序是fip/fip-stm32mp135-atk-optee.bin包含TF-A、OP-TEE和U-Boot的FIP包是arm-trusted-firmware/tf-a-stm32mp135-atk-emmc.stm32eMMC模式下的引导程序是arm-trusted-firmware/metadata.bin元数据文件是实际项目中我发现一个常见问题有些开发者会漏掉metadata.bin文件导致烧录后系统无法正常启动。这个文件虽然小但作用关键它包含了eMMC分区的布局信息。3. 编写TSV烧录脚本细节决定成败创建stm32mp135-atk-emmc-optee.tsv文件时我踩过不少坑。这个脚本本质上是一个制表符分隔的文本文件但有几个细节必须注意必须使用TAB键而不是空格进行分隔这个坑我踩过三次文件路径是相对于FIP_artifacts目录的每个字段的含义要理解清楚这是我验证过可用的脚本内容#Opt Id Name Type IP Offset Binary - 0x01 fsbl1-boot Binary none 0x0 arm-trusted-firmware/tf-a-stm32mp135-atk-usb.stm32 - 0x03 fip-boot FIP none 0x0 fip/fip-stm32mp135-atk-optee.bin P 0x04 fsbl1 Binary mmc1 boot1 arm-trusted-firmware/tf-a-stm32mp135-atk-emmc.stm32 P 0x05 fsbl2 Binary mmc1 boot2 arm-trusted-firmware/tf-a-stm32mp135-atk-emmc.stm32 P 0x06 metadata1 Binary mmc1 0x00080000 arm-trusted-firmware/metadata.bin P 0x07 metadata2 Binary mmc1 0x00100000 arm-trusted-firmware/metadata.bin P 0x08 fip-a FIP mmc1 0x00180000 fip/fip-stm32mp135-atk-optee.bin PED 0x09 fip-b FIP mmc1 0x00580000 none PED 0x0A u-boot-env Binary mmc1 0x00980000 none新手最容易犯的错误是在文本编辑器中不小心把TAB替换成了空格。建议使用Notepad或VS Code这类专业编辑器在状态栏可以看到空白字符的显示。4. 实战烧录一步步带你操作现在来到最关键的烧录环节跟着我的步骤走保证不迷路硬件连接确保开发板断电拨码开关设置为000全部拨到0位置用USB线连接开发板的USB Type-C接口和电脑软件操作打开STM32CubeProgrammer点击左上角的按钮选择你创建的TSV脚本文件点击Browse按钮选择FIP_artifacts目录作为工作目录按下开发板上的复位按钮这一步很多人会忘开始烧录点击Download按钮开始烧录观察软件界面和开发板上的LED指示灯红色LED常亮表示供电正常绿色LED闪烁表示正在烧录蓝色LED常亮表示烧录完成烧录过程中我建议同时打开串口终端波特率115200可以看到详细的烧录日志。正常情况应该会看到类似这样的输出[INFO] TF-A v2.6-stm32mp1-r2.1 [INFO] OP-TEE version: 3.18.0 [INFO] U-Boot 2021.10-stm32mp-r2.1如果遇到USB初始化失败的问题就像原始文章中提到的别慌。我实测发现这是正常现象系统会尝试多次初始化最终能成功就行。5. 验证与排错确保系统正常运行烧录完成后需要验证系统是否真的可以正常工作切换启动模式断电后将拨码开关改为010从eMMC启动重新上电观察启动日志 通过串口终端应该能看到完整的启动流程包括TF-A初始化信息OP-TEE安全环境加载U-Boot启动过程最后进入U-Boot命令行或直接启动内核取决于你的配置常见问题排查问题1烧录过程中断检查USB线是否接触不良尝试更换USB端口建议使用主板原生USB接口问题2烧录完成后无法启动确认拨码开关设置正确检查TSV脚本中的路径是否正确验证metadata.bin文件是否完整问题3USB初始化警告这是已知现象不影响正常使用可以尝试更新TF-A版本我在实际项目中遇到过最棘手的问题是烧录后eMMC无法识别后来发现是metadata.bin文件损坏导致的。建议每次编译后都校验下这个文件的MD5值是否一致。6. 进阶技巧提升烧录效率经过多次实践我总结出几个提升效率的小技巧批量烧录脚本 对于需要烧录多块开发板的情况可以使用STM32CubeProgrammer的命令行模式STM32_Programmer_CLI -c portUSB1 -w stm32mp135-atk-emmc-optee.tsv -d FIP_artifacts校验烧录结果 烧录完成后可以读取eMMC内容进行校验STM32_Programmer_CLI -c portUSB1 -r 0 0x200000 verify.bin快速恢复出厂设置 创建一个只包含基础引导程序的精简TSV脚本用于快速恢复系统#Opt Id Name Type IP Offset Binary P 0x04 fsbl1 Binary mmc1 boot1 arm-trusted-firmware/tf-a-stm32mp135-atk-emmc.stm32 P 0x05 fsbl2 Binary mmc1 boot2 arm-trusted-firmware/tf-a-stm32mp135-atk-emmc.stm32日志分析技巧 在串口终端中重点关注以下几个关键信息Boot chain validated表示安全启动验证通过DRAM init后面的内存大小是否正确STM32MP135应该是512MBStarting kernel...表示系统即将进入Linux环境7. 深度解析理解烧录背后的原理很多教程只教怎么做却不解释为什么。这里我想分享一下烧录过程中的关键技术点TF-A的作用第一阶段引导程序负责最基本的硬件初始化建立安全环境验证后续组件的完整性我实测发现如果TF-A版本不匹配经常会出现莫名其妙的启动失败FIP包的结构 FIPFirmware Image Package实际上是一个容器格式内部包含BL2TF-A的第二阶段BL32OP-TEEBL33U-Boot 使用fiptool工具可以查看FIP包内容fiptool info fip-stm32mp135-atk-optee.bineMMC的分区布局 STM32MP135的eMMC有特殊的分区安排boot1/boot2存放FSBLFirst Stage Boot Loader0x00080000metadata10x00180000FIP镜像 这种布局是为了支持A/B系统更新和回滚机制USB烧录模式的工作原理 当拨码开关设置为000时芯片内部的ROM代码会检测USB连接进入DFUDevice Firmware Upgrade模式等待主机发送烧录指令 这个过程完全不需要任何预先烧录的程序是芯片出厂时就固化的功能理解这些原理后遇到问题时就能更快定位原因。比如我曾经遇到烧录到一半失败的情况通过分析发现是USB供电不足导致的后来改用带外接电源的USB Hub就解决了。