×
单片机 > 单片机程序设计 > 详情

STM32系统的中断

发布时间:2020-08-24 发布时间:
|

关于中断分组:

STM32有多种中断分组,各系列可能分组方式不一样。但是,分组一般就是规定了本组有几个抢占优先级,几个子优先级。在组设置寄存器中设置好组号后,所有的中断都要按照这个来设置。如果更改了组号,那么其他的中断也都要按照这个组号来配置了。所以,设置好组号后不要再随便改了,如果要改,就要看看已经配置好的中断是否满足设置需求,是否优先级数值超出了规定值。
另外:一个组的抢占优先级和子优先级之积是16.因为一共是4个位。抢占优先级0位(1个),子优先级就4位(16个);抢占优先级1位(2个),子优先级就3位(8个),以此类推。

抢占优先级 代表的优先级最高,高优先级可以嵌套低优先级的中断。子优先级不能嵌套,需要等上一个中断完成后再优先响应。
两个中断,抢占优先级高的先执行,如果抢占优先级相同,看子优先级的高低,如果子优先级也相同,就按照中断向量地址(默认的优先级,地址低的先执行)来执行。

注意:我有一个程序,设置一个中断的抢占优先级高于其他中断,发现程序出现奇怪的现象(怀疑抢断优先级高的打断了较低中断的重要时序)。改成同等抢占优先级,而子优先级较高时就正常。我想,还是很不要乱提高抢占优先级的好。苦恼!


STMF1系列的外部中断,0-4号外部中断有单独的中断处理函数,而后面的就是5-9,10-15分别共用一个中断处理函数了。
可以在中断处理函数里再判断是哪个中断源产生的中断,做响应的处理。
如:

//外部中断15~10服务程序
void EXTI15_10_IRQHandler(void)
{           
    if((EXTI->PR&0x00008000)&&(EXTI->IMR&0x00008000))   //PB15中断处理部分程序
    {
//        if(CollecFlag == 1) TIM3->CR1|=0x01;                //使能定时器3,开始采集数据
//        SFlag = 1;               
       
        EXTI->PR=1<<15; //清除LINE15上的中断标志位   
    }

    if((EXTI->PR&0x00002000)&&(EXTI->IMR&0x00002000))    //PB13中断处理部分程序
    {
        if(CollecFlag == 1) TIM3->CR1|=0x01;                //使能定时器3,开始采集数据
        SFlag = 1;               
       
        EXTI->PR=1<<13; //清除LINE13上的中断标志位   
    }   
    //编制程序段
 
}


通过判断EXTI->PR和EXTI->IMR,两个寄存器的值来判定是哪个中断源产生的中断。

关键字:STM32系统  中断 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
关于89C52单片机11.0592M晶振产生115200波特率的方法