关于STM32中断的理解

中断:   在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。  
中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
中断嵌套: 当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
关于STM32中断的理解_第1张图片 关于STM32中断的理解_第2张图片
C语言程序中中断的执行流程:正常情况下,程序在主程序里不断执行。当中断条件满足时,主程序暂停,然后自动跳转至中断程序中运行。中断程序顺序执行完成后,再返回主程序继续执行。中断函数不需要我们进行调用,当中断来临时,自动调用中断函数。
int main(void)
{
    while(1)
    {
        //主程序
        //...
        //主程序
    }
}

void EXTI0_IRQHandler(void)
{
    //中断程序
    //... 
    //中断程序
}

STM32拥有68个可屏蔽中断通道(68为F1最多数量,具体数量以数据手册为准),包含EXTITIMADCUSARTSPII2CRTC等多个外设。

使用NVIC(中断优先级管理)统一管理中断。每个中断通道都拥有16可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。

关于STM32中断的理解_第3张图片

 此图中n的意思为:一个外设可能会同时占用多个中断通道,所以有n条线。

例如:

关于STM32中断的理解_第4张图片

NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级

 NVIC优先级分组:

关于STM32中断的理解_第5张图片

抢占优先级高的可以中断嵌套别的中断正在执行,只要抢占优先级比它低,它就可以打断别的中断,执行它自己的程序),响应优先级高的可以优先排队当抢占优先级的等级一样的时候,系统再判断响应优先级,响应优先级高的先执行,别的中断在执行时,需要等别的中断执行完再执行),抢占优先级和响应优先级均相同的按中断号排队。

响应优先级的特点引出了两个函数,分别是挂起中断解挂中断。(当中断在等待别的中断执行的时候,调用挂起中断函数将这个中断挂起,等中断完成了,再调用解挂中断函数将这个 挂起中断解挂,让它被执行。)

打个比方:好比一个课堂上,有多个同学要问问题,那就要举手(发生中断,但是有好几个),老师看到了,但只能先点一个同学的名字,同学们的年龄有大有小,老师当然是照顾年龄小的同学(优先级的值越小,优先级越高),让这个同学站起来阐述他的问题(处理中断),这个同学说完问题坐下来就不用举手了(中断执行 )。但其他同学在这个过程手必须举着,这时他们的状态就是“挂起”(执行了挂起中断函数),等刚刚那个同学说完问题坐下来,老师就可以点他们的名字了(处理被挂起的中断,就是解挂)

如果在你的系统中使用了 TIME2(中断通道 28)和 EXTI0(中断通道 6)两个中断,而TIME2 中断必须优先响应,而且当系统在执行 EXIT0 中断服务时也必须打断(抢占、嵌套) ,就必须设置 TIME2 的抢占优先级比 EXTI0 的抢占优先级要高(数目小) 。假定 EXTI0 为 2 号抢占优先级,那么 TIME2 就必须设置成 0 或 1 号抢占优先级。这些工作需要在 AIRC 中的PRIGROUP 设置完成,确定了整个系统所具有的优先级个数后,再分别对每个中断通道(设备)进行设置。

 

 

 

你可能感兴趣的:(c语言,单片机,学习)