之前看了网上有关外部中止的运用介绍,觉得很简单,现在想想有那种主意真是浮躁,不要做浮躁的嵌入式工程师,要兢兢业业。今日把外部中止试验做了一下,不做不知道,一作便是没做出来,网上参阅他人的程序和有关材料仍是没做出来,最后到群里问了问,被一个叫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);
}
}