Cortex-M3和Cortex-M4 Fault异常应用(3)
- UID
- 1029342
- 性别
- 男
|
Cortex-M3和Cortex-M4 Fault异常应用(3)
3.1.3 SCB->SHCSR寄存器
与Fault异常相关位见下表的蓝色部分
位
| 名称
| 描述
| [31:19]
| -
| 保留
| [18]
| USGFAULTENA
| 用法Fault使能位,设为1时使能
| [17]
| BUSFAULTENA
| 总线Fault使能位,设为1时使能
| [16]
| MEMFAULTENA
| 存储器管理Fault使能位,设为1使能
| [15]
| SVCALLPENDED
| SVC调用挂起位,如果异常挂起,该位读为1
| [14]
| BUSFAULTPENDED
| 总线Fault异常挂起位,如果异常挂起,该位读为1
| [13]
| MEMFAULTPENDED
| 存储器Fault故障异常挂起位,如果异常挂起,该位读为1
| [12]
| USGFAULTPENDED
| 用法Fault异常挂起位,如果异常挂起,该位读为1
| [11]
| SYSTICKACT
| SysTick 异常有效位,如果异常有效,该位读为1
| [10]
| PENDSVACT
| PendSV异常有效位,如果异常有效,该位读为1
| [9]
| -
| 保留
| [8]
| MONITORACT
| 调试监控有效位,如果调试监控有效,该位读为1
| [7]
| SVCALLACT
| SVC调用有效位,如果SVC调用有效,该位读为1
| [6:4]
| -
| 保留
| [3]
| USGFAULTACT
| 用法Fault异常有效位,如果异常有效,该位读为1
| [2]
| -
| 保留
| [1]
| BUSFAULTACT
| 总线Fault异常有效位,如果异常有效,该位读为1
| [0]
| MEMFAULTACT
| 存储器管理Fault异常有效位,如果异常有效,该位读为1
| 尽管可以写SCB->SHCSR寄存器的所有位,但建议软件只写异常使能位。下面的例子用于使能所有非硬Fault(存储器管理Fault、总线Fault、用法Fault异常):
[cpp] view plaincopyprint?
- SCB - >SHCSR |= 0x00007000; /*enable Usage Fault, Bus Fault, and MMU Fault*/
注:要包含core_cm3.h头文件。
3.2 Fault异常的状态和地址寄存器
Fault状态寄存器组(SCB->CFSR和SCB->HFSR)和Fault地址寄存器组(SCB->MMAR和SCB->BFAR)包含Fault的详细信息以及异常发生时访问的内存地址。
地址/访问
| 寄存器
| 复位值
| 描述
| 0xE000ED28
RW 特权级
| SCB->CFSR
| 0x00000000
| 可配置Fault状态寄存器:包含指示存储器管理Fault、总线Fault或用法Fault的原因位
| 0xE000ED2C
RW 特权级
| SCB->HFSR
| 0x00000000
| 硬Fault状态寄存器:包含用于指示硬Fault原因位。
| 0xE000ED34
RW特权级
| SCB->MMFAR
| 不可知
| 存储器管理Fault地址寄存器:包括产生存储器管理Fault的位置的地址
| 0xE000ED38
RW特权级
| SCB->BFAR
| 不可知
| 总线Fault地址寄存器:包括产生总线Fault的位置的地址
| 3.2.1 SCB->CFSR寄存器
SCB->CFSR寄存器的位分配表:
bit31 bit16
| bit15 bit8
| bit7 bit0
| 用法Fault状态寄存器(UFSR)
| 总线Fault状态寄存器(BFSR)
| 存储器管理Fault状态寄存器(MMFSR)
| SCB->CFSR寄存器可以被分成三个组:
存储器管理Fault 状态寄存器:地址0x0xE000ED28,可以按字节访问
总线Fault状态寄存器:地址0xE000ED29,可以按字节访问
用法Fault状态寄存器:地址0xE000ED2A,可以按半字访问
3.2.1.1 存储器管理Fault状态寄存器MMFSR:指示存储器访问Fault的原因
位
| 名称
| 描述
| [7]
| MMARVALID
| 存储器管理Fault地址寄存器(MMAR)有效标志:
0:MMAR中的值不是一个有效Fault地址
1:MMAR中保留一个有效Fault地址。
如果发生了一个存储器管理Fault,并由于优先级的原因升级成一个硬Fault,那么硬Fault处理程序必须将该位设为0。
| [6:5]
| -
| 保留
| [4]
| MSTKERR
| 进入异常时的入栈操作引起的存储器管理Fault:
0:无入栈Fault
1:进入异常时的入栈操作引起了一个或一个以上的访问违犯。
当该位设为1时,依然要对SP进行调节,并且堆栈的上下文区域的值可能不正确。处理器没有向MMAR中写入Fault地址。
| [3]
| MUNSTKERR
| 异常返回时的出栈操作引起的存储器管理Fault:
0:无出栈Fault
1:异常返回时的出栈操作已引起一个或一个以上的访问违犯.
该Fault与处理程序相连,这意味着当该位为1时,原始的返回堆栈仍然存在。
处理器不能对返回失败的SP进行调节,并且不会执行新的存储操作。处理器没有向MMAR中写入Fault地址。
| [2]
| -
| 保留
| [1]
| DACCVIOL
| 数据访问违犯标志:
0:无数据访问违犯Fault
1:处理器试图在不允许执行操作的位置上进行加载和存储。
当该位为1时,异常返回的压入堆栈的PC值指向出错指令。处理器已在MMAR中加载了目标访问的地址。
| [0]
| IACCVIOL
| 指令访问违犯标志:
0:无指令访问违犯错误
1:处理器试图从不允许执行操作的位置上进行指令获取。
即使MPU被禁能,这一故障也会在XN(CM3内核的0xE0000000~0xFFFFFFFF区域)区寻址时发生。
当该位为1时,异常返回的压入堆栈的PC值指向出错指令。处理器没有向MMAR中写入故障地址。
|
|
|
|
|
|
|