stm32中断抢占优先级和响应优先级有啥区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32中断抢占优先级和响应优先级有啥区别相关的知识,希望对你有一定的参考价值。
抢占优先级和响应优先级,其实是一个中断所包含的两个优先级,其中前者是对抢占优先级的级别划分,后者是相同抢占优先级的优先级别的划分。比如:
中断A抢占优先级比B高,那么A的中断可以在B里面触发,忽略响应优先级;
A和B抢占优先级相同,则A、B的响应优先级决定谁先响应; 参考技术A 我总结一下吧 如果抢占优先级相同 中断同时来了 先处理响应优先级大的 在这里需要注意一点就是 如果抢占优先级相同 低的优先级发生了 虽然另一个中断比他的响应要大 但是不能使它挂起 所以响应优先级只是处理中断同时发生时先处理哪个中断的问题 如果抢占优先级大的 抢占优先级小的无论现在在执不执行 大的都可以让小的挂起而使 自己先执行 参考技术B 举个不恰当的例子,这就如同你是一名老师在上课,突然教务处主任来找你,他的级别(抢占优先级)比你高,可以中断你的课程。同样这个时候,校长也来找你办事,由于他的级别(抢占优先级)比教务主任高,所以他可以打断教务主任的事情,也就是中断嵌套,(教务主任肯定会对校长说:你先说,你忙清楚我再说我的事)。这就是抢占优先级的特点。
但是如果今天来找你的是两位校长呢?他们都是校级领导,抢占优先级是同一级。这个时候就要看响应优先级(子优先级)了,一个是正校长,一个是副校长。如果是同时来找你谈话,那么正校长的子优先级大于副校长,则先处理正校长的事,再处理副校长的事。
但是抢占优先级和响应优先级(子优先级)也有差别,那就是若两位校长不是同时来找你谈话的话,而是副校长先来找你,正校长过了一会才来找你,正好看到副校长在跟你说事,这个时候正校长虽然子优先级高于副校长,但也会安静在教室外等候,直到你和副校长的事处理完为止,才会找你谈话。也就是说子优先级没有中断嵌套。
STM32学习系列之中断优先级
首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。
这里写图片描述
抢占优先级&响应优先级
1.高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
2.抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
3.抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
4.如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行
打断只有抢占可以
值越小越高
例如:
假定设置中断优先级组为2,然后设置中断3(RTC中断)的抢占优先级为2,响应优先级为1。 中断6(外部中断0)的抢占优先级为3,响应优先级为0。中断7(外部中断1)的抢占优先级为2,响应优先级为0。
那么这3个中断的优先级顺序为:中断7>中断3>中断6。
中断设置顺序
1.中断优先级分组函数:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); //NVIC_PriorityGroup_0~4
2.中断初始化函数:
针对每一个中断
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
typedef struct
{
uint8_t NVIC_IRQChannel; //设置中断通道
uint8_t NVIC_IRQChannelPreemptionPriority;//设置响应优先级
uint8_t NVIC_IRQChannelSubPriority; //设置抢占优先级
FunctionalState NVIC_IRQChannelCmd; //使能/使能
} NVIC_InitTypeDef;
//例子
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器
以上是关于stm32中断抢占优先级和响应优先级有啥区别的主要内容,如果未能解决你的问题,请参考以下文章