七. 定时器

定时器

  • 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.hqwc.cn/news/68875.html

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

相关文章

一个简单的协议定制

目录 补充概念&#xff1a;三次握手&#xff0c;四次挥手 再谈协议 网络版计算器 准备工作 makefile log.hpp calServer.hpp calServer.cc calClient.hpp calClient.cc 服务端 新建文件与接口 Protocol.hpp 1.0服务端的一个流程 1.1创建一个回调方法 1.2保证你…

一站式自动化测试平台-Autotestplat

3.1 自动化平台开发方案 3.1.1 功能需求 3.1.3 开发时间计划 如果是刚入门、但有一点代码基础的测试人员&#xff0c;大概 3 个月能做出演示版(Demo)进行自动化测试&#xff0c;6 个月内胜任开展工作中项目的自动化测试。 如果是有自动化测试基础的测试人员&#xff0c;大概 …

NGINX负载均衡及LVS-DR负载均衡集群

目录 LVS-DR原理搭建过程nginx 负载均衡 LVS-DR原理 原理&#xff1a; 1. 当用户向负载均衡调度器&#xff08;Director Server&#xff09;发起请求&#xff0c;调度器将请求发往至内核空间 2. PREROUTING链首先会接收到用户请求&#xff0c;判断目标IP确定是本机IP&#xff…

grafana 的 ws websocket 连接不上的解决方式

使用了多层的代理方式&#xff0c;一层没有此问题 错误 WebSocket connection to ‘wss://ip地址/grafana01/api/live/ws’ failed: 日志报错 msg“Request Completed” methodGET path/api/live/ws status403 解决方式 # allowed_origins is a comma-separated list of o…

基于Java+SpringMVC+Mybaties+layui+Vue+elememt基于协同过滤的电影推荐系统的设计与实现

一.项目介绍 基于协调过滤的电影推荐系统的设计与实现 本系统分为普通用户以及管理员两类 普通用户&#xff1a; 登录系统查看最新推荐电影、收藏、评论、查看电影信息、 对电影进行评分、浏览电影资讯信息、查看个人信息以及浏览收藏…

二.net core 自动化发布到docker (Jenkins安装之后向导)

目录 ​​​​​​​​​​​​​​ 参考资料&#xff1a;https://www.jenkins.io/doc/book/installing/docker/#setup-wizard Post-installation setup wizard.(安装后安装向导) 基于上一篇文章安装&#xff0c;在安装并运行Jenkins&#xff08;不包括使用Jenkins Opera…

同步、异步、协程

目录 同步异步https 异步请求&#xff1a; 协程1.为什么会要协程?2.异步的运行流程是什么3.协程的原语操作4.协程的定义?5.调度器的定义?6.调度的策略?7. api封装, hook8.多核的模式?9.协程的性能?10.要有哪些案例?nty_servernty_ mysql_client.cnty_ mysql oper.cnty_ …

网络编程555

上传代码 #include <stdio.h>//客户端 #include <string.h> #include <stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<head.h> #define PORT 69 #define IP "192.168.124.57"…

【C++面向对象】--- 继承 的奥秘(下篇)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

SpringCloud中 Sentinel 限流的使用

引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>手动编写限流规则&#xff0c;缺点是不够灵活&#xff0c;如果需要改变限流规则需要修改源码…

【Linux】【驱动】杂项设备驱动

【Linux】【驱动】杂项设备驱动 Linux三大设备驱动1. 我们这节课要讲的杂项设备驱动是属于我们这三大设备驱动里面的哪个呢?2.杂项设备除了比字符设备代码简单&#xff0c;还有别的区别吗?3.主设备号和次设备号是什么? 挂载驱动 杂项设备驱动是字符设备驱动的一种&#xff0…

时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)

时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测) 目录 时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)效果一览基本描述模型结构程序设计参考资料效果一览