STM32的中断控制器支持19个外部中断/事件请求,每个IO都可以作为外部中断输入,其中:
线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。
每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。
STM32供IO使用的中断线只有16个,但是STM32F10x系列的IO口多达上百个,STM32F103ZET6(112),STM32F103RCT6(51),其对应关系如下:
GPIOx.0映射到EXTI0
GPIOx.1映射到EXTI1
…
GPIOx.15映射到EXTI15
如图所示:
IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数
外部中断线5~9分配一个中断向量,共用一个服务函数
外部中断线10~15分配一个中断向量,共用一个中断服务函数
分别是:
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
结合程序说明设置外部中断的一般过程:
(1)使能复用功能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
(2)根据中断使用外设进行gpio端口初始化,以按键为例,代码以及硬件图如下
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能PORTE时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//KEY0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4
硬件连接如下:
(3)设置IO口与中断线的映射关系
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
(4)进行中断初始化
EXTI_InitTypeDef itt;
itt.EXTI_Line=EXTI_Line4 ;
itt.EXTI_LineCmd=ENABLE;
itt.EXTI_Mode=EXTI_Mode_Interrupt;
itt.EXTI_Trigger=EXTI_Trigger_Falling;//设置触发方式为下降沿触发
EXTI_Init(&itt);
(5)设置中断分组并设置中断优先级,中断分组一般在主函数中设置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断分组
NVIC_InitTypeDef nv;
nv.NVIC_IRQChannel=EXTI4_IRQn;
nv.NVIC_IRQChannelCmd=ENABLE;
nv.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级为2
nv.NVIC_IRQChannelSubPriority=2;//响应优先级为2
NVIC_Init(&nv);
(6)编写中断函数
void EXTI4_IRQHandler(void)
{
delay_ms(10);//按键防抖专用
if(KEY0==0)
{
XXXXXXX//需要执行的任务
}
EXTI_ClearITPendingBit(EXTI_Line4);//清除中断标志位
}