STM32系统的中断
扫描二维码
随时随地手机看文章
关于中断分组:
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,两个寄存器的值来判定是哪个中断源产生的中断。