2. Stellar多核启动与系统初始化
Stellar 系列 MCU 内部集成多个 Cortex-M 内核(典型为 M0+ 与 M4/M7 组合),上电后并非所有内核同时开始执行用户代码。理解多核启动流程,是搭建最小多核工程、定位“从核不运行”“共享内存访问异常”等问题的前提。本节围绕 BootROM、用户引导代码、内核间同步启动、时钟与电源域初始化,以及最小多核工程的创建与调试展开。
一、上电复位后的启动链路
Stellar 上电或复位后,硬件首先将 CPU 的控制权交给片内 BootROM。BootROM 是固化在芯片中的只读引导程序,负责最基本的系统建立:读取启动模式引脚或选项字节,判断从 Flash、系统存储器还是外部接口启动;初始化最基础的时钟源(通常为内部 RC);校验并跳转到用户引导代码。BootROM 阶段通常只让主核(Master Core)运行,从核(Slave Core)被保持在复位或等待状态,等待主核显式释放。
用户引导代码位于 Flash 起始区域,是开发者可修改的第一段程序。它需要完成:向量表重定位、栈指针设置、必要的外设时钟使能、从核固件镜像的加载或地址指定,以及最终通过内核间通信机制唤醒从核。BootROM 与用户引导代码的分工可以概括为“BootROM 建立最小可运行环境,用户引导代码完成系统级初始化并启动多核”。
二、内核间同步启动机制
从核的释放不能简单依靠“延时等待”,而应使用硬件同步机制。Stellar 通常提供内核间通信外设(如 IPCC、HSEM 或专用邮箱),主核通过写入特定寄存器或事件标志通知从核,从核在复位释放后首先读取该标志,确认主核已完成必要初始化后再继续执行。典型握手流程如下:
- 主核完成时钟、电源域、共享内存区域配置。
- 主核向从核启动寄存器写入从核入口地址,并置位“释放”位。
- 从核退出复位,从入口地址开始执行,首先检查共享内存中的同步标志。
- 从核置位“已就绪”标志,主核轮询该标志确认从核已进入运行态。
若缺少同步,从核可能在主核尚未配置好共享外设时访问总线,导致 HardFault 或数据错误。因此同步标志应放在主核与从核均可访问的 SRAM 区域,并注意该区域不能被 Cache 单独缓存而导致可见性问题。
三、时钟与电源域初始化
Stellar 的时钟树通常包含多个时钟源:内部高速 RC(HSI)、外部晶振(HSE)、PLL,以及为不同电源域服务的分频器。多核场景下,主核负责配置系统时钟,从核通常共享同一时钟树,但部分外设时钟可独立门控。初始化顺序建议为:
- 使能目标时钟源并等待稳定标志(如 HSE 的 HSERDY)。
- 配置 PLL 倍频/分频参数,切换系统时钟前先确认 PLL 锁定。
- 按电源域使能对应外设时钟,避免从核访问未使能时钟的外设。
- 配置低功耗模式相关寄存器,明确各内核在待机时的状态。
电源域方面,Stellar 可能将内核、外设、SRAM 划分到不同域。若从核需要访问某 SRAM 区域,该区域所在电源域必须保持开启。调试阶段常见问题是“从核能启动但访问共享变量即出错”,往往源于该 SRAM 域未上电或时钟未使能。
四、最小多核工程创建与调试
以 STM32CubeIDE 或 ST 提供的 Stellar 专用工具链为例,创建最小多核工程的步骤如下:
- 新建工程时选择对应 Stellar 型号,工具会自动生成主核与从核的启动文件、链接脚本和基本初始化代码。
- 在主核工程的
main()中,于外设初始化之后、进入主循环之前,调用从核启动函数,例如HAL_IPC_StartSlaveCore(&hipc, SLAVE_CORE_ID, slave_entry_addr);。 - 在从核工程中实现入口函数,例如
void slave_entry(void),内部先等待同步标志,再执行从核任务。 - 为两个核分别配置调试会话:主核使用一个调试配置,从核使用另一个,确保下载时两个核的固件都被正确烧录。
调试时建议先单独验证主核能正常运行并打印日志,再验证从核是否被释放。可在从核入口函数第一行翻转一个 GPIO 或写入共享内存标志,用示波器或调试器观察。若从核未运行,依次检查:从核复位是否释放、入口地址是否正确、从核时钟是否使能、从核向量表是否指向正确位置。