概述
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计时。
最后
以上就是酷酷酸奶为你收集整理的嵌入式Linux(九)高精度延时-GPT定时器1. GPT定时器2. 高精度延时的全部内容,希望文章能够帮你解决嵌入式Linux(九)高精度延时-GPT定时器1. GPT定时器2. 高精度延时所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复