第 8 章:M33 领航——引导 A35 加载 U-Boot 与 Linux 内核

📅 发布时间:2026/7/7 16:51:38 👁️ 浏览次数:
第 8 章:M33 领航——引导 A35 加载 U-Boot 与 Linux 内核
在之前的章节中M33 已经完成了“圈地”和“自检”。现在我们要执行最关键的一步由 M33 释放 A35 的 Hold Reset 信号并引导其进入 Linux 世界。在 STM32MP257F-DK 上这相当于 M33 扮演了传统架构中安全启动Secure Boot发起者的角色。8.1 异构启动的“点火”流程A35 核心在复位后默认处于Hold Reset状态。要拉起它M33 需要完成以下“三部曲”加载镜像将 A35 的引导程序通常是u-boot-spl.stm32或TF-A搬运到指定的 DDR 物理地址。设置启动向量配置系统控制寄存器SYSCON告诉 A35 复位后第一行代码去哪里跑。释放复位修改 RCC 寄存器撤销 A35 的复位信号。8.2 实战配置 A35 的启动基地址在 MP257 中A35 的复位向量地址是由SYSCON寄存器控制的。#define SYSCON_BASE 0x44230000#define SYSCON_A35_RVBAR_L (*(volatile uint32_t *)(SYSCON_BASE 0x60)) // 低32位#define SYSCON_A35_RVBAR_H (*(volatile uint32_t *)(SYSCON_BASE 0x64)) // 高32位void A35_Set_Boot_Address(uint64_t boot_addr) {// 设置 A35 复位后的跳转起始点// 假设我们将 U-Boot 搬到了 0x90200000SYSCON_A35_RVBAR_L (uint32_t)(boot_addr 0xFFFFFFFF);SYSCON_A35_RVBAR_H (uint32_t)((boot_addr 32) 0xFFFFFFFF);}8.3 深度实战释放 A35 复位信号这一步是真正的“点火”。我们需要操作RCC (Reset and Clock Control)模块。#define RCC_BASE 0x44200000#define RCC_A35_BOOT_CR (*(volatile uint32_t *)(RCC_BASE 0xC00))void A35_Release_Reset(void) {// 开启 A35 核心时钟并释放复位// 具体的位偏移需参照 MP257 参考手册 RM0457// BIT 0 通常对应 Core 0 的复位释放RCC_A35_BOOT_CR | 0x01;printf([M33] A35 Reset Released! Linux is booting...\r\n);}8.4 镜像搬运M33 侧的“搬运工”在实战中A35 的镜像通常存储在 SD 卡的特定分区。M33 可以通过 SDMMC 驱动读取也可以利用我们在第 4 章实现的DMA 串口从上位机接收。为了简化演示我们假设镜像已经通过调试器加载到了 DDR 的0x90200000void Start_A35_Workflow(void) {// 1. 确保 DDR 已经初始化在 M33 引导模式下M33 需负责 DDR 控制器初始化// DDR_Init();// 2. 设置跳转地址A35_Set_Boot_Address(0x90200000);// 3. 释放 A35A35_Release_Reset();}8.5 关键同步跨核握手标志在 A35 启动初期M33 往往需要知道 A35 是否运行到了内核。我们可以利用第 7 章划定的Shared Memory (0x90000000)做一个简单的握手信号。M33 逻辑在内存0x90000000写入0x00000000。A35 U-Boot 逻辑启动后往0x90000000写入0xDEADBEEF。M33 观察通过串口打印出状态变化。8.6 避坑指南 (Debug Tips)陷阱 1DDR 未就绪。如果 M33 没调好 DDR 就释放 A35A35 会因为取不到指令立即触发Prefetch Abort。检查使用STM32CubeMP2提供的 DDR 测试脚本验证稳定性。陷阱 2中断向量冲突。A35 启动后会配置 GIC通用中断控制器。如果 RIF 没分好A35 可能会误关掉 M33 的 NVIC 中断。对策在引导 A35 前确保 RIF 已对核心外设加锁。陷阱 3地址空间可见性。M33 属于 32 位架构访问 64 位的 A35 空间时需确认总线窗口映射。章节小结到此为止你已经完成了一个异构多核系统的“冷启动”全过程。此时开发板上会出现奇妙的一幕M33 依然在稳定地读取 IMU 数据并通过串口打印而 A35 已经开始在后台疯狂刷屏启动 Linux 了。