您的位置:首页 > 其它

STM32共用中断和共用中断函数的判断

2016-12-09 21:21 411 查看
STM32外部中断查询: 15-10线的外部中断共用一个中断函数,怎么在该函数里查询是哪个中断线产生了中断呢?

使用 EXTI_GetITStatus()来查询哪根线产生了中断。

比如EXTI_GetITStatus(EXTI_Line13)就是查询13线是否产生了中断的。

还有 :当初你在设置中断引脚的时候都是不能把PB1和PD1同时设置为中断源的。如果非要设置,后面设置的会把前面的覆盖掉的。

编写中断服务函数经常需要使用两个函数。

第一个是判断某个中断线上的中断是否发生(即标志位是否置位):

ITStatus EXTI_GetITStatus(uint32_t EXTI_line); //放在中断服务函数开头,监测中断标志位

第二个是清除某个中断线上的中断标志位(即清除标志位):

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);//放在函数的结尾

常用外部中断服务函数的格式:

//格式一

void EXTI3_IRQHandler(void) {

If( EXTI_GetITStatus(EXTI_Line3)!-=RESET)//判断是否置位 {

Dosomething();//执行中断事件

EXTI_ClearITPendingBit(EXTI_Line3);//清零LINE上标志位 }

}

//===========================================//格式二

void EXTI3_IRQHandler(void) {

If( EXTI_GetFlagStatus(EXTI_Line3)!-=RESET)//判断是否置位 {

Dosomething();//执行中断事件

EXTI_ClearFlag(EXTI_Line3);//清零LINE上标志位 }

}

//========================================================

区别:EXTI_GetITStatus()会先判断该中断是否使能,若使能了再判断中断标志位,而EXTI_GetFlagStatus()直接判断中断标志位是否置位(马虎点)。所以说方式一的EXTI_GetITStatus()会好点,一般配合EXTI_ClearITPendingBit()使用。

PS:

建议参考以下代码;三个中断公用一个中断函数。

void EXTI9_5_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line5) != RESET)

{

}

else if (EXTI_GetITStatus(EXTI_Line6) != RESET)

{

}

else if (EXTI_GetITStatus(EXTI_Line7) != RESET)

{

}

EXTI_ClearITPendingBit(EXTI_Line5);

EXTI_ClearITPendingBit(EXTI_Line6);

EXTI_ClearITPendingBit(EXTI_Line7);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stm32 函数