关于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.
  • 19
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
### 回答1: STM32F407是一款高性能、低功耗的嵌入式微控制器。UART4是该芯片上的一个串口模块,可以通过该模块与其他设备进行通信。DMA(Direct Memory Access)是一种直接内存访问技术,可以在不经过CPU的情况下直接在内存和外设之间传输数据。空闲中断是UART模块上的一种特殊中断,当接收到完整的一帧数据时触发。 使用UART4和DMA进行通信可以大大提高数据传输效率,减轻CPU的负担。在接收数据时,可以开启UART4的空闲中断并设置DMA传输,当接收到完整的一帧数据时触发空闲中断并将数据传输到指定的内存地址中,可以使用DMA的请求信号控制传输的触发条件,也可以使用循环模式实现连续传输。 在配置空闲中断时,需要设置空闲时间,即串口接收数据后多长时间没有收到数据认为是一帧数据接收完毕。同时,在每次传输结束后需要清除空闲中断标志位,以便下一次数据接收。 总之,在使用STM32F407的UART4和DMA进行数据传输时,可以通过空闲中断实现数据的快速、可靠传输,提高系统的性能。 ### 回答2: stm32f407是一款嵌入式微控制器,内置了多个外设模块,包括UART串口模块和DMA控制器模块。使用这两个模块可以实现UART4的DMA传输和空闲中断的功能。 DMA(Direct Memory Access)可以实现不经过CPU的数据传输操作,从而减轻了CPU的负担,提高了系统的处理效率。当数据传输完成后,DMA会产生传输完成中断,此时可以使用空闲中断来处理数据。 在使用UART4 DMA空闲中断时,需要首先配置UART4和DMA控制器。具体步骤如下: 1. 配置UART4串口模块:设置波特率、数据位、停止位、奇偶校验等参数,并开启空闲中断。 2. 配置DMA控制器模块:设置DMA通道、传输方向、数据长度、数据对齐、内外设地址等参数,并开启传输完成中断。 3. 在空闲中断处理函数中,处理UART4接收到的数据,将处理结果保存到指定的内存地址中。 4. 在DMA传输完成中断处理函数中,关闭DMA传输并清除中断标志位。 通过以上配置和处理,即可实现UART4的DMA传输和空闲中断的功能。在实际应用中,可以根据具体的需求和接口特点,进行相关的调试、优化和测试。 ### 回答3: STM32F407是一款高性能ARM Cortex-M4微控制器,其中包含了多个UART接口和DMA控制器。在使用UART4进行数据传输时,可以使用DMA控制器来实现数据的一次性传输,减轻了CPU的负担,并提高了数据传输的效率。 当DMA传输数据完成后,UART模块会自动产生一个空闲中断,用于通知MCU数据已经全部发送完成,可以进行下一轮传输或者其他操作。开启空闲中断可以有效地降低CPU的使用率和功耗。 在使用UART4和DMA进行数据传输时,需要注意配置正确的DMA控制器参数和UART空闲中断参数。同时需要注意DMA传输完成后会有一个空闲中断产生,需要及时处理该中断事件,以免数据出错或丢失。 总之,STM32F407的UART4和DMA结合使用能够大幅提高数据传输效率和节省CPU资源,同时需要注意正确配置和处理相应的中断事件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值