首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Cortex-M3和Cortex-M4 Fault异常应用(3)

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中写入故障地址。
继承事业,薪火相传
返回列表