微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32学习之外部中断

STM32学习之外部中断

时间:12-02 来源:互联网 点击:
之前看了网上有关外部中断的使用介绍,觉得很简单,现在想想有那种想法真是浮躁,不要做浮躁的嵌入式工程师,要脚踏实地。今天把外部中断实验做了一下,不做不知道,一作就是没做出来,网上参考别人的程序和有关资料还是没做出来,最后到群里问了问,被一个叫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);

}

}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top