在物联网设备爆炸式增长的今天,硬件级安全已成为嵌入式系统设计的首要考量。作为ARMv8-M架构的代表性产品,Cortex-M23处理器通过TrustZone技术为资源受限设备提供了芯片级的安全隔离方案。我们基于V2M-MPS2+开发板构建的IoT子系统,完整实现了从处理器核到外设的全链条安全防护。
该子系统采用双域安全设计理念:
通过SIE200系统IP组件实现以下关键特性:
实践提示:在调试阶段,建议先禁用MPC/PPC功能验证基础功能,待系统稳定后再逐步启用安全特性,可显著降低初期开发难度。
V2M-MPS2+平台提供丰富的实验资源:
code复制+---------------------+-----------------------+
| 资源类型 | 配置详情 |
+--------------------+-----------------------+
| 核心处理器 | Cortex-M23 @20MHz |
| 安全存储 | 4MB ZBT SRAM(SSRAM1) |
| 通用存储 | 4MB ZBT SRAM(SSRAM2/3)|
| 扩展存储 | 16MB PSRAM |
| 安全外设 | 5xUART/4xI2C/5xSPI |
| 调试接口 | JTAG/SWD可选 |
+--------------------+-----------------------+
SIE200作为ARMv8-M的配套IP,其关键组件配置如下:
c复制// AHB5总线矩阵安全属性配置示例
AHB_Matrix_Config {
.secure_masters = {DMA0_S, CPU_S}, // 安全域主设备
.nonsecure_masters = {DMA1_NS, ETH_NS}, // 非安全域主设备
.security_granularity = 256, // 安全检查粒度(字节)
};
每个存储区域对应独立的MPC:
典型配置参数:
bash复制# MPC寄存器配置示例(SSRAM1)
Offset 0x58007000:
Bit[31:16] - 安全属性位图 (1=安全, 0=非安全)
Bit[15:0] - 访问权限位图 (1=允许, 0=拒绝)
安全启动链是TrustZone实施的基石:
关键寄存器初始化序列:
armasm复制; Cortex-M23安全初始化代码片段
LDR r0, =0xE000ED08 ; VTOR寄存器地址
LDR r1, =0x10000000 ; 安全向量表基址
STR r1, [r0]
LDR r0, =0x40088000 ; SAU控制寄存器
MOV r1, #0x00000005 ; 启用SAU并设置非安全可调用区域
STR r1, [r0]
DSB ; 确保配置生效
系统采用分区分级保护策略:
| 地址范围 | 大小 | 安全属性 | 功能描述 |
|---|---|---|---|
| 0x00000000 | 4MB | 非安全 | 应用代码区(SSRAM1镜像) |
| 0x10000000 | 4MB | 安全 | 安全固件区(SSRAM1实体) |
| 0x20000000 | 32KB | 非安全 | 快速数据区(FPGA BRAM) |
| 0x80000000 | 16MB | 非安全 | 扩展存储区(PSRAM) |
避坑指南:ZBT SRAM的地址镜像区域(如0x00400000-0x007FFFFF)必须与主区域保持相同安全属性,避免通过别名绕过安全控制。
配置SSRAM1的安全属性:
c复制#define SSRAM1_MPC_BASE 0x58007000
void configure_ssram1_mpc(void) {
volatile uint32_t *mpc_ctrl = (uint32_t*)(SSRAM1_MPC_BASE + 0x00);
volatile uint32_t *mpc_blk = (uint32_t*)(SSRAM1_MPC_BASE + 0x04);
// 设置256字节为安全粒度
*mpc_ctrl = (0 << 0) | // GATE_RESP=0(等待模式)
(8 << 8); // BLK_SIZE=8(256字节块)
// 配置前1MB为安全区域,其余非安全
for(int i=0; i<4096; i++) {
mpc_blk[i] = (i < 1024) ? 0x1 : 0x0; // 1024*256B=1MB
}
// 锁定配置
*mpc_ctrl |= (1 << 16); // LOCK位
}
系统采用两级防护:
权限配置寄存器示例:
bash复制# APB PPC EXP1寄存器映射(0x4800A000)
Bit[15:0] - 外设非安全属性:
Bit0: SPI0安全状态
Bit5: UART0安全状态
...
Bit[31:16] - 外设访问权限:
Bit16: SPI0特权访问
Bit21: UART0特权访问
四个PL081 DMA控制器可独立配置安全属性:
c复制// 配置DMA0为非安全主设备
#define MSCEXP_CTRL 0x48007000
*(volatile uint32_t*)MSCEXP_CTRL |= (1 << 4); // 设置NS_MSCEXP[4]
安全DMA传输流程:
系统包含三个关键时钟域:
时钟切换安全考量:
armasm复制; 安全世界时钟配置代码
LDR r0, =0x5002801C ; 预分频器寄存器
MOV r1, #199999 ; 20MHz/(199999+1)=100Hz
STR r1, [r0] ; 配置低频监测时钟
提供四种调试组合可选:
| 镜像文件 | 调试接口 | 跟踪方式 |
|---|---|---|
| an519je3.rbe | JTAG | ETM |
| an519jm3.rbe | JTAG | MTB |
| an519se3.rbe | SWD | ETM |
| an519sm3.rbe | SWD | MTB |
调试安全策略:
mermaid复制sequenceDiagram
安全世界->>+非安全世界: 触发更新通知
非安全世界->>+安全世界: 提交固件哈希
安全世界->>安全世界: 验证签名
alt 验证成功
安全世界->>Flash: 擦除目标区域
安全世界->>非安全世界: 请求数据块
非安全世界->>安全世界: 传输加密数据
安全世界->>Flash: 编程数据
else 验证失败
安全世界->>非安全世界: 终止更新
end
通过Shield接口连接安全传感器:
c复制// 启用Shield0的SPI3功能
GPIO0->ALTFUNCSET = (1 << 11) | (1 << 12) | (1 << 13) | (1 << 14);
bash复制# 配置APB PPC EXP1寄存器
devmem 0x4800A000 32 0x00001000 # 设置SPI3为非安全外设
code复制+--------+--------+--------+--------+
| 头校验 | 加密IV | 加密载荷 | MAC校验 |
+--------+--------+--------+--------+
| 故障现象 | 排查步骤 | 解决方案 |
|---|---|---|
| 安全世界崩溃 | 检查SAU/MPC配置 | 确保非安全调用区域正确 |
| DMA传输失败 | 验证MSC安全属性 | 配置DMA主设备安全域 |
| 外设无响应 | 检查PPC权限设置 | 开放非安全世界必要外设权限 |
| 随机存储器访问错误 | 审查MPC块配置 | 确认安全区域无地址重叠 |
关键路径加速:
中断延迟优化:
c复制// 设置安全中断优先级分组
NVIC_SetPriorityGrouping(3); // 4位抢占优先级
NVIC_SetPriority(SecureIRQn, 0x0); // 最高优先级
armasm复制; 安全世界低功耗进入流程
WFI_Entry:
PUSH {LR}
BL SecureState_Save
DSB
WFI
BL SecureState_Restore
POP {PC}
本设计已在智能电表、工业传感器等多个领域成功应用,实测表明TrustZone实施方案可有效防御90%以上的硬件攻击向量。开发者可根据实际需求调整MPC/PPC的粒度,在安全性和性能之间取得最佳平衡。