GPT(General Purpose Timer)定时器

基本概念:

在嵌入式系统中,General Purpose Timer(GPT)是一种非常重要的硬件组件,用于提供定时功能。

  • 定义:通用定时器是一种能够提供精确时间测量和控制功能的电子设备或电路模块。它可以产生周期性的时钟信号,通常可提供从微秒级到毫秒级的定时时钟功能。也可以对事件进行计时和计数,广泛应用于各种需要时间控制和测量的场景。
  • 工作原理:通常基于振荡器产生基准时钟信号,然后通过分频、计数等操作来实现特定的时间间隔和定时功能。例如,一个简单的通用定时器可以由一个晶体振荡器和一个计数器组成,晶体振荡器产生稳定的振荡频率,计数器对振荡周期进行计数,当计数值达到预设值时,产生一个定时中断或输出信号

与其他定时器的比较

  • 与RTC(实时时钟)的区别

    • 功能侧重点不同:RTC主要用于提供准确的日期和时间信息,它能够持续运行,即使在设备断电的情况下,也能通过备用电池保持时间的连续性,常用于需要长期准确计时的场景,如电子手表、计算机主板等。而通用定时器更侧重于产生精确的时间间隔和进行事件计数,用于控制和测量设备的运行状态和事件的发生。
    • 精度和范围不同:RTC的精度通常在秒级,能够提供年、月、日、时、分、秒等完整的时间信息。通用定时器的精度可以更高,能够达到微秒甚至纳秒级别,但它的计时范围相对较小,一般用于较短时间间隔的测量和控制。
  • 与看门狗定时器的区别

    • 作用目的不同:看门狗定时器主要用于系统监控和故障恢复。当系统出现异常或死机时,看门狗定时器会在超时后触发复位信号,使系统重新启动,以保证系统的可靠运行。通用定时器则主要用于实现设备的正常功能和时间控制,不具有自动复位系统的作用。
    • 工作方式不同:看门狗定时器需要定期被“喂狗”,即在正常运行时,系统需要在定时器超时前对其进行清零或重置操作,以防止复位信号的产生。通用定时器则根据预设的时间参数和事件触发条件进行工作,不需要外部的定期干预。

RTC(实时时钟)与看门狗定时器在后续博客中会做出重点论述,这里只简单概述与GPT定时器的区别

以I.MX6ULL开发板为例,介绍GPT定时器在嵌入式中的应用

I.MX6ULL GPT介绍

The GPT has a 32-bit up-counter. The timer counter value can be captured in a register using an event on an external pin. The capture trigger can be programmed to be a rising or/and falling edge. The GPT can also generate an event on the output compare pins and an interrupt when the timer reaches a programmed value. The GPT has a 12-bit prescaler, which provides a programmable clock frequency derived from multiple clock sources.

GPT具有一个32位向上计数器。通过外部引脚上的事件,可以将定时器计数器的值捕获到寄存器中。捕获触发条件可以编程设置为上升沿或/和下降沿。当定时器达到预设值时,GPT还可以在输出比较引脚上生成事件并产生中断。GPT具有一个12位预分频器,可从多个时钟源派生出可编程的时钟频率。

 I.MX6ULL GPT框图

时钟输入与预分频

外部时钟信号从时钟选择模块输入。

预分频器(Prescaler)是一个12位可编程的分频器,可以将输入时钟信号分频,范围从1到4096。预分频器的输出作为定时器计数器的时钟源。

定时器计数器

定时器计数器是一个32位向上计数器,它会根据预分频器输出的时钟信号进行计数。计数器的值可以通过处理器数据总线(Processor Data Bus)进行读取和写入。

输入捕获

GPT模块有两个输入捕获通道(GPT_CAPTURE1和GPT_CAPTURE2),它们可以同步外部事件。当外部引脚上的信号变化(如上升沿或下降沿)时,可以通过输入捕获寄存器(Timer Input Reg 1和Timer Input Reg 2)捕获当前计数器的值。输入捕获通道可以配置触发条件,如上升沿(IF1)、下降沿(IF2)或双边沿(IF1IE和IF2IE)。

输出比较

GPT模块有三个输出比较通道(GPT_COMPARE1、GPT_COMPARE2和GPT_COMPARE3),它们可以用于生成事件或中断。输出比较寄存器(Timer Output Reg1、Timer Output Reg2和Timer Output Reg3)存储预设的比较值。当计数器的值与任一输出比较寄存器的值相匹配时,可以通过比较器(cmp)触发输出比较事件(OF1、OF2、OF3)。

输出模式

输出比较事件可以配置不同的输出模式(OM1、OM2、OM3),这些模式定义了输出引脚在比较事件发生时的行为。

中断

当输入捕获或输出比较事件发生时,可以生成相应的中断(IF1IE、IF2IE、OF1IE、OF2IE、OF3IE)。中断通过GPT中断总线(GPT Interrupt Bus)传递给处理器。

溢出和回卷

当计数器达到最大值(0xFFFFFFFF)时,会发生溢出(ROV),并触发溢出中断(ROVIE)。计数器可以配置为在溢出后回卷(FRR),即从0重新开始计数。

自由运行和重新启动

GPT可以配置为自由运行模式,即计数器在溢出后继续计数。也可以配置为重新启动模式,即在溢出后从预设的初始值重新开始计数。

 计数器时钟配置图

Crystal Oscillator (ipg_clk_24M):24MHz的晶体振荡器时钟源,它可以输入到预分频器24M(Prescaler 24M)。

External Clock (GPT_CLK):外部提供的GPT时钟信号,它可以直接输入到多路复用器,也可以通过预分频器24M后输入。

Peripheral Clock (ipg_clk):系统周钟,通常是一个较低频率的时钟信号,它可以直接输入到多路复用器。

Low Frequency Reference Clock (ipg_clk_32k):32kHz的低频参考时钟,它可以直接输入到多路复用器,适用于低功耗模式。

High Frequency Reference Clock (ipg_clk_highfreq):高频参考时钟,它可以直接输入到多路复用器,适用于需要高精度计时的应用。

Prescaler 24M:预分频器24M是一个可编程的分频器,它接收24MHz的晶体振荡器时钟信号,并将其分频后输出。

Sync:同步器(Sync)用于同步来自不同时钟源的信号,确保时钟信号的稳定性和一致性。

To Prescaler:多路复用器的输出可以被选择性地路由到预分频器,以进一步降低时钟频率,适应定时器计数的需求。

Clock off:允许关闭时钟信号,用于省电或在不需要定时器工作时关闭时钟。

 I.MX6ULL GPT 特性

One 32-bit up-counter with clock source selection, including external clock.
• Two input capture channels with a programmable trigger edge.
• Three output compare channels with a programmable output mode. A "forced
compare" feature is also available.
• Can be programmed to be active in low power and debug modes.
• Interrupt generation at capture, compare, and rollover events.
• Restart or free-run modes for counter operations.
  • 一个带有时钟源选择的32位向上计数器,包括外部时钟。
  • 两个输入捕获通道,具有可编程的触发边缘。
  • 三个输出比较通道,具有可编程的输出模式。还提供“强制比较”功能。
  • 可编程在低功耗模式和调试模式下保持活动状态。
  • 在捕获、比较和回卷事件时生成中断。
  • 计数器操作的重启或自由运行模式。

预分频器值变更时序图

The clock input source is configured using the clock source field (CLKSRC, in the
GPT_CR control register). The clock input to the prescaler can be disabled by
programming the CLKSRC bits (of the GPT_CR control register) to 000. The CLKSRC
field value should be changed only after disabling the GPT (by setting the EN bit in the GPT_CR to 0).The PRESCALER field selects the divide ratio of the input clock that drives the main counter. The prescaler can divide the input clock by a value (from 1 to 4096) and can be changed at any time. A change in the value of the PRESCALER field immediately affects the output clock frequency.

时钟输入源是通过时钟源字段(CLKSRC,在GPT_CR控制寄存器中)进行配置的。可以通过将GPT_CR控制寄存器中的CLKSRC位编程为000来禁用输入到预分频器的时钟。只有在将GPT_CR中的EN位设置为0禁用GPT后,才应该更改CLKSRC字段的值。

PRESCALER字段选择驱动主计数器的输入时钟的分频比。预分频器可以将输入时钟分频,分频值可以从1到4096,并且可以随时更改。对PRESCALER字段值的更改会立即影响输出时钟频率。

 

在通用定时器(GPT)中如何改变预分频器的值以及这种改变如何影响时钟信号:

钟信号(Clk):图中最上方的波形代表输入到预分频器的原始时钟信号,通常是一个高频的方波信号。

预分频器值(Prescaler Value):中间的水平线代表预分频器的值。在图中,预分频器值从0x004变为0x002。这个值决定了输入时钟信号被分频的程度。

预分频后的时钟信号(Prescaled Clk)

图中最下方的波形代表经过预分频器处理后的时钟信号。这个信号的频率是原始时钟信号频率除以预分频器的值。

预分频器值的改变

在图中,预分频器的值在某个时刻从0x004改变为0x002。这个改变通过一个斜线箭头表示,箭头指向预分频器值从0x004到0x002的变化。

即时生效

一旦预分频器的值被改变,预分频后的时钟信号(Prescaled Clk)会立即反映出这种变化。在图中,这表现为时钟信号的周期在预分频器值改变后变得更短,因为分频值减小了。

时序关系

图中展示了预分频器值改变与时钟信号之间的时序关系。可以看到,预分频器值的改变是在时钟信号的上升沿或下降沿进行的,这确保了改变的同步性。

通用定时器(GPT)工作模式(Operating Modes)

定时器可以执行的基本功能和配置。在工作模式下,GPT可以被设置为不同的时钟源,并且可以通过预分频器来调整计数速率。此外,还可以设置定时器的中断生成,以及在捕获、比较和回卷事件时的行为。GPT计数器可以被编程为在两种模式下工作:重启模式或自由运行模式

重启模式(Restart Mode)

在重启模式下(可通过GPT控制寄存器GPT_CR选择),当计数器达到比较值时,计数器会重置并从0x00000000开始重新计数。此重启功能仅与比较通道1相关联。对通道1的比较寄存器进行任何写操作都将重置GPT计数器。这是为了避免在计数过程中,如果比较值从较高的值更改为较低的值时可能错过比较事件。

自由运行模式(Free-Run Mode)

在自由运行模式下,当所有三个通道的比较事件发生时,计数器不会重置;相反,计数器会继续计数直到达到0xFFFFFFFF,然后回卷到0x00000000。这种模式允许计数器在达到最大值后继续运行,而不是在每个比较事件后重置模式适用于需要持续计时或测量的应用场景,其中计数器的值需要保持连续,而不是周期性重置。

通用定时器(GPT)的输入捕获 (Input Capture)

GPT定时器的输入捕获通道的工作原理和特性:

有两个输入捕获通道,每个输入捕获通道都有专用的捕获引脚、捕获寄存器和输入边缘检测/选择逻辑。每个输入捕获功能都有一个关联的状态标志,并且能够导致处理器发出中断服务请求。

当在输入捕获引脚上发生选定的边缘转换时,GPT_CNT的内容将被捕获到相应的捕获寄存器中,并且设置相应的中断状态标志。如果在中断寄存器中设置了相应的使能位,那么在检测到转换时可以生成中断请求。捕获可以被编程为发生在输入引脚的上升沿、下降沿、上升沿和下降沿,或者可以禁用捕获。这些事件与被选择来运行计数器的时钟同步。只有那些在先前记录的转换之后至少一个时钟周期(被选择来运行计数器的时钟)发生的转换才能保证触发捕获事件。在输入转换的锁定中最多可以有一个时钟周期的不确定性。输入捕获寄存器可以在任何时候读取,而不会影响它们的值。

 边缘检测:

  • 上升沿:从低电平到高电平的转换。
  • 下降沿:从高电平到低电平的转换。
  • 双边沿:同时检测上升沿和下降沿。
 输入捕获事件的时序图

时钟信号(Clk)

图中最上方的波形代表从CLKSRC位字段设置中选择的时钟信号。这个时钟信号用于驱动GPT计数器。

捕获通道1的引脚信号(ipp_ind_capin1)

中间的波形代表捕获通道1的引脚信号。这个信号是从外部输入到GPT模块的,用于捕获事件。

捕获信号(Sig)

图中最下方的波形代表模块感知到的捕获信号。这个信号是经过GPT模块处理后的信号,用于触发捕获事件。

捕获事件

当ipp_ind_capin1信号的边缘转换(如上升沿或下降沿)与Sig信号同步时,GPT计数器的当前值将被捕获到相应的捕获寄存器中。图中用箭头标出了捕获事件发生的时刻。

同步性

捕获事件与选择运行计数器的时钟同步。这意味着,只有在先前记录的转换之后至少一个时钟周期发生的转换才能保证触发捕获事件。

不确定性

在输入转换的锁定中可能存在最多一个时钟周期的不确定性。这可能是由于信号传播延迟或模块处理延迟造成的。

捕获寄存器

捕获到的GPT计数器值将被存储在捕获寄存器中,这个值代表了从定时器启动到捕获事件发生的时间。

通用定时器(GPT)的输出比较 (Output Compare )

GPT定时器的输出比较通道的工作原理和特性:

三个输出比较通道使用的是与输入捕获通道相同的计数器(GPT_CNT)。当输出比较寄存器中预设的值与GPT_CNT中的值匹配时,将设置一个输出比较状态标志,并生成一个中断(如果中断寄存器中的相应位已被设置)。因此,输出比较定时器引脚将被置位、清零、切换、完全不受影响,或者提供一个低电平脉冲,持续时间为一个输入时钟周期(受限于引脚上允许的最大频率),这取决于已编程的模式位。

此外,还有一个“强制比较”功能,允许软件在需要时生成一个比较事件,而不需要计数器值等于比较值的条件。由于强制比较而采取的行动与输出比较匹配时相同,除了不会设置状态标志且不能生成中断。在向强制比较位写入后,强制通道会立即采取编程的行动。这些位是自清零的,并且总是读取为零

输出比较和中断时序图

时钟信号(Clk)

图中最上方的波形代表定时器的时钟信号,用于驱动GPT计数器。

计数器(Counter)

紧随Clk下方的波形代表GPT计数器的值,它是一个向上计数的32位计数器。计数器的值在每个时钟周期内递增。

比较值(Compare Value)

比较值是预设在输出比较寄存器中的值,当计数器的值与这个值相匹配时,将触发输出比较事件。

输出模式(Output Mode)

输出模式决定了当计数器值与比较值相匹配时,输出信号的行为。

图中显示了三种不同的输出模式:

011:设置(set),输出信号在比较事件时被设置为高电平。

010:清除(clear),输出信号在比较事件时被设置为低电平。

001:切换(toggle),输出信号在每个比较事件时翻转。

输出信号(Output Signal)

输出信号是根据输出模式在比较事件发生时改变的信号。

图中展示了不同输出模式下输出信号的变化:

011模式下,输出信号在计数器值达到比较值时被设置为高电平。

010模式下,输出信号在计数器值达到比较值时产生一个低电平脉冲。

001模式下,输出信号在计数器值达到比较值时翻转。

中断(Interrupt)

如果中断使能位被设置,那么在输出比较事件发生时,可以生成一个中断请求。图中没有明确显示中断请求,但它会在输出比较事件发生时根据配置生成。

低脉冲(low pulse)

010模式下,当计数器值与比较值相匹配时,输出信号会产生一个短暂的低电平脉冲。

 I.MX6ULL 通用定时器(GPT)的基本编程步骤:

时钟配置:确保使能GPT模块的时钟,设置时钟控制器模块(CCM)的相应位。

定时器初始化:重置GPT模块,将所有寄存器恢复到默认状态。

时钟源选择:配置GPT的时钟源,选择合适的时钟源并设置预分频器,以得到所需的计数频率。

计数模式选择:选择计数模式,重启模式(Restart Mode)或自由运行模式(Free-Run Mode)。

输入捕获配置:配置输入捕获通道,设置触发边缘(上升沿、下降沿或双边沿),使能输入捕获中断(如果需要)。

输出比较配置:配置输出比较寄存器,配置输出比较通道,设置比较值和输出模式(如切换、清除、设置或脉冲),使能输出比较中断(如果需要)。

中断配置(如果需要):配置和使能GPT的中断,包括输入捕获和输出比较中断。在中断服务程序(ISR)中实现相应的处理逻辑。

计数器启动:设置GPT控制寄存器中的EN位来启动定时器,开始计数。

结语:

无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力

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

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

相关文章

数据挖掘实训:天气数据分析与机器学习模型构建

随着气候变化对各行各业的影响日益加剧,精准的天气预测已经变得尤为重要。降雨预测在日常生活中尤其关键,例如农业、交通和灾害预警等领域。本文将通过机器学习方法,利用历史天气数据预测明天是否会下雨,具体内容包括数据预处理、…

kalilinux - 目录扫描之dirsearch

情景导入 先简单介绍一下dirsearch有啥用。 假如你现在访问一个网站,例如https://www.example.com/ 它是一个电商平台或者其他功能性质的平台。 站在开发者的角度上思考,我们只指导https://www.example.com/ 但不知道它下面有什么文件,文…

SOME/IP协议详解 基础解读 涵盖SOME/IP协议解析 SOME/IP通讯机制 协议特点 错误处理机制

车载以太网协议栈总共可划分为五层,分别为物理层,数据链路层,网络层,传输层,应用层,其中今天所要介绍的内容SOME/IP就是一种应用层协议。 SOME/IP协议内容按照AUTOSAR中的描述,我们可以更进一步…

springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)

线上预览: 移动端 http://8.146.211.120:8081/ 管理端 http://8.146.211.120:8088/ 小红书凭借优秀的产品体验 和超高人气 目前成为笔记类产品佼佼者 此项目将详细介绍如何使用Vue.js和Spring Boot 集合uniapp 开发一个仿小红书应用,凭借uniapp 可以在h5 小程序 app…

Win11右键菜单实现

主要参考Win11 Context Menu Demo 此工程是vs2022编译,vs2019先修改下 base.h 方可编译过 编译好dll以后 拷贝至SparsePackage目录下 生成稀疏包msix 就拿他工程里面的改,编辑AppxManifest.xml,配置都要对,一个不对可能都失败&a…

像JSONDecodeError: Extra data: line 2 column 1 (char 134)这样的问题怎么解决

问题介绍 今天处理返回的 JSON 的时候,出现了下面这样的问题: 处理这种问题的时候,首先你要看一下当前的字符串格式是啥样的,比如我查看后发现是下面这样的: 会发现这个字符串中间没有逗号,也就是此时的J…

what?ngify 比 axios 更好用,更强大?

文章目录 前言一、什么是ngify?二、npm安装三、发起请求3.1 获取 JSON 数据3.2 获取其他类型的数据3.3 改变服务器状态3.4 设置 URL 参数3.5 设置请求标头3.6 与服务器响应事件交互3.7 接收原始进度事件3.8 处理请求失败3.9 Http Observables 四、更换 HTTP 请求实现…

Linux Kernel 之十 详解 PREEMPT_RT、Xenomai 的架构、源码、构建及使用

概述 现在的 RTOS 基本可以分为 Linux 阵营和非 Linux 阵营这两大阵营。非 Linux 阵营的各大 RTOS 都是独立发展,使用上也相对独立;而 Linux 阵营则有多种不同的实现方法来改造 Linux 以实现实时性要求。本文我们重点关注 Linux 阵营的实时内核实现方法! 本文我们重点关注 …

【拒绝算法PUA】3065. 超过阈值的最少操作数 I

系列文章目录 【拒绝算法PUA】0x00-位运算 【拒绝算法PUA】0x01- 区间比较技巧 【拒绝算法PUA】0x02- 区间合并技巧 【拒绝算法PUA】0x03 - LeetCode 排序类型刷题 【拒绝算法PUA】LeetCode每日一题系列刷题汇总-2025年持续刷新中 C刷题技巧总结: [温习C/C]0x04 刷…

ClickHouse-CPU、内存参数设置

常见配置 1. CPU资源 1、clickhouse服务端的配置在config.xml文件中 config.xml文件是服务端的配置,在config.xml文件中指向users.xml文件,相关的配置信息实际是在users.xml文件中的。大部分的配置信息在users.xml文件中,如果在users.xml文…

《自动驾驶与机器人中的SLAM技术》ch9:自动驾驶车辆的离线地图构建

目录 1 点云建图的流程 2 前端实现 2.1 前端流程 2.2 前端结果 3 后端位姿图优化与异常值剔除 3.1 两阶段优化流程 3.2 优化结果 ① 第一阶段优化结果 ② 第二阶段优化结果 4 回环检测 4.1 回环检测流程 ① 遍历第一阶段优化轨迹中的关键帧。 ② 并发计算候选回环对…

GPT 系列论文精读:从 GPT-1 到 GPT-4

学习 & 参考资料 前置文章 Transformer 论文精读 机器学习 —— 李宏毅老师的 B 站搬运视频 自监督式学习(四) - GPT的野望[DLHLP 2020] 來自猎人暗黑大陆的模型 GPT-3 论文逐段精读 —— 沐神的论文精读合集 GPT,GPT-2,GPT-3 论文精读【论文精读】…

大数据技术Kafka详解 ⑤ | Kafka中的CAP机制

目录 1、分布式系统当中的CAP理论 1.1、CAP理论 1.2、Partitiontolerance 1.3、Consistency 1.4、Availability 2、Kafka中的CAP机制 C软件异常排查从入门到精通系列教程(核心精品专栏,订阅量已达600多个,欢迎订阅,持续更新…

riscv架构下linux4.15实现early打印

在高版本linux6.12.7源码中,early console介绍,可参考《riscv架构下linux6.12.7实现early打印》文章。 1 什么是early打印 适配内核到新的平台,基本环境搭建好之后,首要的就是要调通串口,方便后面的信息打印。 正常流…

improve-gantt-elastic(vue2中甘特图实现与引入)

1.前言 项目开发中需要使用甘特图展示项目实施进度,左侧为表格计划,右侧为图表进度展示。wl-gantt-mater,dhtmlx尝试使用过可拓展性受到限制。gantt-elastic相对简单,可操作性强,基础版本免费。 甘特图(Gan…

力扣 全排列

回溯经典例题。 题目 通过回溯生成所有可能的排列。每次递归时,选择一个数字,直到选满所有数字,然后记录当前排列,回到上层时移除最后选的数字并继续选择其他未选的数字。每次递归时,在 path 中添加一个新的数字&…

1/13+2

运算符重载 myString.h #ifndef MYSTRING_H #define MYSTRING_H #include <cstring> #include <iostream> using namespace std; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度int capacity; …

【HM-React】08. Layout模块

基本结构和样式reset 结构创建 实现步骤 打开 antd/Layout 布局组件文档&#xff0c;找到示例&#xff1a;顶部-侧边布局-通栏拷贝示例代码到我们的 Layout 页面中分析并调整页面布局 代码实现 pages/Layout/index.js import { Layout, Menu, Popconfirm } from antd impor…

计算机视觉算法实战——实时车辆检测和分类(主页有相关源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​​​​​​​​​​​​​​​​ 1. 领域介绍✨✨ 实时车辆检测和分类是计算机视觉中的一个重要应用领域&#xff0c;旨在从视频流或…

使用 selenium-webdriver 开发 Web 自动 UI 测试程序

优缺点 优点 有时候有可能一个改动导致其他的地方的功能失去效果&#xff0c;这样使用 Web 自动 UI 测试程序可以快速的检查并定位问题&#xff0c;节省大量的人工验证时间 缺点 增加了维护成本&#xff0c;如果功能更新过快或者技术更新过快&#xff0c;维护成本也会随之提高…