Exception 皮质-M0+;设置系统异常的优先级

Exception 皮质-M0+;设置系统异常的优先级,exception,arm,Exception,Arm,我正在使用Cortex-M0+NXP LPC11U68,我有一个理解问题。ARM网站上有一个指定异常重置、NMI和HardFault具有从-3到-1的固定优先级。所有其他异常(系统和非系统)具有可配置的优先级 据我所知,如果软件没有不同的定义,这些其他异常的优先级为0(最高)。我说得对吗?我撞到墙上了。在LPC11U68手册(NVIC章节)中,寄存器(中断优先级寄存器X)用于定义优先级,但仅用于外围设备。如何为系统中断(如SysTick Timer、SVCall或PendSV)指定优先级(从0到

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


据我所知,如果软件没有不同的定义,这些其他异常的优先级为0(最高)。我说得对吗?我撞到墙上了。在LPC11U68手册(NVIC章节)中,寄存器(中断优先级寄存器X)用于定义优先级,但仅用于外围设备。如何为系统中断(如SysTick Timer、SVCall或PendSV)指定优先级(从0到3)?ARM站点声明“除重置、NMI和硬故障外,所有异常的可配置优先级。”我真的很困惑如何设置系统异常的优先级

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

NVIC_SetPriority(SysTick_IRQn, 0);
顺便说一句:-3的优先级高于0,但仅适用于硬故障

另见:

更新

我不明白你为什么如此渴望直接使用寄存器<代码>NVIC_设置优先级为低级别。无论如何,这是(皮层M0+/CMSIS):

\uuuuuu STATIC\uu INLINE void NVIC\uu SetPriority(IRQn\u类型IRQn,uint32\u t priority)
{
如果((int32_t)(IRQn)<0)
{

SCB->SHP[_SHP_IDX(IRQn)]=((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)]&~(0xFFUL感谢您提供的所有信息!现在我清楚了。我使用NVIC_设置优先级功能中的“反向工程”来确定系统控制块(SCB)LPC11U68手册中没有介绍寄存器。这就是我缺少某些内容的原因。可以找到更多信息


p、 我喜欢使用寄存器来获取最低的知识。我使用的是iSystem WinIdea开发环境,而不是Keil uVision(好的,它用于反向工程)。再次感谢您!

我很清楚,-3的优先级高于0,但在ARM中指定可以为SysTick设置优先级(例如)。我需要知道为什么NVIC中没有允许设置SysTick优先级的寄存器。只有外围设备的寄存器可用。我尝试在最低的C级别上编写代码,所以我正在设置寄存器。我看到您找到了答案,但要明确说明:SysTick和PendSV异常的优先级通过e SHPR3寄存器[B3.2.10系统处理程序优先级寄存器3,SHPR3](和通过SHPR2寄存器的SVCall)。准确理解系统寄存器的工作方式肯定没有错,但CMSIS NVIC功能是有目的的。跟随在你后面的人(可能是你自己)希望看到一个标准的、有良好文档记录的功能来执行IRQ优先级操作。LPC手册中没有描述SCB的原因是它是处理器的一部分,作为IP从ARM购买,并在ARM手册中描述,如技术参考手册和架构参考手册。LPC文档是关于ipherals连接到ARM,但由NXP创建。
__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)));
  }
}