1 STM32外部中断概述
stm32的中断控制器支持19个外部中断请求,其中线0~15对应外部IO口的输入中断。线16连接到PVD输出。线17连接到RTC闹钟事件。线18连接到USB唤醒事件。
每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。
stm32的IO中断线只有16个,但是STM32F10x系列的IO口多达上百个,那中断线怎么跟IO口对应呢?
这里就要用到映射的知识了,在STM32中,GPIOx.0映射到EXTI0线。(其中x=ABCDEFG口中的一个)
中断向量与中断服务函数
可惜在STM32中并不是16个中断线可以分配16个中断服务函数。
IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数
从表中可以知道,EXTI0(表有错误,实际有EXTI0)~EXTI4分别拥有五个中断服务函数。但到了EXTI9-5就只能将EXTI5~EXTI9共用一个中断服务函数了。EXTI15-10也是同理。
外部中断常用库函数
1. void GPIO_EXTILineConfig(uint8_t GPIO_PortSource,uint8_t GPIO_PinSource);
//设置IO口与中断线的映射关系。
2.void EXTI_init(EXTI_InitTypeDef* EXTI_InitStruct);
//初始化中断线;触发方式等。
3.ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
//判断中断线的中断状态,是否发生。
4.void EXTI_ClearITPendingBit(uint31_t EXTI_Line);
//清除中断线上的中断标志位。
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
外部中断一般配置步骤
1.初始化IO口为输入。
GPIO_Init();
2.开启IO口复用时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
3.设置IO口与中断线的映射关系。
void GPIO_EXTILineConfig();
4.初始化线上中断,设置触发条件等。
EXTI_Init();
5.配置中断分组(NVIC),并使能中断。
NVIC_Init();
6.编写中断服务函数。
EXTIx_IRQHandler();
7.清除中断标志位
EXTI_ClearITPendingBit();