STM32学习笔记-基础外设-EXTI

STM32学习笔记-基础外设-EXTI

说明:这个文章综合了截至发布之前所有的博客,用于自己学习记录,顺便分享出来。谢谢!!









一、先贴代码

/*配置中断分组NVIC并使用中断*/
void NVIC_EXIT_cfg()
{
    NVIC_InitTypeDef NVIC_InitStructure;
     
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
     
	/*EXTI2_IRQn;EXTI9_5_IRn; EXTI15_10_IRQn;*/
	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);
}
/*GPIO初始化*/
void GPIO_EXIT_cfg()
{
	//使能GPIO和AFIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //设置引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
    /*浮空输入(GPIO_Mode_IN_FLOATING)上拉输入(GPIO_Mode_IPU)下拉输入(GPIO_Mode_IPD)*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置空为输入模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
    GPIO_Init(GPIOC,&GPIO_InitStructure);                       
}
/*初始化线上中断,设置触发条件等*/
void EXTI_cfg()
{
    EXTI_InitTypeDef EXTI_InitStructure;

    EXTI_ClearITPendingBit(EXTI_Line2);
    EXTI_ClearITPendingBit(EXTI_Line5);
    //将指定的引脚连接到外部中断线上
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);

    EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line5;//启动第2、5中断线
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式:中断模式
   /* EXTI_Trigger_Rising上升沿触发EXTI_Trigger_Falling下降沿触发EXTI_Trigger_Rising_Falling上升沿和下降沿都可以触发*/
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //触发方式:上升沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
}
/*EXTI2中断处理函数*/
void EXTI2_IRQHandler(void)
{
    //添加中断处理
    EXTI_ClearITPendingBit(EXTI_Line2);
}
/*EXTI9_5中断处理函数*/
void EXTI9_5_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line5) == 1)
    {
	    //添加中断处理
        EXTI_ClearITPendingBit(EXTI_Line5);
    }
}





二、中断配置步骤

STM32的每个IO口都可以作为中断输入,但是每个中断线上同一时间只能有一个外部中断。要把IO口作为外部中断输入,有以下几个步骤:

1)初始化IO口为输入。

  这一步设置你要作为外部中断输入的IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。

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

  STM32的IO口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO口与中断线的对应关系。才能把外部中断与中断线连接起来。

3)开启与该IO口相对的线上中断/事件,设置触发条件。

  这一步,我们要配置中断产生的条件,STM32可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。

4)配置中断分组NVIC,并使能中断。

  这一步,我们就是配置中断的分组,以及使能,对STM32的中断来说,只有配置了NVIC的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。关于NVIC的详细介绍,请参考前面章节。

5)编写中断服务函数。

  这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃!所以在开启了某个中断后,一定要记得为该中断编写服务函数。在中断服务函数里面编写你要执行的中断后的操作。



三、中断线、中断函数对照表

1、中断处理函数分配表

在这里插入图片描述
  中断处理函数是当我们配置的中断引脚产生中断后会将中断信号线的中断线标志寄存器的标志位置为1,如中断信号EXTI5产生中断后我们可以使用函数ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)获取指定中断线的标志位是否为1,因此在使用部分中断线是共用一个中断处理函数的,可以在函数中判断中断信号线的标志位是否被置为1了;注意:每次中断处理完以后需要使用函数void EXTI_ClearITPendingBit(uint32_t EXTI_Line)把中断的标志位清除,否则会一直重复地进入中断处理函数。

2、中断线与GPIO关系

在这里插入图片描述




四、为什么配置中断功能时要在APB2中使能AFIO相关功能?

与AFIO 相关的寄存器:
  事件控制寄存器(AFIO_EVCR)
  复用重映射和调试I/O 配置寄存器(AFIO_MAPR)
  外部中断配置寄存器1(AFIO_EXTICR1)
  外部中断配置寄存器2(AFIO_EXTICR2)
  外部中断配置寄存器3(AFIO_EXTICR3)
  外部中断配置寄存器4(AFIO_EXTICR4)

注意:AFIO本意是“Alternate Function IO(多功能IO口)”,不仅仅针对于端口重映射。只要是对对寄存器 AFIO_EVCR、AFIO_MAPR 和 AFIO_EXTICRX 进行读写操作前,就要打开 AFIO 的时钟,而不仅仅是重映射的时候才打开!!!
在这里插入图片描述




五、外部中断BUG总结

STM32 学习笔记 – EXIT外部中断 按键的误触发问题.

stm32外部中断进入不了的原因分析.

STM32在中断里使用SysTick_delay延时引起的一些异常死机bug分析及其解决方案.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值