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

在之前的章节中,M33 已经完成了"圈地"和"自检"。现在,我们要执行最关键的一步:由 M33 释放 A35 的 Hold Reset 信号,并引导其进入 Linux 世界。 在 STM32MP257F-DK 上,这相当于 M33 扮演了传统架构中安全启动(Secure Boot)发起者的角色。


8.1 异构启动的"点火"流程

A35 核心在复位后默认处于 Hold Reset 状态。要拉起它,M33 需要完成以下"三部曲":

  1. 加载镜像 :将 A35 的引导程序(通常是 u-boot-spl.stm32TF-A)搬运到指定的 DDR 物理地址。

  2. 设置启动向量:配置系统控制寄存器(SYSCON),告诉 A35 复位后第一行代码去哪里跑。

  3. 释放复位:修改 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 搬到了 0x90200000

SYSCON_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 的 0x90200000

void Start_A35_Workflow(void) {

// 1. 确保 DDR 已经初始化(在 M33 引导模式下,M33 需负责 DDR 控制器初始化)

// DDR_Init();

// 2. 设置跳转地址

A35_Set_Boot_Address(0x90200000);

// 3. 释放 A35

A35_Release_Reset();

}

8.5 关键同步:跨核握手标志

在 A35 启动初期,M33 往往需要知道 A35 是否运行到了内核。我们可以利用第 7 章划定的 Shared Memory (0x90000000) 做一个简单的握手信号。

  • M33 逻辑 :在内存 0x90000000 写入 0x00000000

  • A35 U-Boot 逻辑 :启动后往 0x90000000 写入 0xDEADBEEF

  • M33 观察:通过串口打印出状态变化。


8.6 避坑指南 (Debug Tips)

  • 陷阱 1:DDR 未就绪 。如果 M33 没调好 DDR 就释放 A35,A35 会因为取不到指令立即触发 Prefetch Abort

    • 检查 :使用 STM32CubeMP2 提供的 DDR 测试脚本验证稳定性。
  • 陷阱 2:中断向量冲突。A35 启动后会配置 GIC(通用中断控制器)。如果 RIF 没分好,A35 可能会误关掉 M33 的 NVIC 中断。

    • 对策:在引导 A35 前,确保 RIF 已对核心外设加锁。
  • 陷阱 3:地址空间可见性。M33 属于 32 位架构,访问 64 位的 A35 空间时,需确认总线窗口映射。


章节小结

到此为止,你已经完成了一个异构多核系统的"冷启动"全过程。此时,开发板上会出现奇妙的一幕:M33 依然在稳定地读取 IMU 数据并通过串口打印,而 A35 已经开始在后台疯狂刷屏启动 Linux 了。

相关推荐
何中应2 小时前
从零搭建JumpServer
运维·堡垒机·jumpserver
一路往蓝-Anbo2 小时前
第 6 章:GPIO 与外部中断——M33 掌控下的 LED 与按键响应
linux·stm32·单片机·嵌入式硬件
闲人编程3 小时前
任务监控与错误重试
linux·服务器·网络·celery·任务队列·任务监控·错误重试
攒了一袋星辰4 小时前
JVM类加载过程
运维·服务器·jvm
LCG元4 小时前
直流电机闭环控制:STM32F1 PWM+ADC电流采集,PID调速实战
stm32·单片机·嵌入式硬件
hoududubaba5 小时前
ORAN C平面传输和基本功能——基于DMRS的波束赋形和SINR报告
网络·网络协议
Y1rong5 小时前
STM32之MQTT
stm32
嘎嘎NULL5 小时前
Gitea配置邮箱
运维·服务器·gitea
REDcker5 小时前
FTP协议原理及应用精解
linux·后端·计算机网络·互联网·ftp·服务端开发