STM32外部中断(EXTI)分析和应用

学过51单片机的外部中断的话入门会很快;
本篇博文基于STM32F103ZET6芯片,与大多数STM32F10x芯片兼容;
代码基于ST官网提供的3.5.0标准库
如有不足之处,还望前辈多多指教;

一些需要了解的基础知识

  1. STM32每个GPIO口都可以作为外部中断输入口使用
  2. 每个中断都设有状态位
  3. 每个中断/事件都有独立的触发和屏蔽设置。
  4. STM32103有19个外部中断(但是供GPIO口使用的中断只有16个)
    分别是:
    0~15:对应外部中断IO的输入中断
    16 : 连接到PVD输出
    17 :连接到RTC闹钟时间
    18 :连接到USB唤醒事件

这里会容易出现一个问题说:STM32F103ZET6的GPIO管脚一共有6*16即96个GPIO管脚,如何对应只有0~15共16个的外部中断机制;请看下图:
这里写图片描述
图片反映GPIO管脚和外部中断的对应关系

通过上面的图能看出来每个管脚所对应的外部中断线,但是我们在应用的时候不会将所有的GPIO管脚都去配置,所以这时候就需要我们去通过调用库函数去人为的去配置寄存器;下面说程序配置的过程

编写程序的步骤

  1. 初始化GPIO口为输入;
  2. 开启GPIO口复用时钟,设置GPIO口与中断线的映射关系;
  3. 初始化线上中断,设置触发条件等;
  4. 配置中断分组(NVIC),并使能中断;
  5. 编写中断服务函数

编程步骤的实现以及对应库函数的讲解
本例程将实现一个按键的按下触发对应的GPIO口的外部中断,中断函数内部实现一个对LED灯的控制;

  1. 初始化GPIO口为输入
 	GPIO_InitTypeDef GPIO_InitStructure;   
 	
//PE.2的外部电路是外部下拉,配置管脚的时候将它设置为上拉输入                   
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);              //使能GPIOE时钟
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_x;                        //确定要操作的管脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_x;                     //设置此管脚为输入      
 	GPIO_Init(GPIOx, &GPIO_InitStructure);                            //初始化GPIOE2

2.开启GPIO口复用时钟,设置GPIO口与中断线的映射关系

   void GPIO_EXTILineConfig(GPIO_PortSourcex , GPIO_PinSourcex);     //开启对应管脚和外部中断线的连接

例:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE , GPIO_PinSource2); //中断线2与GPIOE连接,即与EXTI2中断线连接;

  1. 初始化线上中断,设置触发条件等;
	EXTI_InitTypeDef EXTI_InitStructure;

  	EXTI_InitStructure.EXTI_Line=EXTI_Linex;	                 //配置中断线标号;范围从EXTI_Line0 ~ EXTI_Line15;
  	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	         //设置模式为中断模式; 可选EXTI_Trigger_interrupt和EXTI_Trigger_Event;
  	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;      //设置触发方式为下降沿;可选下降沿触发:EXTI_Trigger_Falling;上升沿触发:				   	EXTI_Trigger_Rising;上升沿和下降沿都触发:EXTI_Rising_Falling;
  	EXTI_InitStructure.EXTI_LineCmd = ENABLE;                    //使能此中断线
  	EXTI_Init(&EXTI_InitStructure);	 	//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  1. 配置中断分组(NVIC),并使能中断;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //这里只是举个例子分组模式为NVIC_PriorityGroup_2,即抢占优先级为0~3,响应优先级为0~3;
 	NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTIx_IRQn;			       //使能按键KEY2所在的外部中断通道
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	   //抢占优先级2, 
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;			   //子优先级2
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;					   //使能外部中断通道
  	NVIC_Init(&NVIC_InitStructure);
  1. 编写中断服务函数
    STM32的GPIO口外部中断函数只有6个,分别是:
    EXPORT EXT0_IRQHandler
    EXPORT EXT1_IRQHandler
    EXPORT EXT2_IRQHandler
    EXPORT EXT3_IRQHandler
    EXPORT EXT4_IRQHandler
    EXPORT EXT9_5_IRQHandler
    EXPORT EXT15_10_IRQHandler
    这里需要解释:
  2. 中断线0~4每个中断线对应一个中断函数
    举个例子:PA0,PB0,PC0,PD0,PE0,PF0 共用 void EXT0_IRQHandler(void)中断函数;
    PA1,PB1,PC1,PD1,PE1,PF1 共用 void EXTI1_IRQHandler(void)中断函数;
    ……
    ……
    PA4,PB4,PC4,PD4,PE4,PF4 共用 void EXTI4_IRQHandler(void)中断函数;
  3. 中断线5~9共用一个中断函数:EXTI_9_5_IRQHandler
    PA5,PA6,PA7,PA8,PA9
    PB5,PB6,PB7,PB8,PB9
    PC5,PC6,PC7,PC8,PC9
    PD5,PD6,PD7,PD8,PD9
    PE5,PE6,PE7,PE8,PE9
  4. 中断线10~15共用中断函数EXTI15_10_IRQHandler
    PA10,PA11,PA12,PA13,PA14,PA15
    PB10,PB11,PB12,PB13,PB14,PB15
    PC10,PC11,PC12,PC13,PC14,PC15
    PD10,PD11,PD12,PD13,PD14,PD15
    PE10,PE11,PE12,PE13,PE14,PE15

判断中断线上中断是否发生的函数(中断标志位是否置位)

ITStatus EXTI_GetITStatis(uint32_t EXTI_Line);      //一般放在中断程序的开头检查所检查的中断线是否发生中断

清除中断标志位函数(这个有点像C51单片机里边的IT还是TI忘记了,反正就是中断标志位)

void EXTI_ClearITPendingBit(uint32_t  EXTI_Line);

应用中的中断服务函数格式:

void EXTIx_IRQHandler(void)
{
	if(!(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin_x)))  //判断按键是否被按下
	{
		中断逻辑……
		
	}
	EXTI_ClearITPendingBit(EXTI_Linex);   //清除Line上的中断标志位
}

有关寄存器
中断屏蔽寄存器EXTI_IMR
事件屏蔽寄存器EXTI_EMR
上升沿触发选择寄存器EXTI_RTSR
下降沿触发选择寄存器EXTI_FTSR
软件中断时间寄存器EXTI_SWIER
挂起寄存器EXTI_PR

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值