外部中断
2016-12-27 20:58
169 查看
STM32每个IO都可以作为外部中断输入.
中断控制器支持22个外部中断/事件请求:
EXTI线0~15:对应外部IO口的输入中断。
EXTI线16:连接到PVD输出。
EXTI线17:连接到RTC闹钟事件。
EXTI线18:连接到USB OTG FS唤醒事件。
EXTI线19:连接到以太网唤醒事件。
EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。
EXTI线21:连接到RTC入侵和时间戳事件。
EXTI线22:连接到RTC唤醒事件。
STM32F4供IO使用的中断线只有16个,但是STM32F4xx系列的IO口多达上百个,STM32F103ZGT6(112),那么中断线怎么跟IO口对应呢?
STM32设计GPIOx.0~GPIOX.15(x=A,B,C,D,E,F,G,H,I),选中GIOPA~I任意一个即可。
每个中断线,我们可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能。
IO口外部中断在中断向量表中只分配了7个中断向量,也就是
只能使用7个中断服务函数
外部中断线5~9分配一个中断向量,共用一个服务函数
外部中断线10~15分配一个中断向量,共用一个中断服务函数
外部中断的一般配置步骤:
①使能SYSCFG时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
② 初始化IO口为输入。
GPIO_Init();
③设置IO口与中断线的映射关系。
void SYSCFG_EXTILineConfig();
④初始化线上中断,设置触发条件等。
EXTI_Init();
⑤配置中断分组(NVIC),并使能中断。
NVIC_Init();
⑥ 编写中断服务函数。
EXTIx_IRQHandler();
⑦清除中断标志位
EXTI_ClearITPendingBit();
exti.c
exti.h
main.c
中断处理函数的编写根据需要在exti.c中实现。
中断控制器支持22个外部中断/事件请求:
EXTI线0~15:对应外部IO口的输入中断。
EXTI线16:连接到PVD输出。
EXTI线17:连接到RTC闹钟事件。
EXTI线18:连接到USB OTG FS唤醒事件。
EXTI线19:连接到以太网唤醒事件。
EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。
EXTI线21:连接到RTC入侵和时间戳事件。
EXTI线22:连接到RTC唤醒事件。
STM32F4供IO使用的中断线只有16个,但是STM32F4xx系列的IO口多达上百个,STM32F103ZGT6(112),那么中断线怎么跟IO口对应呢?
STM32设计GPIOx.0~GPIOX.15(x=A,B,C,D,E,F,G,H,I),选中GIOPA~I任意一个即可。
每个中断线,我们可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能。
IO口外部中断在中断向量表中只分配了7个中断向量,也就是
只能使用7个中断服务函数
外部中断线5~9分配一个中断向量,共用一个服务函数
外部中断线10~15分配一个中断向量,共用一个中断服务函数
外部中断的一般配置步骤:
①使能SYSCFG时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
② 初始化IO口为输入。
GPIO_Init();
③设置IO口与中断线的映射关系。
void SYSCFG_EXTILineConfig();
④初始化线上中断,设置触发条件等。
EXTI_Init();
⑤配置中断分组(NVIC),并使能中断。
NVIC_Init();
⑥ 编写中断服务函数。
EXTIx_IRQHandler();
⑦清除中断标志位
EXTI_ClearITPendingBit();
exti.c
#include "exti.h" #include "delay.h" #include "led.h" include "key.h" #include "beep.h" //外部中断服务程序 根据需要修改编写// //外部中断初始化程序 //初始化PE2~4,PA0为中断输入. void EXTIX_Init(void) { NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; KEY_Init(); //按键对应的IO口初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟 //IO口与中断线的映射关系 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);//PE2 连接到中断线2 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);//PE3 连接到中断线3 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);//PE4 连接到中断线4 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PA0 连接到中断线0 //初始化线上中断,设置触发条件等 /* 配置EXTI_Line0 */ EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0 EXTI_Init(&EXTI_InitStructure);//配置 /* 配置EXTI_Line2,3,4 */ EXTI_InitStructure.EXTI_Line = EXTI_Line2 EXTI_Line3 | EXTI_Line4; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能 EXTI_Init(&EXTI_InitStructure);//配置 //配置中断分组(NVIC),并使能中断 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 NVIC_Init(&NVIC_InitStructure);//配置 NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//外部中断2 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 NVIC_Init(&NVIC_InitStructure);//配置 NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//外部中断3 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 NVIC_Init(&NVIC_InitStructure);//配置 NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//外部中断4 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 NVIC_Init(&NVIC_InitStructure);//配置 }
exti.h
#ifndef __EXTI_H #define __EXIT_H #include "sys.h" void EXTIX_Init(void); //外部中断初始化 #endif
main.c
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "beep.h" #include "key.h" #include "exti.h" int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168); //初始化延时函数 uart_init(115200); //串口初始化 LED_Init(); //初始化LED端口 BEEP_Init(); //初始化蜂鸣器端口 EXTIX_Init(); //初始化外部中断输入 LED0=0; //先点亮红灯 while(1) { printf("OK\r\n"); //打印OK提示程序运行 delay_ms(1000); //每隔1s打印一次 } }
中断处理函数的编写根据需要在exti.c中实现。
相关文章推荐
- 用龙芯1c库在裸机编程中实现外部中断(GPIO中断、按键中断)
- STM32之外部中断控制
- STM32 EXTI外部中断
- STM32单片机学习(2) 外部中断
- Linux如何及时响应外部中断
- CCS Simultator模拟外部中断
- LPC21xx系列 外部中断寄存器EXTINT…
- STM32F10X系列GPIO外部中断
- STM32之EXTI——外部中断
- lpc23xx时钟和外部中断学习
- stm32NVIC与外部中断
- s3c2440外部中断
- AVR的INT外部中断和PCINT中断之区…
- 外部中断0
- 字符设备驱动--外部中断
- STM32F030 IO口外部中断应用
- 嵌入式(七)外部中断-EXTI
- 外部中断
- STM32CubeMX学习教程之二:GPIO输入之外部中断
- STM32_外部中断