七. 定时器

定时器

  • 1. EPIT定时器
    • (1) 特征:
    • (2) 结构:
    • (3) 工作模式:
    • (4) 寄存器
    • (5) 配置步骤
    • (6) 定时器消抖
  • 2. GPT 定时器
    • (1) 特征
    • (2) 结构
    • (3) 工作模式
    • (4) 寄存器
      • <1> GPTx_CR 配置
      • <2> GPTx_PR 分频
      • <3> GPTx_SR 状态
      • <4> GPTx_CNT 计数
      • <5> GPTx_OCR 比较
    • (5) 实现高精度延时
      • <1> 步骤
      • <2> 实现

1. EPIT定时器

EPIT ( Enhanced Periodic Interrupt Timer):增强的周期中断定时器

(1) 特征:

  1. 时钟源可选的32位向下计数器
  2. 12位的分频值
  3. 计数器和比较值相等时,产生中断

(2) 结构:

在这里插入图片描述

  1. 选择EPIT定时器的时钟源:ipg_clk,ipg_clk_32k,ipg_clk_highfreq。
  2. 12位的分频器,对应 1~4096分频
  3. 三个寄存器:EPIT_CNR(计数器),EPIT_LR(加载寄存器),EPTI_CMPR(比较寄存器)。
  4. 比较器
  5. 引脚输出:可设置 EPIT1_OUT,EPIT2_OUT输出
  6. 定时中断

(3) 工作模式:

set-and-forget 模式:
只要计数器计数到 0,那么就会从加载寄存器 EPITx_LR 中重新加载数据到计数器中
free-running 模式:
当计数器计数到0以后会重新从0XFFFFFFFF开始计数

(4) 寄存器

配置寄存器 EPITx_CR

CLKSRC(bit25:24): EPIT 时钟源选择位(ipg_clk=66MHz)
PRESCALAR(bit15:4): EPIT 时钟源分频值(12位)
RLD(bit3):工作模式:set-and-forget,free-running
OCIEN(bit2):比较中断使能位,
ENMOD(bit1):为 1 的时候来源于加载寄存器
EN(bit0): EPIT 使能位

EPITx_SR
OCIF(bit0) :中断标志位,此位是写 1 清零的。

(5) 配置步骤

  1. 设置 EPIT1 的时钟源
  2. 设置分频值
  3. 设置工作模式
  4. 设置计数器的初始值来源
  5. 使能比较中断
  6. 设置加载值和比较值
  7. EPIT1 中断设置和中断服务函数编写
  8. 使能 EPIT1 定时器

Tout = ((frac +1 )* value) / Tclk;
Tclk: 输入时钟(66M)
frac: 分频值
value: 加载寄存器
Tout: 输出

(6) 定时器消抖

使用定时器来实现按键消抖,防止按键中断内部出现延时函数。
在这里插入图片描述
上图中 t1 - t3 时间之内是,按键抖动。
t1, t2, t3 会触发按键中断。按键中断处理函数内开 10ms 的定时器中断。
因t1-t2, t2-t3的时间小于10ms,不会触发定时器中断。
t3后10ms,触发定时器中断,内部做原来的按键中断处理。

按键中断函数:

void filtertimer_restart(unsigned int value)
{EPIT1->CR &= ~(1<<0); /* 先关闭定时器 */EPIT1->LR = value; 	/* 计数值 */EPIT1->CR |= (1<<0); /* 打开定时器 */
}void gpio1_16_31_irqhandler(void)
{filtertimer_restart(66000000/100); /* 开启定时器 */gpio_clearintflags(GPIO1, 18); /* 清除中断标志位 */
}

2. GPT 定时器

GPT(General Purpose Timer) 通用用途定时器。比EPIT更具有通用性。
可实现的功能:测量时间间隔、生成定时脉冲、执行时间相关的操作。

(1) 特征

  1. 可选时钟源的 32 位向上计数器
  2. 两个输入捕获通道,可以设置触发方式
  3. 三个输出比较通道,可以设置输出模式
  4. 可以生成捕获中断、比较中断和溢出中断
  5. 计数器可以运行在重新启动(restart)或(自由运行)free-run 模式

(2) 结构

时钟选择:ipg_clk_24M、 GPT_CLK(外部时钟)、ipg_clk、ipg_clk_32k 和 ipg_clk_highfreq。
选择 ipg_clk=66MHz
在这里插入图片描述
在这里插入图片描述

  1. GPT 定时器的时钟源
  2. 12 位分频器
  3. GPT 定时器内部 32 位计数器
  4. GPT 的两路输入捕获通道
  5. GPT 的两路输入捕获通道
  6. 输出比较寄存器,三个输出比较寄存器
  7. 输出比较中断

(3) 工作模式

重新启动(restart)模式和自由运行(free-run)模式
重新启动(restart)模式
当计数值和比较寄存器中的值相等的话计数值就会清零,
比较通道 1 才有此模式
自由运行(free-run)模式
当比较事件发生以后并不会复位计数器,而是继续计数,直到计数值为 0XFFFFFFFF,然后重新回滚到 0X00000000。

(4) 寄存器

<1> GPTx_CR 配置

在这里插入图片描述
SWR(bit15):复位 GPT 定时器,写 1 复位 GPT 定时器
FRR(bit9):运行模式,restart / free-run
CLKSRC(bit8:6):钟源选择位 001(ipg_clk)
ENMOD(bit1): 关闭后是否计数清零
EN(bit): GPT 使能位

<2> GPTx_PR 分频

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

<3> GPTx_SR 状态

ROV(bit5): 回滚标志位,计数值从 0XFFFFFFFF 回滚到 0 的时候此位置 1
IF2~IF1(bit4:3):输入捕获标志位
OF3~OF1(bit2:0):输出比较中断标志位,比较事件发生以后此位置 1

<4> GPTx_CNT 计数

保存着 GPT 定时器的当前计数值

<5> GPTx_OCR 比较

三个比较寄存器,GPTx_OCR1-3,存放这三路比较值。可用于触发中断。

(5) 实现高精度延时

设置计数频率为1M,ipg_clk=66MHz,设置 66 分频
GPTx_CNT 计数周期为 1us。

<1> 步骤

  1. 设置 GPT1 定时器,GPTx_CR
  2. 设置 GPT1 的分频值
  3. 设置 GPT1 的比较值
  4. 使能 GPT1 定时器
  5. 编写延时函数

<2> 实现

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; /* 跳出 */}}
}

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

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

相关文章

Java集合知识回顾:从分类到工具类,掌握精髓

文章目录 1. 集合的分类2. Collection 接口3. Map 接口4. 泛型5. Collections 工具类总结 在Java编程世界中&#xff0c;集合是一项极为重要的知识&#xff0c;为我们的程序设计提供了强大的数据结构和处理手段。在本篇文章中&#xff0c;我们将回顾集合的分类以及相关的重要概…

接口测试自动化:简化测试流程,提升效率

接口测试自动化&#xff1a;简化测试流程&#xff0c;提升效率 什么是接口测试自动化&#xff1f; 接口测试自动化是指使用特定的工具和技术来自动化执行接口测试的过程。通过编写脚本&#xff0c;自动化工具可以模拟用户与软件系统的交互&#xff0c;验证接口的功能和性能。…

web应用越用越卡怎么办

简介 如果你的网页应用越用越卡,你就有理由怀疑存在内存泄露 在开发Web应用程序时&#xff0c;经常会遇到内存泄漏的问题&#xff0c;这可能导致应用程序的性能下降或崩溃。Chrome浏览器提供了一个内存面板&#xff0c;可以帮助我们识别并解决这些问题。本文将介绍如何使用Chr…

工程优化问题之三杆桁架设计研究(Matlab代码实现)

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

Unity UI.Image 六边形+流光 Shader

效果图 参考代码 Shader"Custom/HexFlowImage" {Properties{[PerRendererData] _MainTex ("Sprite Texture", 2D) "white" {}_Color ("Tint", Color) (1,1,1,1)_StencilComp ("Stencil Comparison", Float) 8_Stencil (…

YOLO v8目标跟踪详细解读(一)

在此之前&#xff0c;我们已经对yolo系列做出了详细的探析&#xff0c;有兴趣的朋友可以参考yolov8等文章。YOLOV8对生态进行了优化&#xff0c;目前已经支持了分割&#xff0c;分类&#xff0c;跟踪等功能&#xff0c;这对于我们开发者来说&#xff0c;是十分便利。今天我们对…

【Vue+Element-plus】记录后台首页多echart图静态页面

一、页面效果 二、完整代码 Index.vue <template><div><div><DateTime /><!-- {{username}} --></div><el-row :gutter"20"><el-col :span"8"><div class"grid-content bg-purple"><P…

【Python数据容器】--- 元组的基本使用

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Python小白从入门到精通】&#x1f388; 本专栏旨在分享学习Python的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 元组…

LeetCode150道面试经典题-删除有序数组中的重复项(简单)

1.题目 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c…

spring按条件注入@Condition及springboot对其的扩展

概述 spring的ioc极大的方便了日常开发&#xff0c;但随着业务的迭代。配置的一些参数在某些情况下需要按条件注入。 比如原先定义的db公共模块下&#xff0c;相关的配置和工具类只是基于mysql的。但是后续有模块需要使用mongo/es等其他数据库&#xff0c;又想继续使用db公共…

【12】Git工具 协同工作平台使用教程 Gitee使用指南 腾讯工蜂使用指南【Gitee】【腾讯工蜂】【Git】

tips&#xff1a;少量的git安装和使用教程&#xff0c;更多讲快速使用上手Gitee和工蜂平台 一、准备工作 1、下载git Git - Downloads (git-scm.com) 找到对应操作系统&#xff0c;对应版本&#xff0c;对应的位数 下载后根据需求自己安装&#xff0c;然后用git --version验…

K8S MetalLB LoadBalancer

1. 简介 kubernetes集群没有L4负载均衡&#xff0c;对外暴漏服务时&#xff0c;只能使用nodePort的方式&#xff0c;比较麻烦&#xff0c;必须要记住不同的端口号。 LoadBalancer&#xff1a;使用云提供商的负载均衡器向外部暴露服务&#xff0c;外部负载均衡器可以将流量路由…

日常BUG——使用Long类型作id,后端返回给前段后精度丢失问题

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 数据库long类型Id: 前端返回的Id实体类: Data ApiModel("xxx") public class …

【广州华锐视点】VR燃气轮机故障判断模拟演练系统

VR燃气轮机故障判断模拟演练系统由广州华锐视点开发&#xff0c;是一款基于虚拟现实技术的教育工具&#xff0c;旨在为学生提供一个安全、高效、互动的学习环境&#xff0c;帮助他们更好地掌握燃气轮机的故障诊断技能。 这款VR实训软件能够模拟真实的燃气轮机故障诊断场景&…

案例13 Spring MVC参数传递案例

基于Spring MVC实现HttpServletRequest、基本数据类型、Java Bean、数组、List、Map、JSON方式的参数传递。 1. 创建项目 选择Maven快速构建web项目&#xff0c;项目名称为case13-springmvc02。 2. 配置Maven依赖 <?xml version"1.0" encoding"UTF-8&quo…

前沿分享-鱼形机器人

可能并不太前沿了&#xff0c;是21年底的新闻了&#xff0c;但是看见了就顺便发一下吧。 大概就是&#xff0c;通过在pH响应型水凝胶中编码不同的膨胀速率而构建了一种环境适应型变形微机器人,让微型机器人直接向癌细胞输送药物从而减轻药物带来副作用。 技术原理是&#xff0c…

数据结构:力扣刷题

题一&#xff1a;删除有序数组中的重复项 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的…

C++:模拟实现vector以及vector的迭代器失效和拷贝问题

文章目录 实现的功能模拟实现迭代器失效隐含浅拷贝问题 实现的功能 模拟实现 由于前面实现了string&#xff0c;因此这里实现过程不为重点&#xff0c;重点为关于迭代器失效和拷贝问题 template <class T> class vector { public:typedef T* iterator;typedef const T*…

非计算机科班如何丝滑转码?

近年来&#xff0c;很多人想要从其他行业跳槽转入计算机领域。非计算机科班如何丝滑转码&#xff1f; 如何规划才能实现转码&#xff1f; 对于非计算机科班的人来说&#xff0c;想要顺利转码成为计算机相关岗位的从业者&#xff0c;需要经过以下几个步骤&#xff1a; 规划转码…

(docker)mysql镜像拉取-创建容器-容器的使用【个人笔记】

【容器的第一次创建】 容器的第一次创建&#xff0c;需要先下载镜像&#xff0c;从 镜像拉取 0、可以搜索镜像的版本 docker search mysql1、先拉取MySQL的镜像&#xff0c;默认拉取最新版&#xff0c;使用下面的命令拉取mysql镜像 docker pull mysql也可以指定mysql的版本…