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

这篇具有很好参考价值的文章主要介绍了linuxARM裸机学习笔记(5)----定时器按键消抖和高精度延时实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

定时器按键消抖

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

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

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

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

但是,这两个时间点的时间小于定时器设定的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
linuxARM裸机学习笔记(5)----定时器按键消抖和高精度延时实验,Linux,学习,笔记

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 定时器

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

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

 linuxARM裸机学习笔记(5)----定时器按键消抖和高精度延时实验,Linux,学习,笔记文章来源地址https://www.toymoban.com/news/detail-629847.html

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);
	}
}

到了这里,关于linuxARM裸机学习笔记(5)----定时器按键消抖和高精度延时实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【裸机开发】GPT 定时器(一) —— GPT的功能、寄存器解析

    后续需要使用 GPT 计数器实现中断以及延时,这里我们需要先了解一下GPT的功能以及相关寄存器。 目录 一、GPT 定时器的功能 1、计数器 2、输入捕获 3、输出比较(GPT的两种工作模式) 二、寄存器解析 1、GPTx_CR 2、GPTx_PR 3、GPTx_SR 4、GPTx_IR 5、GPTx_OCRn 6、GPTx_ICRn 7、GPTx_CNT gpt 定时

    2024年02月12日
    浏览(38)
  • 【笔记】6位数码管显示定时器定时的时分秒,通过按键控制时间,自定义串口通信协议,根据单片机接收到的指令控制数码管显示

              目的:利用PROTUES仿真软件、串口调试助手、虚拟串口,搭建单片机与PC通信仿真平台,熟悉单片机串口的配置及与PC机的通信方法;尝试制定通信协议(含开始码、指令、数据、停止码),单片机根据通信协议解析接收到的内容,并根据接收的指令执行相应的操

    2024年02月05日
    浏览(38)
  • 【STM32】STM32学习笔记-定时器定时中断 定时器外部时钟(14)

    1.1 TIM_InternalClockConfig 1.2 TIM_TimeBaseInit 1.3 TIM_TimeBaseInitTypeDef 1.4 TIM_ClearFlag 1.5 TIM_ITConfig 1.6 TIM_Cmd 1.7 中断服务函数 参考程序 1.8 TIM_ETRClockMode2Config timer.h timer.c main.c timer.h timer.c main.c 09-定时器定时中断.rar 10-定时器外部时钟.rar 参考: 【STM32】江科大STM32学习笔记汇总

    2024年02月03日
    浏览(38)
  • 51-定时器与按键控制LED流水灯模式&定时器时钟

    按键(以独立按键为例)控制LED流水灯模式: 在按键控制LED流水灯模式中,如果仅仅简单的把独立按键与LED流水灯拼接起来,则会出现一些问题:在LED流水灯的代码中会有长时间的Delay,此时按键检测就会很不灵敏:按下时不灵敏,需要一些时间才能被检测到,按下后再松手时

    2024年02月08日
    浏览(36)
  • DSP28335学习笔记:定时器中断

    F28335的CPU定时器有3个且均为32位,分别是Timer0、Timer1、Timer2, 其中 Timer2 是为操作系统 DSP/BIOS 保留的,当未移植操作系统时,可用来做普 通的定时器。这三个定时器的中断信号分别为 TINT0,TINT1,TINT2,分别对应于中断向量 INT1,INT13,INT14。 一、F28335定时器介绍(CPU定时器)

    2024年04月10日
    浏览(36)
  • 定时器搭配GPIO做定时扫描按键 -- STM32

    在STM32F103系列的单片机应用中,定时器(TIM)和通用输入/输出(GPIO)是常用的模块之一。这两个模块结合起来,可以实现非常多的实际应用,其中,定时器可以用来实现定时扫描按键,而GPIO可以用来控制LED等设备。 本文将介绍,在STM32F103系列的单片机中如何通过定时器和

    2024年02月07日
    浏览(38)
  • C51单片机按键控制流水灯模式(定时器版本)以及定时器时钟

      上篇文章我们学了关于定时器的三大组成部分及许多寄存器的概念问题,这篇文章我们就要开始讲解实操部分。 首先,我们先来看看本文最后写成的代码:      以上三张是代码的主函数,此外,代码中还需用到的独立按键检测代码在下面:  注意:头文件中#ifndef和#def

    2023年04月17日
    浏览(38)
  • 【STM32】学习笔记(TIM定时器)

    定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发

    2024年02月09日
    浏览(32)
  • stm32学习笔记-6TIM定时器

    注:笔记主要参考B站 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。 注:工程及代码文件放在了本人的Github仓库。 定时器是STM32中功能最强大、结构最复杂的一个外设。定时器将包括四部分8小节: 第一部分主要讲定时器基本定时的功能,也就是指定一个时间,让

    2024年02月15日
    浏览(41)
  • stm32——hal库学习笔记(定时器)

    使用纯软件(CPU死等)的方式实现定时(延时)功能 使用精准的时基,通过硬件的方式,实现定时功能 递增计数模式实例说明 中心对齐模式实例说明 TIM6 和TIM7 控制寄存器 1(TIMx_CR1) TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER) TIM6 和TIM7 状态寄存器(TIMx_SR) TIM6 和TIM7 计数器(TIMx_CNT)

    2024年02月21日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包