ARM嵌入式学习--第七天(GPT)

news2024/12/16 5:58:38

GPT

-介绍

    GPT有一个32位向上计数器,定时计数器值可以使用外部引脚上的事件捕获到寄存器中,捕获触发器可以被编程为上升沿和下降沿。GPT还可以在输出比较引脚上生成事件,并在定时器达到编程值时产生中断。GPT有一个12位预分频器,它提供从多个时钟源获得的可编程时钟频率

 -特征

    1.一个带时钟源选择的32位向上计数器,包括外部时钟

    2.俩个具有可编程触发边缘的输入捕获通道

    3.三个具有可编程输出模式的输出比较通道还提供强制比较功能

    4.可编程为在低功耗调试模式下处于活动状态

    5.在捕获比较翻转事件时中断生成

    6.为计数器操作重新启动或自由运行模式

-GPT的工作原理

 选择时钟信号

    IMX6ULL有4个时钟源可供GPT选择输入到预分频器,分别为:

        1.高频参考时钟ipg_clk_highfreq

        2.低频参考时钟ipg_clk_32k

        3.外围时钟ipg_clk

        4.外部时钟(GPT_CLK)或者晶体振荡器时钟ipg_clk_24M

        (外部时钟或晶体振荡器只能选择一个)

   这里选择ipg_clk=66MHZ作为GPT定时器的输入时钟源,芯片在启动的时候,芯片内部的程序已经做了系统时钟的初始化

预分频设置寄存器(GPT_PR)

    时钟频率与预分频数的关系最终输入频率=时钟频率/(预分频数+1)

GPT计数器工作模式

    GPT计数器可以编程为以俩种模式之一工作:重新启动模式自由运行模式

    在重新启动模式下(可通过GPT控制寄存器GPT_CR选择),当计数器达到比较值时,计数器复位并从0x000000000再次启动重新启动功能仅与比较通道1相关联

    在自由运行模式下,当所有3个通道发生比较事件时,计数器不会重置;相反,计数器会继续计数,直到0xffffffffff,然后归零

GPT操作

    通用计时器(GPT)有一个计数器GPT_CNT),它是一个32位自由运行的向上计数器,它在软件启用后开始计数EN=1

    tips

        1.如果禁用GPT计时器(EN=0),则主计数器和预分频计数器将冻结其当前计数值ENMOD位确定设置EN位并再次启用计数器时GPT计数器的值

        2.如果设置了ENMOD位=1),则启用GPT时,主计数器和预分频器计数器值将重置为0EN=1

        3.如果ENMOD位被编程为0,则当GPT再次启用时(EN=1),主计数器和预分频器计数器从其冻结值重新开始计数

     软件复位GPT_CR控制寄存器中的SWR)复位除EN,ENMOD,STOPEN,WAITEN和DBGEN位之外的所有寄存器位。这些位的状态不受软件复位的影响禁用GPT时,可以进行软件复位

-GPT的输入捕获

使用场景

    在嵌入式开发中,经常需要捕获传感器的高电平(或低电平)信号的持续时间,如红外解码信号,编码器输入信号等

    直观的理解,就是要不断的检测这个信号,当信号从0变成1时,记录一个时间time1,再从1变成0时,记录另一个时间time2俩个时间差就是高电平的持续时间(time2-time1)

工作原理

1.启动定时器,让CNT计数器在不停的计数

2.首先配置定时器的输入通道为上升沿捕获,这样当检测到从0到1的跳变时,ICR捕获寄存器)就会先保存当前的CNT值

3.然后将定时器的输入通道为下降沿捕获,当检测到从1到0的跳变时,ICR就会保存当前的CNT值

4.最终根据俩次捕获的值,就可以计算出高电平持续时间

    tips:

        IMX6ull芯片有俩个GPT定时器

-GPT的输出比较

工作原理

    有三个输出比较通道,它们使用相同的计数器(GPT_CNT)作为输入捕获通道。当输出比较寄存器的编程内容与GPT_CNT中的值匹配设置输出比较状态标志并生成中断

(还有一个“强制比较”(forced-compare)功能,一但设置,就会马上产生比较事件,不管当前计数器的值是否等于比较值,强制比较的产生的事件,跟正常的输出事件相同,只是它不会设置状态标记位并且不会产生中断,一旦设置force-compare位,该事件就会即刻产生,这个位是自动清除的)

-高精度延时实现

实现思路

1.软件复位GPT定时器

2.确定GPT定时器的时钟源

3.预分频器的设置

4.确定比较寄存器的值(根据延时时间来确定

5.开启GPT定时器

6.等待输出比较事件的产生

7.关闭GPT定时器

代码实现
gpt.c
#include "gpt.h"

//初始化
void gpt_int(){
//停止gpt
    GPT1->CR &= ~(0x1<<0);
//软件复位gpt
    GPT1->CR |= (0x1<<15);
//等待复位状态
    while(GPT1->CR & (0x1<<15));
//时钟源选择
    GPT1->CR &= ~(0x7<<6);
    GPT1->CR |=(0X1<<6);
}

//预分频器设置
void gpt_divide(){
    GPT1->PR &= ~(0xfff<<0);
    GPT1->PR |= (0x41<<0);
}


//开始GPT
void gpt_start(){
//设置ENMOD
    GPT1->CR |= (0x1<<1);
//设置工作模式FRR
    GPT1->CR |=(0x1<<9);
//使能gpt
    GPT1->CR |= (0x1<<0);
}

//关闭GPT
void gpt_stop(){
    GPT1->CR &= ~(0x1<<0);
}


//设置比较寄存器的值
void gpt_compare(int value){
    GPT1->OCR3 = value;
}

//等待比较事件的发生
void gpt_wait_compare(){
    while(!(GPT1->SR & (0x1<<2)));
}

void gpt_delay_useconds(int value){
    gpt_int();
    gpt_divide();
    gpt_compare(value);
    gpt_start();
    gpt_wait_compare();
    gpt_stop();
}

void gpt_delay_mseconds(int value){
    gpt_int();
    gpt_divide();
    gpt_compare(value*1000);
    gpt_start();
    gpt_wait_compare();
    gpt_stop();
}

void gpt_delay_seconds(int value){
    gpt_int();
    gpt_divide();
    gpt_compare(value*1000*1000);
    gpt_start();
    gpt_wait_compare();
    gpt_stop();
}

gpt.h
#ifndef __GPT_HEAD__
#define __GPT_HEAD__


#include "../../include/imx6ull.h"
#include <stdio.h>


extern void gpt_delay_seconds(int value);
extern void gpt_delay_mseconds(int value);
extern void gpt_delay_useconds(int value);
#endif 

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

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

相关文章

搭建Tomcat(一)---SocketServerSocket

目录 引入1 引入2--socket 流程 Socket&#xff08;应用程序之间的通讯保障&#xff09; 网卡(计算机之间的通讯保障) 端口 端口号 实例 client端 解析 server端 解析 相关方法 问题1&#xff1a;ServerSocket和Socket有什么关系&#xff1f; ServerSocket Soc…

SpringBoot快速使用

一些名词的碎碎念: 1> 俩种网络应用设计模式 C/S 客户端/服务器 B/S 浏览器/服务器 俩者对比: 2> 集群和分布式的概念 集群: 分布式: 例子: 一个公司有一个人身兼多职 集群: 招聘N个和上面这个人一样身兼多职 分布式: 招聘N个人,分担上面这个人的工作,进行工作的拆分. 工…

【含开题报告+文档+PPT+源码】基于SpringBoot的开放实验管理平台设计与实现

开题报告 设计开放实验管理平台的目的在于促进科学研究与教学的融合。传统实验室常常局限于特定地点和时间&#xff0c;而开放平台可以为学生、教师和研究人员提供一个便捷的交流与共享环境。通过在线平台&#xff0c;他们可以分享实验资源、交流经验&#xff0c;从而促进科学…

分布式 漏桶算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & 漏桶算法 & 总结》《分布式 & 漏桶算法 & 问题》 概述 简介 LBA Leaky Bucket Algorithm 漏桶算法是一种流行于网络通信领域的流量控制/频率限制算法。漏桶算法的核心原理是通过一个概念上的“漏桶”来…

linux glances vs top

一、安装 apt-get install glances glances top显示效果&#xff1a;

CTF知识集-PHP特性

title: CTF知识集-PHP特性 写在开头可能会用到的提示 call_user_func 调用的函数可以不区分大小写preg_match过滤存在长度溢出&#xff0c;长度超过100w检测失效。str_repeat(‘show’,250000); 生成100w个字符preg_match是无法处理数组的&#xff0c;例如:preg_match( n u m…

Hadoop运行Mapreduce问题集锦——Ubuntu虚拟机配置

一、端口访问问题 问题描述 运行任务前一直重连。具体来说&#xff0c;错误发生在尝试从czs-virtual-machine虚拟机的127.0.1.1地址连接到同一台机器的8032端口时&#xff0c;连接被拒绝。 如下&#xff1a; 2024-11-17 23:05:45,800 INFO retry.RetryInvocationHandler: java…

【经验分享】搭建本地训练环境知识点及方法

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

流程引擎Activiti性能优化方案

流程引擎Activiti性能优化方案 基于关系型数据库层面优化 MySQL建表语句优化 Activiti在MySQL中创建默认字符集为utf8&#xff08;即utf8mb3&#xff09;格式&#xff0c;本文将默认字符集设置为utf8mb4&#xff0c;排序规则为utf8mb4_general_ci&#xff0c;并修改变量等类…

Unix 传奇 | 谁写了 Linux | Unix birthmark

注&#xff1a;本文为 “左耳听风”陈皓的 unix 相关文章合辑。 皓侠已走远&#xff0c;文章有点“年头”&#xff0c;但值得一阅。 文中部分超链已沉寂。 Unix 传奇 (上篇) 2010 年 04 月 09 日 陈皓 了解过去&#xff0c;我们才能知其然&#xff0c;更知所以然。总结过去…

TimerPickerDialog组件的用法

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了Snackbar Widget相关的内容,本章回中将介绍TimePickerDialog Widget.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的TimePickerDialog是一种弹出窗口,只不过窗口的内容固定显示为时间,它主…

大模型系列4--开源大模型本地部署到微调(WIP)

背景 一直想真正了解大模型对硬件资源的需求&#xff0c;于是准备详细看一篇视频&#xff0c;将核心要点总结记录下。本文内容参考视频&#xff1a;保姆级教程&#xff1a;6小时掌握开源大模型本地部署到微调&#xff0c;感谢up主 训练成本 训练 > 微调 > 推理训练GPT…

现代密码学总结(上篇)

现代密码学总结 &#xff08;v.1.0.0版本&#xff09;之后会更新内容 基本说明&#xff1a; ∙ \bullet ∙如果 A A A是随机算法&#xff0c; y ← A ( x ) y\leftarrow A(x) y←A(x)表示输入为 x x x ,通过均匀选择 的随机带运行 A A A,并且将输出赋给 y y y。 ∙ \bullet …

Python中opencv的一些函数及应用

Sobel 算子函数 功能&#xff1a; Sobel 算子用于计算图像的梯度&#xff08;变化率&#xff09;&#xff0c;常用于边缘检测。它通过对图像应用一个基于一阶导数的滤波器来强调图像中的边缘部分&#xff0c;特别是水平和垂直方向上的边缘。通过计算图像的梯度&#xff0c;可以…

【docker】springboot 服务提交至docker

准备docker &#xff08;不是docker hub或者harbor&#xff0c;就是可以运行docker run的服务&#xff09;&#xff0c;首先确保docker已经安装。 本文以linux下举例说明&#xff1a; systemctl stats docker ● docker.service - Docker Application Container EngineLoaded…

XDOJ 877 图的深度优先遍历

题目&#xff1a;图的深度优先遍历 问题描述 已知无向图的邻接矩阵&#xff0c;以该矩阵为基础&#xff0c;给出深度优先搜索遍历序列&#xff0c;并且给出该无向图的连通分量的个数。在遍历时&#xff0c;当有多个点可选时&#xff0c;优先选择编号小的顶点。&#xff08;即…

大屏开源项目go-view二次开发1----环境搭建(C#)

最近公司要求做一个大屏的程序用于展示公司的产品&#xff0c;我以前也没有相关的经验&#xff0c;最糟糕的是公司没有UI设计的人员&#xff0c;领导就一句话要展示公司的产品&#xff0c;具体展示的内容细节也不知道&#xff0c;全凭借自己发挥。刚开始做时是用wpf做的&#x…

摆脱B端UI框架的桎梏,首先从布局开始

在 B 端开发中&#xff0c;UI 框架虽带来便利&#xff0c;但也可能形成桎梏。要摆脱这种束缚&#xff0c;首先从布局着手是个明智之举。传统的 B 端 UI 框架布局可能较为固定&#xff0c;缺乏灵活性。我们可以尝试创新的布局方式&#xff0c;如响应式设计&#xff0c;适应不同屏…

认识异常吧

在 Java 中&#xff0c;将程序执行过程中发生的不正常行为称为异常 。 异常的体系结构 1. Throwable &#xff1a; 是异常体系的顶层类&#xff0c;其派生出两个重要的子类 , Error&#xff08;错误&#xff09; 和 Exception&#xff08;异常&#xff09; 2. Error &…

Repo管理

文章目录 前言Repo介绍清单仓库清单仓库的组成 初始化Repo同步远程仓库Repo实际应用 前言 我们知道&#xff0c;Git是用来管理某一个仓库&#xff0c;那当一个项目用到了多个仓库时&#xff0c;怎么来同步管理这些仓库呢&#xff1f;这个时候就可以引入Repo管理。 Repo介绍 …