嵌入式Linux(九)高精度延时-GPT定时器

1. GPT定时器

1.1 GPT定时器介绍

  之前的delay用的是空指令循环实现延时,精度很低。每当修改主频,代码中的delay延时的时间都会发生改变。想要实现高精度延时,可以使用硬件定时器,STM32用的是SYSTICK,IMX6ULL可以使用GPT定时器实现。
  GPT定时器是一个32位的向上计数定时器,同样有一个12位的分频器,也有一个比较值。与EPIT不同的是,GPT还有两个输入捕获通道,三个输出比较通道,可以生成捕获中断,比较中断和溢出中断。
  GPT有两个工作模式,restart模式free-run模式。GPTx_CR寄存器的FRR位为0时工作在restart模式,计数值=比较值时计数值重新从0x00000000开始计数,只有比较通道1有restart模式;free-run模式适用于3路输出比较,比较事件发生后继续计数到0xFFFFFFFF再归零。
  GPT定时器可选5个时钟源,这里我们选择ipg_clk作为时钟源(66MHz)。

1.2 GPT定时器配置

1.2.1 CR寄存器配置

在这里插入图片描述
①SWR(bit15):复位GPT,写1复位,复位完自动清零。
②FRR(bit9):选择运行模式,为0时输出通道1再restart模式,为1时三个输出通道都在free-run模式。
③CLKSRC(bit8:6):时钟源选择。0关闭时钟源,1选择ipg_clk。
④ENMOD(bit1):GPT使能模式。为0时,如果关闭GPT,计数寄存器会保存关闭时的计数值;为1时关闭GPT,计数寄存器会清零。
⑤EN(bit0):GPT使能位。1使能0关闭。

1.2.2 PR/SR寄存器配置

  PR寄存器就用到PRESCALER(bit11:0),对应的是0-4095的分频值。

SR寄存器重要的有三个位:
①ROV(bit15):回滚标志位。当计数器从0xFFFFFFFF回滚到0x00000000时此位置1。
②IF2~IF1:两路输入捕获标志位,发生输入捕获后此位置1,如果使用输入捕获中断需要在中断处理函数中将此位清除。
③OF3~OF1:三路输出比较中断标志位。比较事件发生后此位置1,如果使用输出比较中断需要在中断处理函数中清除此位。

2. 高精度延时

2.1 原理描述

  前面已经选取了ipg_clk作为时钟源,那么设置66分频,最终进入GPT的时钟频率为1MHz,周期为1us,这样每当GPT计1一个数就代表过去了1us。
  进入延时函数后,先读取计数寄存器GPTx_CNT中的值,新的计数值和其差值就是过去的时间。CNT是32位寄存器,最多计0xFFFFFFFFus也就是72min,计满后会溢出,需要在延时函数中处理溢出。

2.2 实现步骤

①设置GPT1定时器:CR的SWR写1进行复位。然后设置CR的CLKSRC,选择时钟源位ipg_clk,设置FRR来选择工作模式。
②设置GPT1的分频值:设置PR寄存器的PRESCALAR,设置为66分频。
③设置GPT1的比较值:GPT1_OCR1的值可以根据输出比较中断所需的时间设置,这次试验不使用该中断所以设置为0xFFFFFFFF。
④使能GPT1定时器:设置CR的EN位为1使能GPT1定时器。
⑤编写延时函数。一个us计时,一个ms计时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值