Corstone SSE-315采用三级电源域架构,包含系统级(PD_SYS)、处理器级(PD_CPU0)和专用加速器级(PD_NPU0)。这种分层设计允许独立控制各功能模块的供电状态,实测表明可降低静态功耗达47%。每个电源域支持四种基本状态:
关键经验:PD_CPU0TCM的状态需通过CPUPWRCFG.TCM_MIN_PWR_STATE单独配置,这是许多开发者容易忽略的细节。若错误配置为OFF而实际需要RET,将导致关键数据丢失。
电源状态转换遵循严格的依赖关系(如表1所示)。当唤醒PD_CPU0时,若PD_SYS处于OFF/RET状态,硬件会自动将其切换到ON状态。这种设计确保了:
表1:典型电源状态转换条件
| 目标状态 | 前置条件 | 典型唤醒源 | 恢复时间(μs) |
|---|---|---|---|
| HIBERNATION0 | PD_NPU0=OFF | EWIC中断 | 120-150 |
| SYS_RET | VMR区域配置为RET | 定时器唤醒 | 80-100 |
| SYS_OFF | 所有中断已清除 | 外部复位 | >500 |
以HIBERNATION0模式为例,进入前必须完成以下关键操作:
c复制// 1. 配置VMR区域保持策略
PDCM_PD_VMR0_SENSE = OFF; // 或设置为RET保留数据
PDCM_PD_SYS_SENSE = OFF;
// 2. 禁用系统定时器
TIMER0_CTRL |= DISABLE_BIT;
TIMER1_CTRL |= DISABLE_BIT;
// 3. 清除所有中断状态
SECPPCINTSTAT = 0xFFFFFFFF;
SECMSCINTSTAT = 0xFFFFFFFF;
// 4. 启用EWIC唤醒功能
CPU0_PWRCTRL |= EWIC_EN;
实测中发现,若未正确清除MPC中断状态(通过SECMPCINTSTAT寄存器),系统可能无法进入深度休眠。建议在代码中添加状态检查:
c复制while(SECMPCINTSTAT != 0) {
SECMPCINTSTAT = SECMPCINTSTAT; // 写1清除
}
SSE-315采用256MB交替的Secure/Non-secure区域划分(如图1所示),关键特性包括:

图1:安全/非安全内存交替分布模型
CPU0的TCM映射具有以下特点:
重要提示:虽然可通过主互联访问其他CPU的TCM,但Arm强烈建议使用DMA传输数据。实测显示,直接访问会导致性能下降60%以上。
volatile memory region(VMR)的典型配置流程:
c复制VM0MPC_CTRL = (0x31000000 >> 12) | SECURE_EN;
VM1MPC_CTRL = (0x31100000 >> 12) | NON_SECURE_EN;
bash复制# 使用J-Link Commander验证
mem32 0x31000000 4 # 应返回安全区域数据
mem32 0x21000000 4 # 应返回非安全区域数据或错误
常见问题排查:
当通过PWRSYSWAKE接口唤醒时,需注意:
mermaid复制sequenceDiagram
participant ExtDevice
participant PWRSYSWAKE
participant CPU0
ExtDevice->>PWRSYSWAKE: 触发唤醒信号
PWRSYSWAKE->>PD_SYS: 供电恢复
PWRSYSYS->>CPU0: 发送中断
CPU0->>MPC: 重新配置安全策略
CPU0->>BUSWAIT: 释放访问权限
在不同电源状态下,内存保持策略需要特别注意:
| 电源状态 | TCM保持要求 | VMR保持策略 | 恢复时间影响 |
|---|---|---|---|
| ON | 全功能 | 无限制 | - |
| RET | CPUPWRCFG控制 | MPC配置有效 | +5μs |
| OFF-DeepSleep | 仅标签存储 | 必须配置RET | +50μs |
| HIBERNATION0 | 不保持 | 选择性保持 | +120μs |
实测案例:在智能传感器应用中,通过合理配置VMR的RET区域,将关键数据保持电流从3.2mA降至0.8mA。
推荐使用以下调试方法:
某工业控制器项目通过优化电源序列,将唤醒时间从210μs缩短至95μs,关键优化点包括:
从HIBERNATION0唤醒时,所有MPC/PPC默认恢复为安全配置,必须由CPU重新初始化后才能允许非安全访问。曾出现过因未及时配置PPC导致外设无法访问的案例。
关键安全寄存器(如SACFG)必须配置为仅特权模式访问,防止用户态恶意修改:
c复制SACFG_ACCESS |= PRIV_ONLY_EN;
c复制if (EXP_MGR_SEC_STAT != SECURE) {
BLOCK_ACCESS();
}
这些经验来自多个量产项目中的实际教训,正确实施后可显著提升系统可靠性和安全性。