LAT1285
LAT1285 - Rev 1.0 page 2/24
1.1. Fault 异常类型(带安全扩展)
1.1.1. Hard Fault
HardFault 是默认的 Fault 异常,总是使能。触发的原因可能是由于异常处理本身触发了错
误,或者某个异常无法被其他机制处理而上升到 HardFault。它的优先级高于所有其他可配置优
先级的异常。
在 TrustZone 环境中,HardFault 不是 Bank 的。同一个异常,要么触发 S 侧的
HardFault,要么触发 NS 侧的 HardFault。SCB 的 AIRCR.BFHFNMINS 决定了是否使能 NS
的 BusFault,HardFault 和 NMI。如果 SCB 的 AIRCR.BFHFNMINS=0,HardFault 总是触发 S
侧的 HardFault Hanlder;如果 AIRCR.BFHFNMINS=1,则故障可能触发 NS 侧的 HardFault
Handler,也可能触发 S 侧的 HardFault Handler。图 1 给出了在其他 Fault 未使能情况下,
HardFault Handler 触发一般情形。
图1. HardFault Handler 的触发
需要注意的是,即使 AIRCR.BFHFNMINS=1,原本 target 到 S 侧并且上升为 HardFault 的
异常,将依旧触发 S 侧的 HardFault,他们并不受到 AIRCR.BFHFNMINS 位的影响,例如当安
全代码违反 MPU 保护规则,产生 MemManage 错误的时候,即使 AIRCR.BFHFNMINS=1,故
障还是会进入 Secure HardFault Handler。而 NS 侧的 HardFault,只有当
AIRCR.BFHFNMINS=1 时才有可能会被触发。
另外还要注意一点,AIRCR 寄存器不能直接修改,需要先写 Key 值才能更改寄存器内容。
置位或清除 AIRCR.BFHFNMINS bit 的示例代码如下(只能在安全代码中使用):
void SECURE_SetNMIHFBFTarget(int NS)
{
uint32_t reg_value;
uint32_t target = (NS==1)?1:0;
/* read old register configuration */
reg_value = SCB->AIRCR;
/* clear bits to change */
reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_BFHFNMINS_Msk));
/* insert write key and target bit */
reg_value = (reg_value |
((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
(target << SCB_AIRCR_BFHFNMINS_Pos) );
SCB->AIRCR = reg_value;
}