You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

i.MX8M Mini Core0/Core1软件复位问题:核心挂起

i.MX8M Mini A53核心软件复位后挂起的解决方法

问题复盘

使用i.MX8M Mini的SRC寄存器设置复位向量,触发Core0/Core1软件复位后,核心进入挂起状态无法恢复,操作流程为:

  • 设置Core0复位向量:将向量高低位写入SRC_GPR1、SRC_GPR2
  • 触发复位:通过SRC_A53RCR0的Core0复位位触发

核心原因及解决步骤

1. SRC寄存器未解锁,复位触发指令被忽略

i.MX8M Mini的SRC控制寄存器默认处于锁定状态,直接写复位控制位不会生效,必须先写入解锁密钥。

修正代码:

void trigger_core0_reset(void)
{  
    #define SRC_SCR_ADDR 0x30390000       // SRC控制寄存器地址
    #define SRC_A53RCR0_ADDR 0x30390004   // SRC_A53RCR0地址
    #define CORE0_RESET (1 << 0)          // Core0复位位
    #define SRC_UNLOCK_KEY 0xBC50A55F     // SRC解锁密钥

    volatile uint32_t *src_scr = (uint32_t *)SRC_SCR_ADDR;
    volatile uint32_t *src_a53rcr0 = (uint32_t *)SRC_A53RCR0_ADDR;   

    // 先解锁SRC寄存器
    *src_scr = SRC_UNLOCK_KEY;
    // 触发Core0复位
    *src_a53rcr0 |= CORE0_RESET;
    // 可选:等待复位位自动清零(部分场景需要)
    while ((*src_a53rcr0 & CORE0_RESET) != 0);
}

2. 复位向量设置错误

寄存器对应关系错误

Core0和Core1的复位向量寄存器是分开的:

  • Core0:低32位→SRC_GPR1(0x30390008),高32位→SRC_GPR2(0x3039000C)
  • Core1:低32位→SRC_GPR3(0x30390010),高32位→SRC_GPR4(0x30390014)
    如果给Core1用了Core0的GPR寄存器,复位后核心找不到正确向量会挂起。

地址格式不符合要求

  • 若核心运行在AArch32模式:复位向量必须对齐到0x40,且为物理地址(复位后MMU默认关闭,虚拟地址失效)
  • 若运行在AArch64模式:复位向量必须对齐到0x80,同样需为物理地址
  • 确保向量地址指向的内存区域是可执行状态(比如OCRAM、已初始化的Flash),且复位后能被核心访问。

正确设置Core0向量的代码(32位模式):

void set_core0_reset_vector(uint32_t vec_addr)
{
    #define SRC_GPR1_ADDR 0x30390008
    #define SRC_GPR2_ADDR 0x3039000C

    volatile uint32_t *src_gpr1 = (uint32_t *)SRC_GPR1_ADDR;
    volatile uint32_t *src_gpr2 = (uint32_t *)SRC_GPR2_ADDR;

    // 32位模式下高32位设为0
    *src_gpr1 = vec_addr;
    *src_gpr2 = 0x00000000;
}

3. Core1复位前未唤醒

Core1作为从核心,默认可能处于休眠状态,直接触发复位无法使其恢复,需先唤醒再复位。

Core1复位代码示例:

void trigger_core1_reset(void)
{
    #define SRC_SCR_ADDR 0x30390000
    #define SRC_A53RCR1_ADDR 0x30390008
    #define CORE1_RESET (1 << 1)
    #define CORE1_WAKEUP (1 << 17)
    #define SRC_UNLOCK_KEY 0xBC50A55F

    volatile uint32_t *src_scr = (uint32_t *)SRC_SCR_ADDR;
    volatile uint32_t *src_a53rcr1 = (uint32_t *)SRC_A53RCR1_ADDR;

    *src_scr = SRC_UNLOCK_KEY;
    // 先唤醒Core1
    *src_a53rcr1 |= CORE1_WAKEUP;
    while ((*src_a53rcr1 & CORE1_WAKEUP) != 0);
    // 触发Core1复位
    *src_a53rcr1 |= CORE1_RESET;
    while ((*src_a53rcr1 & CORE1_RESET) != 0);
}

4. 主核心(Core0)复位的特殊注意事项

Core0作为系统主核心,单独复位可能导致外设、总线状态异常,调试时建议:

  • 复位前关闭所有外设中断
  • 确保复位向量包含核心初始化代码(比如禁用MMU、缓存,设置栈指针)

内容的提问来源于stack exchange,提问作者Sirishab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:10:54