×
嵌入式 > 嵌入式开发 > 详情

STM32学习之外部中断

发布时间:2020-08-17 发布时间:
|
之前看了网上有关外部中断的使用介绍,觉得很简单,现在想想有那种想法真是浮躁,不要做浮躁的嵌入式工程师,要脚踏实地。今天把外部中断实验做了一下,不做不知道,一作就是没做出来,网上参考别人的程序和有关资料还是没做出来,最后到群里问了问,被一个叫STM32的网友发现了我的问题,改过来之后程序按照自己的想法执行。
下面介绍一下今天的使用总结:
STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。
上面这一段话把外部中断介绍的很详细。要注意的是红字部分,今天我使用的外部中断管脚是PB.7 PB.8 PB.9 这几个管脚正好对应在一个中断响应函数里EXTI5-9。
//选择中断管脚PB.7 PB.8 PB.8
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
EXTI_InitStructure.EXTI_Line = EXTI_Line7 | EXTI_Line8 | EXTI_Line9; //选择中断线路7 8 9
在这里我出错了EXTI_InitStructure.EXTI_Line 选中的中断管脚要和GPIO_EXTILineConfig 选中的管脚保持一致 也就是上面说的
我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源这句话。
源代码如下
/*
********************************************************************************
** 函数名称 : void EXTI_Configuration(void))
** 函数功能 : 外部中断初始化
** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //复用时钟
//清空中断标志
EXTI_ClearITPendingBit(EXTI_Line2);
EXTI_ClearITPendingBit(EXTI_Line3);
EXTI_ClearITPendingBit(EXTI_Line5);
//选择中断管脚PB.7 PB.8 PB.8
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
EXTI_InitStructure.EXTI_Line = EXTI_Line7 | EXTI_Line8 | EXTI_Line9; //选择中断线路7 8 9
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置为中断请求,非事件请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设置中断触发方式为下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //外部中断使能
EXTI_Init(&EXTI_InitStructure);
}
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line7) != RESET)
{
//添加中断处理程序
//点亮LED
PC1_H;
PC3_H;
PC13_L;
EXTI_ClearFlag(EXTI_Line7);
EXTI_ClearITPendingBit(EXTI_Line7);
}
if(EXTI_GetITStatus(EXTI_Line8) != RESET)
{
//添加中断处理程序
//点亮LED灯
PC1_H;
PC3_L;
PC13_H;
EXTI_ClearFlag(EXTI_Line8);
EXTI_ClearITPendingBit(EXTI_Line8);
}
if(EXTI_GetITStatus(EXTI_Line9) != RESET)
{
//添加中断处理程序
//点亮LED灯
PC1_L;
PC3_H;
PC13_H;
EXTI_ClearFlag(EXTI_Line9);
EXTI_ClearITPendingBit(EXTI_Line9);
}
}



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

热门文章 更多
单片机汇编语言 如何实现点亮熄灭二极管