stm32学习笔记(四)外部中断
来源:互联网 发布:gta5捏脸数据女韩国 编辑:程序博客网 时间:2024/05/18 01:50
#include "exti.h"#include "led.h"#include "key.h"#include "delay.h"#include "usart.h"////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途//Mini STM32开发板//外部中断 驱动代码 //正点原子@ALIENTEK//技术论坛:www.openedv.com//修改日期:2010/12/01 //版本:V1.0//版权所有,盗版必究。//Copyright(C) 正点原子 2009-2019//All rights reserved ////////////////////////////////////////////////////////////////////////////////// //外部中断初始化函数void EXTIX_Init(void){ EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟 KEY_Init();//初始化按键对应io模式 //GPIOC.5 中断线以及中断初始化配置 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5); EXTI_InitStructure.EXTI_Line=EXTI_Line5; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 //GPIOA.15 中断线以及中断初始化配置 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15); EXTI_InitStructure.EXTI_Line=EXTI_Line15; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 //GPIOA.0 中断线以及中断初始化配置 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); EXTI_InitStructure.EXTI_Line=EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//使能按键所在的外部中断通道0-4有单独的中断服务函数 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//使能按键所在的外部中断通道 5-9共用一个中断服务函数 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;//子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//使能按键所在的外部中断通道 9-15共用一个中断服务函数 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 NVIC_Init(&NVIC_InitStructure); } void EXTI0_IRQHandler(void){ delay_ms(10); //消抖if(WK_UP==1){ LED0=!LED0;LED1=!LED1;}EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0线路挂起位} void EXTI9_5_IRQHandler(void){delay_ms(10); //消抖 if(KEY0==0){LED0=!LED0;} EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE5上的中断标志位 }void EXTI15_10_IRQHandler(void){ delay_ms(10); //消抖 if(KEY1==0){LED1=!LED1;} EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE15线路挂起位}
STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。
中断配置
EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟 KEY_Init();//初始化按键对应io模式 //GPIOC.5 中断线以及中断初始化配置 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5); EXTI_InitStructure.EXTI_Line=EXTI_Line5; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
S TM32中断控制器支持20个外部中断/事件请求: 线0-15:外部IO口输入中断
线16:连接到PVD输出
线17:连接到RTC闹钟事件
线18:连接到USB唤醒事件
线19:Ethernet Wakeup event
中断模式 typedef enum
{
EXTI_Mode_Interrupt = 0x00,
EXTI_Mode_Event = 0x04
}EXTIMode_TypeDef;
中断触发类型
typedef enum
{
EXTI_Trigger_Rising = 0x08,
EXTI_Trigger_Falling = 0x0C,
EXTI_Trigger_Rising_Falling = 0x10
}EXTITrigger_TypeDef;
中断优先级配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//使能按键所在的外部中断通道0-4有单独的中断服务函数 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
中断服务函数
EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。
抢占优先级和响应优先级
STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,
其属性编号越小,表明它的优先级别越高。
当两个中断同时到来,先响应抢占优先级搞得中断。
当两个中断抢占优先级一样,先进入响应优先级高的中断。
EXTI_ClearITPendingBit(EXTI_Line5)
中断函数响应完中断之后,要清除中断线路挂起位
http://www.openedv.com/posts/list/43201.htm
阅读全文
0 0
- stm32学习笔记(四)外部中断
- STM32-外部中断学习笔记
- STM32-外部中断学习笔记
- STM32-外部中断学习笔记
- STM32学习笔记(2):外部中断的使用
- STM32学习笔记(2):外部中断的使用
- STM32学习笔记(2):外部中断的使用
- STM32学习笔记(2):外部中断的使用
- STM32学习笔记之EXTI(外部中断)
- stm32学习笔记——按键(外部中断)
- STM32学习笔记(2):外部中断的使用
- STM32学习笔记(2):外部中断的使用
- STM32学习笔记:外部中断的使用
- STM32学习笔记:外部中断的使用
- STM32 F103 外部中断学习笔记
- STM32学习笔记:外部中断的使用
- STM32学习笔记:外部中断的使用
- STM32学习笔记之外部中断实验
- Codeforces839A Arya and Bran
- HDU6118(费用流水题)
- [转载] Android JNI编程—JNI基础
- Linux设备驱动之plat_led驱动测试
- uva1606
- stm32学习笔记(四)外部中断
- SSL P1861 提高组 无限序列
- 高质量C/C++编程
- 树莓派/继电器DIY朴素的远程空调遥控器
- 深入正则表达式API
- 51nod 1534 棋子游戏(简单博弈)
- 《J2EE之认知》
- spring常用注解总结
- 迁移用户数据到独立分区