【裸机开发】GPT 定时器(三) —— 使用GPT实现高精度延时

延时最简单粗暴的方式就是使用空循环来延时,依赖的是时钟主频(默认是396M)来计数,一旦修改了 6ull 的时钟主频,延时效果就会存在偏差。

因此我们可以使用 EPIT 或者 GPT 的计数功能实现高精度延时,EPIT 是向下计数(自减),GPT 是向上计数(自增)。


目录

一、GPT 初始化

二、延时函数delayus(us 级)

1、原理解析

2、具体实现

三、延时函数delayms(ms级)


一、GPT 初始化

和前面定时中断不一样,如果只是要实现延时功能的话,无需初始化中断,因为延时只用到了 GPT 的计数功能。

  • GPT 复位,并等待复位完成
  • 配置GPT定时器(设置计数器初始值、选择时钟源、选择工作模式)
  • 设置分频数(66 分频)
  • 启动定时器
/** @description	: gpt 定时初始化(不会产生中断,只是单纯的计数)* @param 		: 定时器时间间隔* @return 		: 无*/
void delay_init()
{// 禁用GPT定时器GPT1_CR = 0;GPT1_CR |= (1 << 15);while((GPT1_CR >> 15) & 0x01);		// 等待复位完成/* * 配置GPT定时器* bit 1: 1 设置计数器初始值为0* bit 8-6: 001 选择时钟源ipg_clk* bit 9: 1 选择工作模式free-run*/GPT1_CR |= ((1 << 1) | (1 << 6) | (1 << 9));// 分频GPT1_PR &= ~(0xFFF << 0);    // 低 12 bit 清零GPT1_PR |= (65 << 0);        // 66 分频// 启动定时器GPT1_CR |= (1 << 0);
}

二、延时函数delayus(us 级)

比如我们要延时 500ms,66MHz时钟源,66分频的条件下,500ms 转换成计数值就是 500000,因此当 delta >= 500000 时,说明延时完毕,所以问题的关键就是求从开始到现在经过了多少计数值。

1、原理解析

Free-Run 模式下,当计数器到达 0xFFFF FFFF 时就会溢出,重新从 0 开始计数。如果计数器没有溢出,从开始到现在,计数的差值如下。(计数的差值是和时间关联的)

delta = newcount - oldcount;

如果计数器溢出了,从开始到现在,计数的差值如下

delta = delta1 + delta2 = 0xFFFFFFFF - oldcount + newcount;

注意:这里的 period 与时钟周期无关

2、具体实现

判断是否移除,需要用到 GPT1_SR 的 ROV 位(bit 5)。

/** @description	: 延时函数(us级)* @param - n	: 要延时的us数* @return 		: 无*/
void delayus(unsigned int val)
{// 获取到当前计数器的值unsigned int oldcount = GPT1_CNT;unsigned int delta = 0;while (1){unsigned int newcount = GPT1_CNT;// 判断是否溢出if ((GPT1_SR >> 5) & 0x01)			// 说明溢出了{delta = 0xFFFFFFFF - oldcount + newcount;}else{delta = newcount - oldcount;}if (delta >= val)	break;    // 延时完毕,跳出循环}GPT1_SR &= ~(1 << 5);			// 清除溢出标志位
}

解析:if (delta >= val)

66 MHz 的时钟源,66分频 =》一个时钟周期的间隔就是 1/1M = 1/10^6

val 的单位是 us:

  • 转换成 s,结果 = val / 10^6
  • 转换成对应的计数值 = 10^6 * val / 10^6  = val

因此,val (us)经过转换以后,最终的计数值就是 val

三、延时函数delayms(ms级)

/** @description	: 延时函数(ms级)* @param - n	: 要延时的ms数* @return 		: 无*/
void delayms(unsigned int val)
{delayus(val * 1000);
}

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

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

相关文章

探索MediaPipe的人像分割

MediaPipe是Google开源的计算机视觉处理框架&#xff0c;基于TensorFlow来训练模型。图像分割模块提供人像分割、头发分割、多类分割。本文主要探索如何实现人像分割&#xff0c;当然在人像分割基础上&#xff0c;我们可以做背景替换、背景模糊。 目录 一、配置参数与模型 1…

【AIGC】BaiChuan7B开源大模型介绍、部署以及创建接口服务

模型介绍 baichuan-7B是由百川智能开发的一个开源的大规模预训练模型。基于Transformer结构&#xff0c;在大约1.2万亿tokens上训练的70亿参数模型&#xff0c;支持中英双语&#xff0c;上下文窗口长度为4096。在标准的中文和英文权威benchmark&#xff08;C-EVAL/MMLU&#x…

探索思维导图:提升思维能力与效率的利器

思维导图作为一种强大的思考工具&#xff0c;已经被广泛应用于各个领域&#xff0c;从学习、工作到创意思维和项目管理。 本文将为您介绍思维导图的基本概念、使用方法以及它对思维能力和效率提升的价值。通过学习和掌握思维导图&#xff0c;您将能够更系统地组织和表达您的思…

M3 architecure

using one picture from arm document . 1. 3级别流水线哈弗架构 采用三级流水线&#xff0c;为了简单&#xff0c;常见的流水线5级&#xff0c;对于带有OOOB的12级较为常见&#xff0c;足可见M3的架构简化了很多 2. thumb 加ARMV7-M ISA 指令集就是硬件和软件的中间交互规则…

群载波应急广播主机的应用

一、 概述 群载波主机是专为山洪灾害预警、气象预警、地质灾害预警设计的一款智能IP群载波主机。该群载波主机可通过网络实现与控制中心通讯&#xff0c;用户可实时远程控制功放的开关机状态以及检测设备的主要信息。群载波主机主要用于接收网络信号&#xff0c;与控制中心通讯…

剑指 Offer 33. 二叉搜索树的后序遍历序列

输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true&#xff0c;否则返回 false。假设输入的数组的任意两个数字都互不相同。 观察数组我们可以得到一些初始数据。 数组的最后一位元素为根。根的左子树小于根数据&#xff0c;右子树…

Java面试题及答案整理( 金九银十最新版,持续更新)

最近可能有点闲的慌&#xff0c;没事就去找面试面经&#xff0c;整理了一波面试题。我大概是分成了 Java 基础、中级、高级&#xff0c;分布式&#xff0c;Spring 架构&#xff0c;多线程&#xff0c;网络&#xff0c;MySQL&#xff0c;Redis 缓存&#xff0c;JVM 相关&#xf…

回归预测 | MATLAB实现SSA-DBN麻雀算法优化深度置信网络的数据多输入单输出回归预测

回归预测 | MATLAB实现SSA-DBN麻雀算法优化深度置信网络的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现SSA-DBN麻雀算法优化深度置信网络的数据多输入单输出回归预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于麻雀算法优化深度置信网络(SSA-DB…

String、反射、枚举、lambda表达式以及泛型进阶(数据结构系列16)

目录 前言&#xff1a; 1. String 1.1 字符串常量池 1.1.1 创建对象的思考 1.1.2 字符串常量池&#xff08;StringTable&#xff09; 1.1.3 再谈String对象创建 1.1.4 intern方法 2. 反射 2.1 反射的定义 2.2 反射的用途 2.3 反射的基本信息 2.4 反射相关的类 2.4.…

网络安全、Web安全、渗透测试之笔经面经总结含答案

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

vue-antd-admin——关闭当前页面,跳转到指定页面——bus事件总线的用法

最近在写后台管理系统时&#xff0c;遇到一个需求&#xff1a; 关闭当前页面&#xff0c;然后跳转到指定页面。 具体实现方法如下&#xff1a; 1.tabsView.vue文件中添加bus文件&#xff0c;并实现跨组件之间的监听 1.1 引入bus文件 import Bus from /utils/bus; bus文件内…

解决npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher

一、问题 环境 系统&#xff1a;centos 7 node &#xff1a;v18.16.1 npm&#xff1a;9.5.1 安装pm2 npm install -g pm2提示报错&#xff1a; npm WARN deprecated uuid3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certai…