中断优先级如何设置?

作者&投稿:苍侧 (若有异议请与网页底部的电邮联系)
如何正确设置中断优先级~


C51中设置中断优先级,需要对中断寄存器IP进行配置。具体值需要根据用户需要的优先级顺序进行确定,具体的设置方法就是直接写如下C语言语句:

IP = 06H; // 如果5个中断同时发生,则响应次序为:定时器0 -> 外中断1 -> 外中断0 -> 定时器1 -> 串行中断

下面给出IP寄存器中每位(共8位)的含义:
PX0(IP.0),外部中断0优先级设定位;
PT0(IP.1),定时/计数器T0优先级设定位;
PX1(IP.2),外部中断0优先级设定位;
PT1(IP.3),定时/计数器T1优先级设定位;
PS (IP.4),串行口优先级设定位;
PT2 (IP.5), 定时/计数器T2优先级设定位(80C52的T2)
IP.6和IP.7无意义,均为0(在C51中PT2也设置为0)。

ps:IP默认值为00H,此时优先级顺序为:
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断

设置中断优先级的函数,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;

定时器中断和串口中断冲突的原因是什么? 定时多少,串口的波特率多少?
一般情况,个人觉得不至于冲突这么严重。很有可能是你在串口中断函数或者定时中断函数里做了太多的事情。以至于下一个中断来的时候,还没有跳出上一中断。

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

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

优先级:单片机采用了自然优先级和人工设置高、低优先级的策略,即可以由程序员设定那些中断是高优先级、哪些中断是低优先级,由于只有两级,必有一些中断处于同一级别,处于同一级别的,就由自然优先级确定

SETBPT0;恢复T0中断为高中断优先级
CLR PT0;置T0中断为低中级优先级

对51单片机了,简单而言就是通过控制IP寄存器,它的低五位一次是(由高到底)PS PT1 PX1 PT0 PX0对应着五个中断,然后分别置1就可以了


外部中断优先级怎么设定的?
3、T0——定时器\/计数器0中断,由T0计数器计满回零引起。默认优先级第三 4、T1——定时器\/计数器1中断,由T1计数器计满回零引起。默认优先级第四 5、T2——定时器\/计数器2中断,由T2计数器计满回零引起。默认优先级第五 优先级设定:PX0(IP.0),外部中断0优先级设定位;PT0(IP.1),...

树莓派配置中断优先级
它可以触发CPU的中断处理程序,以响应外部设备的请求。3、在树莓派的Linux系统中,IRQ的优先级是通过中断控制器(InterruptController)来管理的,中断控制器可以根据中断的优先级来决定哪个中断先被处理。4、在树莓派的Linux系统中,可以通过修改中断控制器的配置文件来设置中断的优先级。

什么是中断优先级?中断优先级的处理原则是什么?
中断优先级是指在多个中断同时出现的情况下,系统为每个中断分配的优先级。中断优先级越高,表示该中断对系统的影响越重要。中断优先级的处理原则是“高优先级中断可以打断低优先级中断,但低优先级中断不能打断高优先级中断”。如果当前正在处理一个低优先级的中断时,如果出现了一个高优先级的中断,那么...

51单片机有哪几个中断源?如何设定它们的优先级?
每个中断源都可以通过设置中断优先级寄存器IP确定为高优先级中断或低优先级中断,实现二级嵌套。同一优先级别的中断源可能不止一个,因此,也需要进行优先权排队。同一优先级别的中断源采用自然优先级。中断优先级寄存器IP,用于锁存各中断源优先级控制位。IP中的每一位均可由软件来置1或清零,1表示高优先...

外部中断优先级怎么设定的?
INT0 #外部中断 #P3.2 #低电平 #下降沿 #默认优先级 #INT1 #P3.3 #T0 #定时器 #计数器0中断 #T1 #计数器1中断 #T2 #计数器2中断 #PX0 #IP.0 #PT0 #IP.1 #PX1 #IP.2 #PT1 #IP.3 #PS #IP.4 #串行口 #优先级设定 ...

中断的优先级原则
中断的优先级原则是指在计算机系统中,当多个中断同时发生时,系统根据预设的优先级规则处理这些中断,优先级高的中断会被优先处理。1. 中断的概念和作用 在计算机系统中,中断是指CPU在处理任务时,由硬件或软件发起的暂停当前任务,转而处理更重要或紧急的事件的请求。中断的作用包括处理外部事件、实现多...

中断嵌套中断优先级
然而,查询优先级与中断嵌套并不等同。即使一个中断源具有高查询优先级,如果另一个中断服务函数已经在执行,它并不会打断低查询优先级的服务。例如,计数器0的中断虽然优先级高于外部中断1,但如果外部中断1服务函数正在运行,计数器0的中断仍会被延迟。另一方面,执行优先级是通过设置IP寄存器来控制的,...

要同时打开定时器T0,T1的中断,并将T0设为高优先级中断,所要进行的...
设置如下:中断允许(IE):EA =1,ET1=1,ET0=1 中断优先级(IP):PT0=1,PT1=0 要记住,没有设置IP时,单片机会按照查询优先级(或都说逻辑优先级)来排队进入服务。如果要想让某个中断优先响应, 则要设置IP,更改执行优先级(或者说物理优先级)。要注意的是,当设置了IP后,当低执行...

51单片机的每个中断源有几个中断优先级?它们在进行中断请求是单片机如 ...
例如,假设在51单片机的一个应用系统中,定时器中断和外部中断0同时发生,且外部中断0被设置为高优先级,而定时器中断被设置为低优先级。在这种情况下,单片机会优先处理外部中断0,待其处理完成后再处理定时器中断。这种处理方式能够确保对外部突发事件的快速响应,同时也不耽误定时器中断的常规处理。总的...

什么叫中断优先级?如何设置?80c51中断优先级和众多优先权有什么...
只有高优先级的中断申请,可以中断,低优先级的中断程序,形成:中断嵌套。而低优先级的中断申请,不能中断高优先级的中断程序。此外,同级别的中断申请,也不能中断同级的中断程序。如何设置?(题主采纳的答案,所写的,是错的。)正确方法,应该是在 IP 寄存器中设置。将 IP.0 置位,就把 INT0 ...

全州县17785068500: 请教高人C51单片机C语言中的中断优先级怎么设置? -
伊狭新洁: C51中设置中断优先级,需要对中断寄存器IP进行配置.具体值需要根据用户需要的优先级顺序进行确定,具体的设置方法就是直接写如下C语言语句:IP = 06H; // 如果5个中断同时发生,则响应次序为:定时器0 -> 外中断1 -> 外中断0 -> 定时...

全州县17785068500: stm32 中断优先级怎么配置 -
伊狭新洁: 可以参照stm32提供的库函数,中断优先级有抢占优先级和响应优先级之分,可以在nvic寄存器里进行响应配置,优先级数字越小代表的优先级越高.stm32提供的库函数有如下的操作, nvic_initstructure.nvic_irqchannel = exti1_irqn; //中断线1...

全州县17785068500: 如何设置51中断优先级? -
伊狭新洁: 优先级:单片机采用了自然优先级和人工设置高、低优先级的策略,即可以由程序员设定那些中断是高优先级、哪些中断是低优先级,由于只有两级,必有一些中断处于同一级别,处于同一级别的,就由自然优先级确定

全州县17785068500: 内部中断,外部中断,网口中断优先级 如何配置 -
伊狭新洁: 51单片机中断源总共有5个,即2个外部中断、2个定时/计数器中断、1个串行口中断. 没有时钟中断,你说的时钟中断是指定时器中断吧. 中断优先级的设定 主要是对中断优先级寄存器IP的设置, 其8位内容 如下:XXPT2 PS PT1 PX1 PT0 ...

全州县17785068500: [电子百科] 单片机怎样管理中断?怎样开放和禁止中断?怎样设置优先级? -
伊狭新洁: (1)由中断源提出中断,再用中断控制端决定是否中断,再用设置好的中断优先级的顺序响应中断.同一优先级的中断按:外部中断0,定时中断0,外部中断1,定时中断1,串行中断昀顺序响应中断.中断后的结果是:脉冲触发,IEl(0)被清0.电平触发,IEl(0)不被清0,要用软件清0.(2)它由中断允许寄存器IE控制,如开放中断EA必须为1,再使要求中断的中断源的中断允许位为1,要禁止中断,EA-O即可.(3)由IP控制,1为高级,0为低级,PS为串行中断优先级,PTl(0)为定时中断1(0)优先级,PXl(0)外部中断1(0)优先级,想使哪个中断源为优先级,就置哪个优先设定位为1.

全州县17785068500: 滴答定时器的中断优先级怎么设置 -
伊狭新洁: 中断的自然优先级别是:(由高到低) 1、外部中断0 2、定时器0 3、外部中断1 4、定时器1 5、串行中断 6、定时器2 如果你想把定时器2的优先级置为最高,在IP寄存器中只把PT2位置为1即可.

全州县17785068500: 如何设置8051单片机的中断优先级 -
伊狭新洁: PIC系列单片机只有一个中断入口(004H),所有的中断都通过该入口进入中断服务子程序,至于是哪一个中断源,只有在进入中断服务子程序后查询中断标志才能确认.该单片机没规定中断的优先级,也没有用于设定中断优先级的寄存器,...

全州县17785068500: stm32 怎么分配中断优先级 -
伊狭新洁: 选择中断分组也就是选择用于分别表达抢先式优先级和子优先级的位数,即用多少位来表达抢先式优先级,多少位来表达子优先级(表达优先级一共用到8位,不同的分组导致分配给两种优先级的位数不同),一般情况下如果你的应用中优先级级数不多的话建议选分组0和分组1就足够了

全州县17785068500: 关于52单片机,我要设置优先级,先让内中断1为第一响应,再让外中断0为第二响应,我想问如何设置呢? -
伊狭新洁: 内中断1?是外部中断1吧.SETB PX1 CLR PX0 就可以了.

全州县17785068500: tm4c123g中断优先级怎么设置 -
伊狭新洁: 设置中断优先级的函数,CMISIS已经写好,并嵌入到了编译器中,例如,我们用KEIL开发的话,设置中断优先级的函数位于core_cm0.h文件当中,函数如下所示:/** \brief Set Interrupt Priority The function sets the priority of an interrupt.\note The ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网