Cortex-M3和Cortex-M4 Fault异常应用(2)
- UID
- 1029342
- 性别
- 男
|
Cortex-M3和Cortex-M4 Fault异常应用(2)
3.1.1 SCB->CCR 寄存器
蓝色部分控制是否使能相应的用法Fault
位
| 名称
| 描述
| [31:10]
| -
| 保留
| [9]
| STKALIGN
| 表示进入异常时的堆栈对齐。
0:4字节对齐
1:8字节对齐
进入异常时,处理器使用压入堆栈的PSR位[9]来指示堆栈对齐。从异常返回时,这个堆栈位被用来恢复正确的堆栈对齐。
| [8]
| BFHFNMIGN
| 使能时,使得以优先级位-1或-2运行的处理程序忽略加载和存储指令引起的数据总线故障。它用于硬故障、NMI和FAULTMASK升级处理程序中:
0:加载和存储指令引起的数据总线故障会引起锁定。
1:以优先级-1或-2运行的处理程序忽略加载和存储指令引起的数据总线故障。
仅在处理程序和其数据处于绝对安全的存储器时将该位设为1。一般将该位用于探测系统设备和桥接器以检测并纠正控制路径问题。
| [7:5]
| -
| 保留
| [4]
| DIV_0_TRP
| 当处理器进行除0操作(SDIV或UDIV指令)时,会导致故障或停止。
0:不捕获除以零故障
1:捕获除以零故障。
当该位设为0时,除以零返回的商数为0。
| [3]
| UNALIGN_TRP
| 使能非对齐访问捕获:
0:不捕获非对齐半字和字访问
1:捕获非对齐半字和字访问。
如果该位设为1,非对齐访问产生一个使用故障。无论UNALIGN_TRP是否设为1,非对齐的LDM、STM、LDRD和STRD指令总是出错。
| [2]
| -
| 保留
| [1]
| USERSETM
PEND
| 使能对STIR的无特权软件访问。
0:禁能
1:使能
| [0]
| NONEBASE
THRDENA
| 指示处理器如何进入线程模式:
0:处理器仅在没有有效异常时才能够进入线程模式。
1:处理器可以从EXC_RETURN值控制下的任何级别进入线程模式
| 3.1.2 SCB->SHP 寄存器组
以下SCB->SHP 寄存器组的寄存器用来设置异常处理程序的优先级:
SCB->SHP[0]:存储器管理Fault的优先级
SCB->SHP[1]:总线Fault的优先级
SCB->SHP[2]:用法Fault的优先级
为了编程中断和异常的优先级,CMSIS提供了函数NVIC_SetPrioriity和NVIC_GetPriority。这两个函数也位于core_cm3.h中,源码为:
[cpp] view plaincopyprint?
/** \brief Set Interrupt Priority
- This function sets the priority for the specified interrupt. The interrupt number can be positive
- to specify an external (device specific) interrupt, or negative to specify an internal (core)
- interrupt.
- Note: The priority cannot be set for every core interrupt.
- \param [in] IRQn Number of the interrupt for set priority
- \param [in] priority Priority to set
- */
- static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
- {
- if(IRQn < 0) {
- /* set Priority for Cortex-M System Interrupts */
- SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); }
- else {
- /* set Priority for device specific Interrupts */
- NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); }
- }
- /** \brief Get Interrupt Priority
- This function reads the priority for the specified interrupt. The interrupt number can be positive
- to specify an external (device specific) interrupt, or negative to specify an internal (core)
- interrupt.
- The returned priority value is automatically aligned to the implemented priority bits of the
- microcontroller.
- \param [in] IRQn Number of the interrupt for get priority
- \return Interrupt Priority
- */
- static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
- {
- if(IRQn < 0) {
- /* get priority for Cortex-M system interrupts */
- return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); }
- else {
- /* get priority for device specific interrupts */
- return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); }
- }
可以通过下面的示例代码更改异常优先级:
[cpp] view plaincopyprint?
- :
- :
- NVIC_SetPriority (MemoryManagement_IRQn, 0xF0);
- NVIC_SetPri ority (BusFault_IRQn, 0x80);
- NVIC_SetPriority ( UsageFault_IRQn, 0x10);
- :
- UsageFault_prio = NVIC_GetPriority ( UsageFault_IRQn);
- :
- :
|
|
|
|
|
|