省住房与城乡建设厅网站,WordPress微博客主题,个人永久免费自助建站,9块9 wordpressSTM32的每个IO都可以作为外部中断的中断输入口。
STM32F103的中断控制器支持19个外部中断/事件请求。每个中断设有状态为#xff0c;每个中断/事件都有独立的触发和屏蔽设置。
STM32F103的19个外部中断为#xff1a;
EXTI线0~15#xff1a;对应外部IO口的输入中断。
EXT…STM32的每个IO都可以作为外部中断的中断输入口。
STM32F103的中断控制器支持19个外部中断/事件请求。每个中断设有状态为每个中断/事件都有独立的触发和屏蔽设置。
STM32F103的19个外部中断为
EXTI线0~15对应外部IO口的输入中断。
EXTI线16连接到PVD输出。Programmable Votage Detector 可编程电压监测器。连到EXTI的电源电压检测PVD中断
EXTI线17连接到RTC闹钟事件。
EXTI线18连接到USB唤醒事件。 STM32供IO口使用的中断线只有16个而STM32的IO口远超16个。
所以STM32的GPIOx.0~GPIOX.15(xA,B,C,D,E,F,G)分别对应中断线0~15。
以线0为例对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。
从《STM32中文参考手册》里可以看到映像如下图 但是中断线每次只能连接到1个IO口上需要通过配置来指定中断线配置到哪个GPIO上。
在标准函数库中该配置函数为
/*** brief Selects the GPIO pin used as EXTI Line.* param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.* This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).* param GPIO_PinSource: specifies the EXTI line to be configured.* This parameter can be GPIO_PinSourcex where x can be (0..15).* retval None*/
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
配置示例
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);
GPIO_PinSource2即为EXTI2的线在库里定义命名为EXTI_Line2。
EXTI_Line2相关配置如下
EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line EXTI_Line2;
EXTI_InitStructure.EXTI_Mode EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd ENABLE;
EXTI_Init(EXTI_InitStructure);
接着需要配置中断的优先级
NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority 2;
NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;
NVIC_Init(NVIC_InitStructure);
配置结束后就要编写中断服务函数。
需要注意的是中断线0~4每个中断线各自对应一个中断服务函数
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
中断线5~9共用一个中断服务函数
EXPORT EXTI9_5_IRQHandler [WEAK]
中断线10~15共用一个中断服务函数
EXPORT EXTI15_10_IRQHandler [WEAK]
在中断服务函数里经常需要使用两个函数。
1、判断某个中断线上的中断是否发生即相关标志位是否置位
2、清除某个中断线上的中断标志位。
示例
void EXTI2_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line2) ! RESET){ ...EXTI_ClearITPendingBit(EXTI_Line2);}
}
除了EXTI_GetITStatus之外函数库还提供了EXTI_GetFlagStatus两者的区别是EXTI_GetITStatus会先判断这种中断是否使能使能了才去判断中断标志位而EXTI_GetFlagStatus直接用来判断状态标志位。