欢迎来到天天文库
浏览记录
ID:38223050
大小:147.50 KB
页数:3页
时间:2019-05-28
《STM32之外部中断EXTI》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、STM32之外部中断EXTISTM32中断控制线支持19个外部中断/事件请求,每个中断都有对应状态位和独立的触发与屏蔽设置。STM32F103的19个外部中断为:线0-15:对应GPIO口的输入中断。线16:连接到PVD输出(掉电检测,掉电时可立即保存重要数据作用)。线17:连接RTC闹钟事件。线18:连接到USB唤醒事件。每个IO口都可作为外部中断输入口的STM32的IO口远多于16个,而IO口使用的中断线只有16个。为此,GPIO管脚GPIOx.0~GPIOx.15(X=A,F,G)分别对应中断线0-15.这样每个中断线对应了7个IO口。如线
2、0对应着GPIOA.0,GPIOB.0,GPIOC.0,GPIOD.0,GPIOE.0,GPIOF.0,GPIOG.0但是每个中断线每次只能连接到1个IO口上。这样就需要通过相关的配置来决定对应的中断线被配置到哪个GPIO上了。GPIO和中断线的映射关系如下图:GPIO与中断映射配置通过函数来实现voidGPIO_EXTILineConfig(uint8_t GPIO_PortSource,uint8_t GPIO_PinSource )例如:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSou
3、rce2);即外部中断线2就和GPIOE映射起来了,显然是GPIOE.2与EXTI2中断线连接起来了。接着需设置中断触发方式:voidEXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)例如:EXTI_InitTypeDefEXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line4;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_T
4、rigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);以上例子设置了中断线line4的中断为下降沿触发。设置好了中断线和GPIO的映射关系,然后又设置好了中断的触发模式等参数。既然是外部中断,设计到中断我们当然需要设置NVCI的中断优先级。配置完中断优先级后,接着是编写中断服务函数。中断服务函数名字在MDK中事先有定义。但是不得不提的是,STM32的IO口外部中断只有6个,分别是:EXPORTEXT0_IRQHandleEXPORT
5、-----------------------中断线0对应的中断函数EXT1_IRQHandleEXPORT-----------------------中断线1对应的中断函数EXT2_IRQHandleEXPORT-----------------------中断线2对应的中断函数EXT3_IRQHandleEXPORT-----------------------中断线3对应的中断函数EXT4_IRQHandleEXPORT-----------------------中断线4对应的中断函数EXT9_5_IRQHandleEXPORT----
6、--------------------中断线5-9对应的中断函数EXT15_10_IRQHandle--------------------------------中断线10-15共用的中断函数编写中断服务函数经常需要使用两个函数。第一个是判断某个中断线上的中断是否发生(即标志位是否置位):ITStatusEXTI_GetITStatus(uint32_tEXTI_line);//放在中断服务函数开头,监测中断标志位第二个是清除某个中断线上的中断标志位(即清除标志位):voidEXTI_ClearITPendingBit(uint32_tEXT
7、I_Line);//放在函数的结尾常用外部中断服务函数的格式://格式一voidEXTI3_IRQHandler(void){If(EXTI_GetITStatus(EXTI_Line3)!-=RESET)//判断是否置位{Dosomething();//执行中断事件EXTI_ClearITPendingBit(EXTI_Line3);//清零LINE上标志位}}//========================================================//格式二voidEXTI3_IRQHandler(void){If(
8、EXTI_GetFlagStatus(EXTI_Line3)!-=RESET)//判断是否置位{Dosomething();//执行中断
此文档下载收益归作者所有