Cortex-M0 +设置系统异常的优先级

时间:2018-01-31 08:25:49

标签: exception arm

我使用的是Cortex-M0 + NXP LPC11U68,我有一个理解问题。 ARM网站上有一个table,它指定异常Reset,NMI和HardFault具有从-3到-1的固定优先级。所有其他异常(系统和非系统)都具有可配置的优先级。

据我所知,如果软件没有任何不同的定义,则其他异常的优先级为0(最高)。我对吗?在这里,我撞到了墙上。在LPC11U68手册(NVIC章节)中有寄存器(中断优先级寄存器X)来定义优先级,但仅适用于外设单元。如何为系统中断指定优先级(从0到3),例如SysTick Timer,SVCall或PendSV? ARM站点指出"除Reset,NMI和HardFault之外的所有异常的可配置优先级。"我真的很困惑如何设置系统异常的优先级。

2 个答案:

答案 0 :(得分:1)

您尚未提供有关您使用的开发环境的任何信息。但假设您使用了一些C代码,则可以使用NVIC_SetPriority设置优先级,例如:

NVIC_SetPriority(SysTick_IRQn, 0);

BTW:-3的优先级高于0,但只有avalialbe用于硬故障。

另见:https://www.keil.com/pack/doc/CMSIS/Core/html/group__NVIC__gr.html

<强>更新

我不明白你为什么如此渴望直接使用寄存器。 NVIC_SetPriority是低级别的。无论如何,这是source code(Cortex M0 + / CMSIS):

__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
  if ((int32_t)(IRQn) < 0)
  {
    SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
  }
  else
  {
    NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
  }
}

使用此代码,您可以进行更低级别的操作。

答案 1 :(得分:0)

感谢您提供所有信息!现在我很清楚。我使用NVIC_SetPriority函数中的“逆向工程”来确定LPC11U68手册中没有引入系统控制块(SCB)寄存器。这就是为什么我错过了什么。更多信息可以找到

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIHFDJCA.html

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIAGECDD.htm

P.S。我喜欢用寄存器来获得最低的知识。我使用的是iSystem WinIdea开发环境而不是Keil uVision(好吧,它用于逆向工程)。再次感谢你!