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

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

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);   
  •     :   
  •     :  
继承事业,薪火相传
返回列表