关于STM32F407一次事件触发两次中断

这篇博客详细记录了作者在使用STM32F407单片机时遇到的一个问题,即按键事件导致了单片机触发两次中断。经过分析,作者发现是由于中断请求标志位未在中断服务程序结束前清零导致。通过调整代码,将清除中断标志位的语句提前,解决了这个问题。文章还提供了测试和解决方案的代码示例。

关于STM32F407一次事件触发两次中断

问题描述

之前一直有想写博客的想法,因没有契机而迟迟没有行动起来,但这次本人在给自己做的F4小板子做测试时遇到一个奇葩的bug耽误了我好几个小时,我之所以称之为“奇葩的bug”,是因为一次按键事件竟然触发了单片机两次中断。

一、bug的提出

别急!问题一出来我知道你肯定很多想法,比方按键事件没有做好消抖处理,或者中断请求标志位没有被及时清零等。顺便说下,对于STM32芯片而言,如果中断请求标志没有被清零程序会卡死在中断服务程序里。诸如以上的疑点,我拿出以下几点实际情况来做解释。

  1. 按键有硬件消抖,并联了一个0.1uf的电容 ,实际用示波器测得波形比较好,并没有抖动产生误操作;

(图1)示波器时间单位为50ms/格,按下后松开时间大概是170ms示波器时间单位为50ms/格,按下后松开时间大概是170ms
(图2)按键按下3次,产生3次下降沿触发条件实例按键按下3次,产生3次下降沿触发条件实例
2. 相应代码展示:
下面展示按键配置代码 按键GPIO和NVIC配置

void EXTI_Config(void)
{
   
   
  GPIO_InitTypeDef GPIO_InitStructure; 
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_Configuration();/* 配置 NVIC */
  RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK,ENABLE);/*开启按键GPIO口的时钟*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* 使能 SYSCFG 时钟 ,使用GPIO外部中断时必须使能SYSCFG时钟*/
  
 /*******************KEY1 - PD3***********************/	
  GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;/* 选择按键1的引脚 */  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;/* 设置引脚为输入模式 */ 	    		
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;/* 设置引脚上拉 */
  GPIO_Init(KEY1_INT_GPIO_PORT , &GPIO_InitStructure); /* 使用上面的结构体初始化按键 */
	
  SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);/* 连接 EXTI 中断源 到KEY1引脚 */
  EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;/* 选择 EXTI 中断源 */
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值