我使用的是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之外的所有异常的可配置优先级。"我真的很困惑如何设置系统异常的优先级。
答案 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(好吧,它用于逆向工程)。再次感谢你!