寒假学习之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); } }
相关文章推荐
- STM32学习笔记:外部中断EXTI的使用
- STM32学习笔记之EXTI(外部中断)
- STM32:STM32学习记录5: 外部中断
- STM32学习--外部中断
- STM32学习笔记之外部中断实验
- STM32学习笔记:外部中断的使用
- stm32 外部中断学习
- STM32学习笔记:外部中断的使用
- STM32学习笔记整理之(2)——外部中断
- stm32学习笔记:GPIO外部中断的使用
- STM32学习之路-外部中断(2)
- cortex_m3_stm32嵌入式学习笔记(四):外部中断实验
- STM32单片机学习(12) 红外信号接收解码(外部中断)
- stm32中断学习篇(2)——以外部中断为例与多个中断的使用
- STM32-外部中断学习笔记
- STM32学习之路-按键中断测试(外部中断)
- stm32学习笔记——按键(外部中断)
- STM32-外部中断学习笔记
- STM32-外部中断学习笔记
- stm32学习笔记——外部中断的使用