linuxARM裸机学习笔记(5)----定时器按键消抖和高精度延时实验

定时器按键消抖

之前的延时消抖,是直接借助delay函数进行的,但是这样会浪费CPU的性能。我们采用延时函数的方式实现,可以实现快进快出。

 定时器消抖,必须是在t3的时间点才可以,当在t1,t2的时间点每次进入中断函数都要重新开启定时器的计时

但是,这两个时间点的时间小于定时器设定的10ms,所以不会产生定时器中断,也会避免这种情况的发生。只有在t3的时刻开启,才会产生定时器中断【时间够长】,这便是定时器的消抖原理。

void filtertimer_init(unsigned int value)
{EPIT1->CR = 0;	//先清零/** CR寄存器:* bit25:24 01 时钟源选择Peripheral clock=66MHz* bit15:4  0  1分频* bit3:	1  当计数器到0的话从LR重新加载数值* bit2:	1  比较中断使能* bit1:    1  初始计数值来源于LR寄存器值* bit0:    0  先关闭EPIT1*/EPIT1->CR = (1<<24 | 1<<3 | 1<<2 | 1<<1);/* 计数值    */EPIT1->LR = value;/* 比较寄存器,当计数器值和此寄存器值相等的话就会产生中断 */EPIT1->CMPR	= 0;	GIC_EnableIRQ(EPIT1_IRQn);	/* 使能GIC中对应的中断 *//* 注册中断服务函数		    */system_register_irqhandler(EPIT1_IRQn, (system_irq_handler_t)filtertimer_irqhandler, NULL);	
}

 对定时器进行设置,上一章节已经详细说明了,不多赘述。核心其实计时定时器设定了10ms开启定时器中断。因为选择时钟主频是66MHZ【计一个数=1/66000000s】,所以倒计时的时间是time = (66000000/100/66000000 = 10ms)。

高精度延时实验

GPT定时器

GPT是一个32位的向上定时器【0X00000000】,也可以和一个数值进行比较,当计数值和这个数值相等的话就会发生比较事件,产生比较中断,也存在一个12位的分频器【1-4096】。

存在三个输出比较寄存器,三个是输出比较中断

两种模式:

重新启动(restart)模式:

GPTx_CR(x=1 2) 寄存器的 FRR 位清零的时候 GPT 工作在此
模式。在此模式下,当计数值和比较寄存器中的值相等的话计数值就会清零,然后重新从
0X00000000 开始向上计数,只有比较通道 1 才有此模式!向比较通道 1 的比较寄存器写入任何
数据都会复位 GPT 计数器。对于其他两路比较通道(通道 2 3 ),当发生比较事件以后不会
复位计数器

自由运行(free-run)模式

GPTx_CR(x=1 2) 寄存器的 FRR 位置 1 时候 GPT 工作在此模
式下,此模式适用于所有三个比较通道,当比较事件发生以后并不会复位计数器,而是继续计
数,直到计数值为 0XFFFFFFFF ,然后重新回滚到 0X00000000

SWR(bit15):向此位写 1 就可以复位 GPT 定时器,当 GPT 复位完成以 后此为会自动清零

FRR(bit9):当此位为 0 的时候比较通道 1 工作在重新启动(restart)模式。当此位为 1 的时候所有的三个比较通道均工作在自由运行模式(free-run)
CLKSRC(bit8:6)
GPT 定时器时钟源选择位,为 0 的时候关闭时钟源;为 1 的时候选择 ipg_clk 作为时钟源;为 2 的时候选择 ipg_clk_highfreq 为时钟源;为 3 的时候选择外部时钟为 时钟源;为 4 的时候选择 ipg_clk_32k 为时钟源;为 5 的时候选择 ip_clk_24M 为时钟源。
ENMOD(bit1) GPT 使能模式,此位为 0 的时候如果关闭 GPT 定时器,计数器寄存器保
存定时器关闭时候的计数值。此位为 1 的时候如果关闭 GPT 定时器,计数器寄存器就会清零。
EN(bit) GPT 使能位,为 1 的时候使能 GPT 定时器,为 0 的时候关闭 GPT 定时器

 

PRESCALER(bit11:0) 这就是 12 位分频值, 可设置 0~4095 ,分别对应 1~4096 分频

 

ROV(bit5) 回滚标志位,当计数值从 0XFFFFFFFF 回滚到 0X00000000 的时候此位置 1
IF2~IF1(bit4:3) 输入捕获标志位,当输入捕获事件发生以后此位置 1 ,一共有两路输入捕
获通道。如果使用输入捕获中断的话需要在中断处理函数中清除此位。
OF3~OF1(bit2:0) :输出比较中断标志位,当输出比较事件发生以后此位置 1 ,一共有三路
输出比较通道。如果使用输出比较中断的话需要在中断处理函数中清除此位

高精度延时的原理:

才开始选择的是66MHZ的频率,然后66进行分频,所以时钟频率为1MHZ,也就是计一个数字为1us,这样我们就可以进行精确计时了,当GPTx_CNT为最大值的时候【0XFFFFFFFFus = 4294967296us = 4295s = 71.5min】。
void delayus(unsigned    int usdelay)
{unsigned long oldcnt,newcnt;unsigned long tcntvalue = 0;	/* 走过的总时间  */oldcnt = GPT1->CNT;while(1){newcnt = GPT1->CNT;if(newcnt != oldcnt){if(newcnt > oldcnt)		/* GPT是向上计数器,并且没有溢出 */tcntvalue += newcnt - oldcnt;else  					/* 发生溢出    */tcntvalue += 0XFFFFFFFF-oldcnt + newcnt;oldcnt = newcnt;if(tcntvalue >= usdelay)/* 延时时间到了 */break;			 		/*  跳出 */}}
}/** @description		: 毫秒(ms)级延时* @param - msdelay	: 需要延时的ms数* @return 			: 无*/
void delayms(unsigned	 int msdelay)
{int i = 0;for(i=0; i<msdelay; i++){delayus(1000);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模仿火星科技 基于cesium+ 贴地测量+可编辑

当您进入Cesium的编辑贴地测量世界&#xff0c;下面是一个详细的操作过程&#xff0c;帮助您顺利使用这些功能&#xff1a; 1. 创建提示窗&#xff1a; 启动Cesium应用&#xff0c;地图场景将打开&#xff0c;欢迎您进入编辑模式。在屏幕的一角&#xff0c;一个友好的提示窗将…

【云原生】Kubernetes节点亲和性分配 Pod

目录 1 给节点添加标签 2 根据选择节点标签指派 pod 到指定节点[nodeSelector] 3 根据节点名称指派 pod 到指定节点[nodeName] 4 根据 亲和性和反亲和性 指派 pod 到指定节点 5 节点亲和性权重 6 pod 间亲和性和反亲和性及权重 7 污点和容忍度 8 Pod 拓扑分布约束 官方…

【基础IO】动静态库 {动静态库的创建和使用;动态库的加载;默认优先使用动态链接;为什么要有库;动态链接的优缺点;静态链接的优缺点;一些有趣的库}

动静态库 一、静态库(.a) 1.1 如何创建静态库&#xff1f; 编写源文件与头文件。注意&#xff1a;库的源文件没有main函数&#xff01; 将所有的源文件编译生成目标文件。(如果只提供.h和.o给用户&#xff0c;用户也可以成功编译运行。但这样的做法太过麻烦&#xff0c;且容易…

Maven出现报错 ; Unable to import maven project: See logs for details错误的多种解决方法

问题现象; IDEA版本&#xff1a; Maven 版本 &#xff1a; 3.3.9 0.检查 maven 的设置 &#xff1a;F:\softeware\maven\apache-maven-3.9.3\conf 检查setting.xml 配置 本地仓库<localRepository>F:\softeware\maven\local\repository</localRepository>镜像…

Improved Deep Metric Learning with Multi-class N-pair Loss Objective

Improved Deep Metric Learning with Multi-class N-pair Loss Objective 来源&#xff1a; NIPS’2016NEC Laboratories America 文章目录 Improved Deep Metric Learning with Multi-class N-pair Loss ObjectiveDistance Metric LearningDeep Metric Learning with Multip…

redis的持久化

第一章、redis的持久化 1.1&#xff09;持久化概述 ①持久化可以理解为将数据存储到一个不会丢失的地方&#xff0c;Redis 的数据存储在内存中&#xff0c;电脑关闭数据就会丢失&#xff0c;所以放在内存中的数据不是持久化的&#xff0c;而放在磁盘就算是一种持久化。 ②为…

python实现简单的爬虫功能

前言 Python是一种广泛应用于爬虫的高级编程语言&#xff0c;它提供了许多强大的库和框架&#xff0c;可以轻松地创建自己的爬虫程序。在本文中&#xff0c;我们将介绍如何使用Python实现简单的爬虫功能&#xff0c;并提供相关的代码实例。 如何实现简单的爬虫 1. 导入必要的…

Python中的dataclass:简化数据类的创建

Python中的dataclass是一个装饰器&#xff0c;用于自动添加一些常见的方法&#xff0c;如构造函数、__repr__、__eq__等。它简化了创建数据类的过程&#xff0c;减少了样板代码&#xff0c;提高了代码的可读性和可维护性。有点类似java里面的Java Bean。 让我们看一个简单的例子…

Vscode无法写入文件 NoPermissions (FileSystemError): Error: EACCES: permission

用Vscode想要新建一个index.html的时候遇到了下图问题&#xff0c;说没有权限无法写入文件。 没有权限&#xff0c;咱们给他加上权限哈哈哈&#xff0c;博主是Mac电脑&#xff0c;如下操作&#xff1a; 1.找到你项目的根目录&#xff0c;右键&#xff0c;点击“显示简介”。 …

【非欧几里得域信号的信号处理】使用经典信号处理和图信号处理在一维和二维欧几里得域信号上应用低通滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

vue3+element-plus点击列表中的图片预览时,图片被表格覆盖

文章目录 问题解决 问题 视觉 点击图片进行预览&#xff0c;但还能继续选中其他的图片进行预览&#xff0c;鼠标放在表格上&#xff0c;那一行表格也会选中&#xff0c;如图所示第一行的效果。 代码 <el-table-column prop"id" label"ID" width"…

React源码解析18(1)------ React.createElement 和 jsx

1.React.createElement 我们知道在React17版本之前&#xff0c;我们在项目中是一定需要引入react的。 import React from “react” 即便我们有时候没有使用到React&#xff0c;也需要引入。原因是什么呢&#xff1f; 在React项目中&#xff0c;如果我们使用了模板语法JSX&am…