您的位置:首页 > 大数据 > 物联网

寒假学习之STM32(6)---- 外部中断

2017-01-27 17:09 127 查看

外部中断

概述

外部中断是针对端口引脚输入的电平进行相应的响应而存在的,响应速度快是外部中断的一个特点。(貌似和定时器比起来,作用要稍稍弱一点,嘻嘻(●’◡’●))

STM32外部中断的特点

1. 每一个IO口均可以作为外部中断的输入

2. STM32中断控制器支持19个外部中断,分别为:

0~15: IO的输入中断(这一次讲解的对象)
16: PVD输出
17: RTC闹钟
18: USB唤醒


中断线与IO的对应关系

不同GPIO的同一个Pin口为一个外部中断线



虽然每个Pin脚对应了每一个中断线,但是STM32上将5~9,10~15中断线进行了合并,所以,真正的中断服务函数就只有七个,原型大概如下:

//  这些函数的内容终由我们进行填补,输入相应的相应动作

void EXTI0_IRQHandler(void);
void EXTI1_IRQHandler(void);
void EXTI2_IRQHandler(void);
void EXTI3_IRQHandler(void);
void EXTI4_IRQHandler(void);
void EXTI9_5_IRQHandler(void);//注意5~9写法
void EXTI15_10_IRQHandler(void);//注意15~10写法

/*
外部中断需要我们手动清除中断标志位,于是,在每个中断服务函数的末尾,我们需要加上
EXTI_ClearITPendingBit() 入口参数为EXTI_Linex,x取值为0~15
*/


配置一个外部中断所需要的步骤

1.  时钟使能 (复用)  : RCC_APB2PeriphClockCmd()
2.  GPIO初始化      : GPIO_Init()
3.  映射关系        : GPIO_EXTILineConfig()
4.  初始化线上中断   : EXTI_Init()
5.  初始化中断分组   : NVIC_PriorityGroupConfig()
NVIC_Init()
6.  中断服务函数      : EXTIx_IRQHandler()
7.  清除中断标志位     : EXTI_ClearITPendingBit()
(在中断服务函数内)


时钟使能 (复用)



GPIO初始化、映射关系



初始化线上中断



初始化中断分组



中断服务函数&&清除中断标志位



完整配置过程

void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

//初始化 WK_UP-->GPIOA.0     下拉输入
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

// PE.2
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);

//PE.3
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line=EXTI_Line3;
EXTI_Init(&EXTI_InitStructure);

//PE.4
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_Init(&EXTI_InitStructure);

//PA.0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);

/********************************************************************/

NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);

}

//例程中加入了去抖的过程<
4000
/span>

void EXTI0_Handler(void)
{
delay_ms(10);
if(WK_UP==1)
{
BEEP=!BEEP;
delay_ms(1000);
}
EXTI_ClearITPendingBit(EXTI_Line0);

}

void EXTI2_IRQHandler(void)
{
delay_ms(10);
if(KEY2==0)
{
LED0=!LED0;
}
EXTI_ClearITPendingBit(EXTI_Line2);

}

void EXTI3_IRQHandler(void)
{
delay_ms(10);
if(KEY1==0)
{
LED1=!LED1;
}
EXTI_ClearITPendingBit(EXTI_Line3);

}

void EXTI4_IRQHandler(void)
{

delay_ms(10);
if(KEY0==0)
{
LED0=!LED0;
LED1=!LED1;
BEEP=!BEEP;
}

EXTI_ClearITPendingBit(EXTI_Line4);

}

int main(void)
{

delay_init();            //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200);   //串口初始化为115200
LED_Init();             //初始化与LED连接的硬件接口
BEEP_Init();            //初始化蜂鸣器端口
KEY_Init();             //初始化与按键连接的硬件接口
EXTIX_Init();           //外部中断初始化
LED0=0;                 //点亮LED0
while(1)
{
printf("OK\r\n");
delay_ms(1000);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息