目录
前言
在前面的实验中我们使用循环来实现延时函数,但是使用循环来实现的延时函数不准确,误差会很大。
本讲实验我们使用正点原子imx6ull开发板,跟着官方例程来学习一下如何使用硬件定时器来实现高精度延时。
高精度延时
学过 STM32 的同学应该知道,可以使用 SYSTICK 来实现高精度延时。 I.MX6U 没有 SYSTICK 定时器,但是 I.MX6U 有其它定时器,比如EPIT定时器、GPT 定时器,本讲实验我们就是用GPT 定时器来实现高精度延时。
GPT定时器
GPT特性
GPT 定时器全称为 General Purpose Timer。
GPT 定时器是一个 32 位向上定时器(也就是从 0X00000000 开始向上递增计数), GPT 定时器也可以跟一个值进行比较,当计数器值和这个值相等的话就发生比较事件,产生比较中断。
GPT 定时器有一个 12 位的分频器,可以对 GPT 定时器的时钟源进行分频。
GPT 定时器特性如下:
- 一个可选时钟源的 32 位向上计数器。
- 两个输入捕获通道,可以设置触发方式。
- 三个输出比较通道,可以设置输出模式。
- 可以生成捕获中断、比较中断和溢出中断。
- 计数器可以运行在重新启动(restart)或(自由运行)free-run 模式。
GPT时钟源
GPT 定时器的可选时钟源如图 :

一共有五个时钟源,分别为:
- ipg_clk_24M、
- GPT_CLK(外部时钟)、
- ipg_clk、
- ipg_clk_32k、
- ipg_clk_highfreq。
本例程选择 ipg_clk 为 GPT 的时钟源, ipg_clk=66MHz。
GPT结构
GPT 定时器结构如图:

①、此部分为 GPT 定时器的时钟源,本章例程选择 ipg_clk 作为 GPT 定时器时钟源。
②、此部分为 12 位分频器,对时钟源进行分频处理,可设置 0~4095,分别对应 1~4096 分频。
③、经过分频的时钟源进入到 GPT 定时器内部 32 位计数器。
④和⑤、这两部分是 GPT 的两路输入捕获通道。
⑥、此部分为输出比较寄存器,一共有三路输出比较,因此有三个输出比较寄存器,输出比较寄存器是 32 位的。
⑦、此部分位输出比较中断,三路输出比较中断,当计数器里面的值和输出比较寄存器里面的比较值相等就会触发输出比较中断。
GPT工作模式
GPT 定时器有两种工作模式:重新启动(restart)模式和自由运行(free-run)模式。
重新启动(restart)模式:
当 GPTx_CR(x=1, 2)寄存器的 FRR 位清零的时候 GPT 工作在此模式。
在此模式下,当计数值和比较寄存器中的值相等的话计数值就会清零,然后重新从0X00000000 开始向上计数,只有比较通道 1 才有此模式。
向比较通道 1 的比较寄存器写入任何数据都会复位 GPT 计数器。对于其他两路比较通道(通道 2 和 3),当发生比较事件以后不会复位计数器。
自由运行(free-run)模式:
当 GPTx_CR(x=1, 2)寄存器的 FRR 位置 1 时候 GPT 工作在此模式下。
此模式适用于所有三个比较通道,当比较事件发生以后并不会复位计数器,而是继续计数,直到计数值为 0XFFFFFFFF,然后重新回滚到 0X00000000。
GPT寄存器
本讲实验我们用到的寄存器如下:
- 配置寄存器 GPTx_CR
- 分频寄存器 GPTx_PR
- 状态寄存器 GPTx_SR
- 计数寄存器 GPTx_CNT
- 输出比较寄存器 GPTx_OCR
配置寄存器 GPTx_CR
GPT控制寄存器(GPT_CR)用
imx6ull开发板GPT定时器高精度延时实验

最低0.47元/天 解锁文章
44

被折叠的 条评论
为什么被折叠?



