中断优先级如何设置?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中断优先级如何设置?相关的知识,希望对你有一定的参考价值。

中断优先级如何设置?

设置中断优先级的函数,CMISIS已经写好,并嵌入到了编译器中,例如,我们用KEIL开发的话,设置中断优先级的函数位于core_cm0.h文件当中,函数如下所示:
/** \brief Set Interrupt Priority

The function sets the priority of an interrupt.

\note The priority cannot be set for every core interrupt.

\param [in] IRQn Interrupt number.
\param [in] priority Priority to set.
*/
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)

if(IRQn < 0)
SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
(((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn));
else
NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
(((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn));


从上面函数可以看出,该函数有两个参数,IRQn是指要设置的中断向量,priority是中断优先级,优先级可以是0 1 2 3四个数,0的优先级最大,3的优先级最小。假设你要设置GPIO1中断的优先级最高,那么就是:
NVIC_SetPriority(EINT1_IRQn, 0);
这时,有人会问,”EINT1_IRQn”
答:这个可以在LPC11xx.h文件当中找到,如下所示:
/*
* ==========================================================================
* ---------- Interrupt Number Definition -----------------------------------
* ==========================================================================
*/
typedef enum IRQn

/****** Cortex-M0 Processor Exceptions Numbers ***************************************************/
Reset_IRQn = -15, /*!< 1 Reset Vector, invoked on Power up and warm reset */
NonMaskableInt_IRQn = -14, /*!< 2 Non maskable Interrupt, cannot be stopped or preempted */
HardFault_IRQn = -13, /*!< 3 Hard Fault, all classes of Fault */
SVCall_IRQn = -5, /*!< 11 System Service Call via SVC instruction */
PendSV_IRQn = -2, /*!< 14 Pendable request for system service */
SysTick_IRQn = -1, /*!< 15 System Tick Timer */

/****** LPC11Cxx or LPC11xx Specific Interrupt Numbers *******************************************************/
WAKEUP0_IRQn = 0, /*!< All I/O pins can be used as wakeup source. */
WAKEUP1_IRQn = 1, /*!< There are 13 pins in total for LPC11xx */
WAKEUP2_IRQn = 2,
WAKEUP3_IRQn = 3,
WAKEUP4_IRQn = 4,
WAKEUP5_IRQn = 5,
WAKEUP6_IRQn = 6,
WAKEUP7_IRQn = 7,
WAKEUP8_IRQn = 8,
WAKEUP9_IRQn = 9,
WAKEUP10_IRQn = 10,
WAKEUP11_IRQn = 11,
WAKEUP12_IRQn = 12,
CAN_IRQn = 13, /*!< CAN Interrupt */
SSP1_IRQn = 14, /*!< SSP1 Interrupt */
I2C_IRQn = 15, /*!< I2C Interrupt */
TIMER_16_0_IRQn = 16, /*!< 16-bit Timer0 Interrupt */
TIMER_16_1_IRQn = 17, /*!< 16-bit Timer1 Interrupt */
TIMER_32_0_IRQn = 18, /*!< 32-bit Timer0 Interrupt */
TIMER_32_1_IRQn = 19, /*!< 32-bit Timer1 Interrupt */
SSP0_IRQn = 20, /*!< SSP0 Interrupt */
UART_IRQn = 21, /*!< UART Interrupt */
Reserved0_IRQn = 22, /*!< Reserved Interrupt */
Reserved1_IRQn = 23,
ADC_IRQn = 24, /*!< A/D Converter Interrupt */
WDT_IRQn = 25, /*!< Watchdog timer Interrupt */
BOD_IRQn = 26, /*!< Brown Out Detect(BOD) Interrupt */
FMC_IRQn = 27, /*!< Flash Memory Controller Interrupt */
EINT3_IRQn = 28, /*!< External Interrupt 3 Interrupt */
EINT2_IRQn = 29, /*!< External Interrupt 2 Interrupt */
EINT1_IRQn = 30, /*!< External Interrupt 1 Interrupt */
EINT0_IRQn = 31, /*!< External Interrupt 0 Interrupt */
IRQn_Type;
参考技术A 定时器中断和串口中断冲突的原因是什么? 定时多少,串口的波特率多少?
一般情况,个人觉得不至于冲突这么严重。很有可能是你在串口中断函数或者定时中断函数里做了太多的事情。以至于下一个中断来的时候,还没有跳出上一中断。

如果是这个原因,可以尝试在中断函数里只简单的赋值一些标志位。譬如,原来你的程序是在定时中断里每1秒让一个AD读一个电压,现在改成中断里设置AD_Flag = 1; 然后在main函数主循环里不断查询 if(AD_Flag ==1) ...//AD读一个电压;AD_Flag = 0;

用这种前后台的方式可以避免上述原因引起的中断冲突,本人以前试过,有效。希望有所帮助。

参考资料:百度一下

参考技术B 优先级:单片机采用了自然优先级和人工设置高、低优先级的策略,即可以由程序员设定那些中断是高优先级、哪些中断是低优先级,由于只有两级,必有一些中断处于同一级别,处于同一级别的,就由自然优先级确定 参考技术C SETBPT0;恢复T0中断为高中断优先级
CLR PT0;置T0中断为低中级优先级
参考技术D 对51单片机了,简单而言就是通过控制IP寄存器,它的低五位一次是(由高到底)PS PT1 PX1 PT0 PX0对应着五个中断,然后分别置1就可以了

内部中断,外部中断,网口中断优先级 如何配置

参考技术A   51单片机中断源总共有5个,即2个外部中断、2个定时/计数器中断、1个串行口中断。
  没有时钟中断,你说的时钟中断是指定时器中断吧。
  中断优先级的设定 主要是对中断优先级寄存器IP的设置,
  其8位内容 如下:XXPT2 PS PT1 PX1 PT0 PX0 其中PX0为外部中断0的优先级设定位,
  PX1为外部中断1的优先级设定位, PT0 PT1 为定时器的 优先级设定位,
  设置 优先级设定位=1时,该优先级最高 为高级中断。
  设置 优先级设定位=0时,该优先级最低 为低级中断。
  同一级别的中断内部优先级顺序是
  外部中断0最高
  定时器0
  外部中断1
  定时器2
  串行口最低
  最简单的方法是,将你用到的外部中断设为高级中断,其它的中断设为低级中断。
  可以在程序中 使用置1指令 SETB PX0,将外部中断0设为高级中断。

以上是关于中断优先级如何设置?的主要内容,如果未能解决你的问题,请参考以下文章

stm32中断抢占优先级和响应优先级有啥区别

[FreeRTOS].FreeRTOS CortexM3 M4中断优先级设置总结

STM32优先级

请教高人C51单片机C语言中的中断优先级怎么设置?

nrf51822的中断优先级是怎么规定的,不同的中断可以设置相同的优先级吗,

[电子百科] 单片机怎样管理中断?怎样开放和禁止中断?怎样设置优先级?