【裸机开发】EPIT 定时器 —— 按键消抖

实际工程中,不能直接通过延时来消抖 ! 这里我们采用定时器来消抖,这也是内核处理消抖的一种方式。


目录

一、基本原理

1、延时消抖的弊端

2、定时器消抖原理

二、按键消抖实现

1、按键中断

2、定时器中断

三、附加:按键 / 定时器中断初始化 

1、按键初始化

2、定时器初始化


一、基本原理

1、延时消抖的弊端

按键按下的时候,存在抖动,延时消抖其实就是不管中间抖了多少下,全都忽略。这样的话,不确定因素太多。

  • 延时设置的过短可能无法达到消抖的效果;
  • 延时设置的过长可能会存在“第一次按键按下没反应,第二次才有反应”的情况。这就是延时过长导致第一次按下被无视。

2、定时器消抖原理

定时器消抖则是考虑了每一次的抖动。当 t1 时刻产生一次抖动时,我们启动一个定时器,定时器的周期为 10 ms(10ms已经基本覆盖了全部的抖动)

第二次检测到抖动的时候,此时按理说还没有触发中断,我们再次启动定时器,第一次和第二次用的同一个定时器,所以这次定时器启动时会重新计数。

如此往复,直到最后一次抖动出现之前,定时器在不断被刷新计数,始终没有触发过中断,即没有调用过中断服务函数。

当最后一次抖动出现时,说明抖动过程已经结束,此时会调用中断服务函数,中断服务函数里要做的就是按键按下以后的处理逻辑。

这里涉及到两个中断,分别是按键中断、定时器中断

  • 按键中断:中断触发时,启动定时器
  • 定时器中断:中断触发时,执行按键按下以后的处理逻辑

二、按键消抖实现

定时器实现按键消抖的关键在于设置两个中断服务函数。

1、按键中断

每次按键中断触发的时候(假设是下降沿触发),我们都要重新启动 EPIT1 定时器,此时定时器就会刷新计数,重新开始计时。

void key_irqhandler(void* userParams)
{
    restart_epit(33000000/100);     // 启动定时器(每隔10ms触发一次中断)
    GPIO1_ISR |= (1 << 18);
}

restart_epit 函数在最后的《定时器中断初始化》部分。在使用 restart_epit 之前,需要在 main.c 中先调用 epit_init 函数初始化定时器。

2、定时器中断

按键抖动的时候,不会触发定时器中断,只有当按键出现最后一次抖动时(按键抖动过程结束),才会触发定时器中断,此时再实现我们原本希望按键按下时该做的事。

假设我们希望按键按下时,切换LED灯的状态。

void epit_irqhandler(void* userParams)
{
    stop_epit();        // 防止处理中断时,按键再次被按下,影响现有的中断处理
    if (((GPIO1_DR >> 18) & 0x01) == 0)
    {
        switch_led(epit_stat);
        epit_stat = !epit_stat;
    }
    
    EPIT1_SR |= 1;           // 清除中断标志位
}

三、附加:按键 / 定时器中断初始化 

使用中断之前,必然需要先进行中断初始化,这里附上按键和定时器的初始化操作。

1、按键初始化

/* 按键初始化 */
void key_init()
{
    /* 1、设置IO复用为GPIO1_IO03 */
    IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B = 0x5;

    /* 2、初始化复用引脚,设置电气属性 */
    IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B = 0xF080;

    /* 3、初始化GPIO1 */
    GPIO1_GDIR &= ~(1 << 18);

    /* 4、按键中断初始化 */
    key_int_init();
}

/* 按键中断初始化 */
void key_int_init()
{
    /* 使能GIC 中 IRQ 的某个外设对应的中断 */
    GIC_EnableIRQ(99);    // 99 表示 GPIO1_IO16 ~ 31 的中断

    // GPIO1 中断使能
    GPIO1_IMR |= (1 << 18);

    // 配置 GPIO1_IO18 中断触发方式(下降沿触发)
    GPIO1_EDGE_SEL &= ~(1 << 18);
    GPIO1_ICR2 |= (3 << 4);

    // 注册中断服务函数
    register_irqhandler(99, key_irqhandler);
}

2、定时器初始化

定时器初始化时,暂时先不打开定时器,因为要触发了按键中断以后再启动定时器。

/*
 * frac: 代表分频数
 * interval: 代表计数器的初始值
 */
void epit_init(unsigned int frac, unsigned int value)
{
    if (frac < 1 )
        frac = 1;
    else if(frac > 4096)
        frac = 4096;
    
    EPIT1_CR = 0;       // CR 寄存器清零(停止定时器)
    /* EPIT1 使能、分频、时钟源初始化 */
    EPIT1_CR |=(0xE | ((frac - 1) << 4) | (0x1 << 24));

    /* 加载寄存器 */
    EPIT1_LR = value;

    /* 比较寄存器 */
    EPIT1_CMPR = 0;

    /* EPIT1 中断使能 */
    GIC_EnableIRQ(88);

    /* 注册中断服务函数 */
    register_irqhandler(88, epit_irqhandler);

    /* 计数寄存器 */
    // EPIT1_CNR = value;

    // EPIT1_CR |= 1;          // 启动定时器
}

/*
 * 停止定时器
 */
void stop_epit()
{
    EPIT1_CR &= ~(1 << 0);
}

/*
 * 启动定时器
 */ 
void restart_epit(unsigned int val)
{
    stop_epit();
    EPIT1_LR = val;
    EPIT1_CR |= 1;          // 启动定时器
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/33256.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qgis加载在线XYZ瓦片影像服务的实践操作

目录 背景 一、XYZ瓦片相关知识 1、xyz瓦片金字塔 2、 瓦片编号 3、瓦片访问 二、在Qgis中加载在线地图 1、Qgis版本 2、瓦片加载 3、地图属性预览 总结 背景 在做电子地图应用的时候&#xff0c;很常见的会提到瓦片&#xff08;tile&#xff09;的概念&#xff0c;瓦片…

【MySQL】MVCC是如何解决快照读下的幻读问题的

文章目录 LBCC当前读 MVCC隐藏列undo logRead View 总结 我们从上文中了解到InnoDB默认的事务隔离级别是repeatable read&#xff08;后文中用简称RR&#xff09;&#xff0c;它为了解决该隔离级别下的幻读的并发问题&#xff0c;提出了LBCC和MVCC两种方案。其中LBCC解决的是当…

信号链噪声分析11

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 如今的射频(RF)系统变得越来越复杂。高度的复杂性要求所有系统指标&#xff08;例如严格的 链接和噪声预算&#xff09;达到最佳性能。确保整个信号链的正确设计至关重要。而信…

如何了解(海外抖音TiKToK)与国内抖音的区别以及介绍

一、海外抖音TK平台的优势 自从抖音在中国大受欢迎后&#xff0c;海外也推出了海外版抖音TK平台。尽管两者都是视频分享平台&#xff0c;但它们在一些方面具有明显的区别和独特的优势。下面将详细介绍海外抖音TK平台的优势以及与国内抖音的区别性。 优势&#xff1a; 1. 多元…

三防工业平板在哪些行业中得到广泛应用?

随着科技的不断进步&#xff0c;工业平板正逐渐成为各行业中不可或缺的工具。其中&#xff0c;三防工业平板由于其卓越的耐用性和丰富的功能&#xff0c;在许多行业中得到了广泛的应用。本文将重点介绍三防工业平板在以下几个行业中的应用。 三防工业平板在物流行业中发挥着关键…

vue-router.esm.js:2248 Error: Cannot find module ‘@/views/dylife/ 报错解决

具体是展示 一直加载 控制台报找不到模块 webpack版本问题&#xff0c;webpack4 不支持变量方式的动态 import &#xff0c;新版本需要使用 require() 来解决此问题。 return () > import(/views/${view}) 改写成 return (resolve) > require([/views/${view}], reso…

【三层交换机】网络杂谈(16)之三层交换机技术

涉及知识点 什么是三层交换机&#xff0c;三层交换技术的由来&#xff0c;三层交换机&#xff0c;三层交换的应用范例。深入了解三层交换机技术。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不胜感激 文章目录 涉及知…

HBase(5):导入测试数据集

1 需求 将ORDER_INFO.txt 中的HBase数据集&#xff0c;我们需要将这些指令放到HBase中执行&#xff0c;将数据导入到HBase中。 可以看到这些都是一堆的put语句。那么如何才能将这些语句全部执行呢&#xff1f; 2 执行command文件 2.1 上传command文件 将该数据集文件上传到指…

6.5 指令与文件的搜寻

6.5.1 指令文件名的搜寻 在终端机模式当中&#xff0c;连续输入两次[tab]按键就能够知道使用者有多少指令可以下达。 which &#xff08;寻找“可执行文件”&#xff09; 这个指令是根据“PATH”这个环境变量所规范的路径&#xff0c;去搜寻“可执行文件”的文件名。所以&…

DETR系列:RT-DETR(一) 论文解析

论文&#xff1a;《DETRs Beat YOLOs on Real-time Object Detection》 2023.4 DETRs Beat YOLOs on Real-time Object Detection&#xff1a;https://arxiv.org/pdf/2304.08069.pdf 源码地址&#xff1a;https://github.com/PaddlePaddle/PaddleDetection/tree/develop/conf…

【Visual Studio】报错 ASSERT: “i >= 0 i < size()“,使用 C++ 语言,配合 Qt 开发串口通信界面

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 这个 Bug 是我做这个工程时遇到的&#xff1a;【Visual Studio】Qt 的实时绘图曲线功能&#xff0c;使用 C 语言&#xff0c;配合 Qt 开发串口通信界面。 文…

javaweb学习2

p标签使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <!--p标签定义段落 p元素自动在其前后创建一段空白--> hello&#xff0c;world &l…

设计模式之访问者模式笔记

设计模式之访问者模式笔记 说明Iterator(访问者)目录访问者模式示例类图抽象访问者角色类抽象元素角色类宠物猫类宠物狗类自己类其他人类家类测试类 说明 记录下学习设计模式-访问者模式的写法。JDK使用版本为1.8版本。 Iterator(访问者) 意图:表示一个作用于某对象结构中的…

日历组件 el-calendar 实现标记功能

需求&#xff1a;在日历组件中选择月份时&#xff0c;可以显示当月已经质检或需质检的数据 思路&#xff1a;前端每次点击日期选择器的时候调用接口&#xff0c;接口返回当月需要质检或已质检的数据&#xff0c;前端拿到数据就开始做判断然后回显。 大体样式 代码&#xff1a…

Redis7【① 概述 安装 配置】

1. Redis入门概述 1. Redis是什么 Redis全称 远程字典服务器&#xff08;Remote Dictionary Server&#xff09;&#xff0c;它是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的基于内存的Key-Value数据库&#xff0c;提供了丰富的数据结构&…

windows无法启动RemoteDesktopServices服务(位于本地计算机上)。错误126:找不到指定的模块。

win10的搜索栏输入 注册表编辑器。打开&#xff0c;找到如下路径 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermService\Parameters 将指定数值项ServiceDll的数值数据改成默认值&#xff1a; %SystemRoot%\System32\termsrv.dll 再重新尝试就好了。 …

Spring是什么?

目录 1、Spring的简介 2、Spring七大功能模块 3、Spring的优点 4、Spring的缺点 5、Sprig容器 6、Spring的生态圈&#xff08;重点&#xff09;***** 7、Spring中bean的生命周期 1、Spring的简介 Spring的英文翻译为春天&#xff0c;可以说是给Java程序员带来了春天&…

DAMA数据治理CDGA/CDGP认证考试备考经验分享

一&#xff0c;关于DAMA中国和CDGA/CDGP考试 国际数据管理协会&#xff08;DAMA国际&#xff09;是一个全球性的专业组织&#xff0c;由数据管理和相关的专业人士组成&#xff0c;非营利性机构&#xff0c;厂商中立。协会自1980年成立以来&#xff0c;一直致力于数据管理和数字…

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置多帧采集模式(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置多帧采集模式&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和多帧采集模式的技术背景Baumer工业相机通过BGAPISDK设置多帧采集模式功能1.引用合适的类文件2.通过BGAPISDK设置多帧采集模式功能 Baumer工业相…

Wolfram Mathematica 13.3 特别版

WOLFRAM MATHEMATICA 全球現代技術計算的權威系統 MATHEMATICA 三十年來&#xff0c;Mathematica 定義了技術計算領域的最新技術—並為全球數百萬創新者、教育工作者、學生和其他人提供了主要的計算環境。 Mathematica 以其卓越的技術和簡易實用廣受讚譽&#xff0c;提供了單…