STM32学习之外部中断
2016-12-15 23:26
225 查看
STM32之中断的使用(EXTI NVIC)
外部中断/事件控制器由19 个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独立的屏蔽。挂起寄存器保持着状态线的中断要求。NVIC驱动有多种用途:例如使能或者失能IRQ中断,
使能或者失能单独的IRQ通道,改变IRQ通道的优先级等等。
EXTI结构体
typedef struct { uint32_t EXTI_Line; // 中断/事件线 EXTIMode_TypeDef EXTI_Mode; // EXTI 模式 EXTITrigger_TypeDef EXTI_Trigger; // 触发类型 FunctionalState EXTI_LineCmd; // EXTI 使能 } EXTI_InitTypeDef;
NVIC结构体
typedef struct { uint8_t NVIC_IRQChannel; // 中断源 uint8_t NVIC_IRQChannelPreemptionPriority; // 抢占优先级 uint8_t NVIC_IRQChannelSubPriority; // 子优先级 FunctionalState NVIC_IRQChannelCmd; // 中断使能或者失能 } NVIC_InitTypeDef;
中断/事件线
EXTI 有20 个中断/事件线,每个GPIO都可以被设置为输入线,占用EXTI0 至EXTI15,还有另外七根用于特定的外设事件
中断/事件线 输入源
EXTI0 PX0(X 可为A,B,C,D,E,F,G,H,I)
EXTI1 PX1(X 可为A,B,C,D,E,F,G,H,I)
EXTI2 PX2(X 可为A,B,C,D,E,F,G,H,I)
EXTI3 PX3(X 可为A,B,C,D,E,F,G,H,I)
EXTI4 PX4(X 可为A,B,C,D,E,F,G,H,I)
EXTI5 PX5(X 可为A,B,C,D,E,F,G,H,I)
EXTI6 PX6(X 可为A,B,C,D,E,F,G,H,I)
EXTI7 PX7(X 可为A,B,C,D,E,F,G,H,I)
EXTI8 PX8(X 可为A,B,C,D,E,F,G,H,I)
EXTI9 PX9(X 可为A,B,C,D,E,F,G,H,I)
EXTI10 PX10(X 可为A,B,C,D,E,F,G,H,I)
EXTI11 PX11(X 可为A,B,C,D,E,F,G,H,I)
EXTI12 PX12(X 可为A,B,C,D,E,F,G,H,I)
EXTI13 PX13(X 可为A,B,C,D,E,F,G,H,I)
EXTI14 PX14(X 可为A,B,C,D,E,F,G,H,I)
EXTI15 PX15(X 可为A,B,C,D,E,F,G,H,I)
EXTI16 PVD 输出
EXTI17 RTC 闹钟事件
EXTI18 USB 唤醒事件
EXTI19 以太网唤醒事件(只适用互联型)
EXTI0 至EXTI15 用于GPIO,通过编程控制可以实现任意一个GPIO为EXTI 的输入
源。
代码过程:
extern "C" void EXTI0_IRQHandler(); //设置中断函数 #define INT_GPIO GPIOA //中断端口 #define INT_PIN GPIO_Pin_0 //端口引脚 #define INT_GPIO_RCC RCC_APB2Periph_GPIOA //端口时钟 #define INT_GPIO_AFIO RCC_APB2Periph_AFIO //复用AFIO #define INT_NIVC_IRQCHANNEL EXTI0_IRQn //中断引脚所在线路 #define INT_EXIT_LINE EXTI_Line0 //中断线路 #define INT_EXTI_GPIOSOURCE GPIO_PortSourceGPIOA //选择用作外部中断线源的GPIO端口 #define INT_EXTI_PINSOURCE GPIO_PinSource0 //待设置的外部中断线路引脚 #define INTHandle EXTI0_IRQHandler // NVIC_InitTypeDef NVIC_InitStructure; //中断控制器 EXTI_InitTypeDef EXTI_InitStructure; //外部中断事件 GPIO_InitTypeDef GPIO_InitStructure; //引脚 void GPIOint::GPIOIntInit() { RCC_APB2PeriphClockCmd(INT_GPIO_AFIO | INT_GPIO_RCC, ENABLE); //使能引脚时钟和复用时钟 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //配置优先级为组1 NVIC_InitStructure.NVIC_IRQChannel = INT_NIVC_IRQCHANNEL; //选择GPIO所在引脚线路中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //主优先级1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断 NVIC_Init(&NVIC_InitStructure); //初始化中断控制器 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_InitStructure.GPIO_Pin = INT_PIN; GPIO_Init(INT_GPIO, &GPIO_InitStructure); //初始化GPIO GPIO_EXTILineConfig(INT_EXTI_GPIOSOURCE, INT_EXTI_PINSOURCE); //选择GPIO管脚用作外部中断线路 EXTI_InitStructure.EXTI_Line = INT_EXIT_LINE; //设置外部中断线路 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置为中断 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能 EXTI_Init(&EXTI_InitStructure); //初始化 } void INTHandle() { if (EXTI_GetFlagStatus(INT_EXIT_LINE)==SET) //确保产生中断 { GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET); //亮led EXTI_ClearFlag(INT_EXIT_LINE); //清楚中断线路标志 } }
相关文章推荐
- 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学习笔记——外部中断的使用