在使用STM32的时候可以使用SYSTICK来实现高精度延时。
I.MX6U没有SYSTICK定时器,但是有GPT定时器来实现高精度延时。
GPT(General Purpose Timer)
GPT定时器是一个32位向上定时器(也就是从0x00000000开始向上递增计数),GPT定时器也可以跟一个值进行比较,当计数器值和这个值相等的话就发生比较事件,产生比较中断。
- GPT 定时器有一个 12 位的分频器,可以对 GPT 定时器的时钟源进行分频。
- 一个可选时钟源的 32 位向上计数器。
- 两个输入捕获通道,可以设置触发方式。
- 三个输出比较通道,可以设置输出模式。
- 可以生成捕获中断、比较中断和溢出中断。
- 计数器可以运行在重新启动(restart)或自由运行(free-run)模式。
ipg_clk_24M、GPT_CLK(外部时钟)、ipg_clk、ipg_clk_32k 和 ipg_clk_highfreq。本例程选择 ipg_clk 为 GPT 的时钟源ipg_clk=66MHz。
- 定时器的时钟源。
- 12 位分频器,对时钟源进行分频处理,可设置 0~4095,分别对应 1~4096 分频。
- 经过分频的时钟源进入到GPT定时器内部32位计数器。
- 4和5是GPT的两路输入捕获通道。
- 4和5是GPT的两路输入捕获通道。
- 三路输出比较中断,当计数器里面的值和输出比较寄存器里面的值相等就会触发输出比较中断。
GPT 定时器有两种工作模式:重新启动(restart)模式和自由运行(free-run)模式,这两个工作模式的区别如下:
- 重新启动(restart)模式:当GPTx_CR寄存器的FRR位清零的时候GPT工作在此模式。在此模式下,当计数值和比较寄存器中的值相等的话就会清零,然后重新从0x00000000开始向上计数,只有比较通道1才有此模式!向比较通道1的比较寄存器写入任何数据都会复位GPT计数器。对于其他两路比较通道(通道2,3),当发生比较事件以后不会复位计数器。
- 自由运行(free-run)模式:当 GPTx_CR(x=1,2)寄存器的 FRR 位置 1 时候 GPT 工作在此模式下,此模式适用于三个所有比较通道,当比较事件发生后并不会复位计数器,而是继续计数,直到计数值为0xffffffff,然后重新回滚到0x00000000.
GPT定时器的输出比较寄存器GPTx_OCR,每个输出比较通道对应一个输出比较寄存器,因此一个GPT定时器有三个OCR寄存器,它们的作用是相同的。
定时器实现高精度延时原理
高精度延时函数的实现要借助硬件定时器,本章使用GPT实时器来实现高精度延时。
如果设置GPT定时器的时钟源为ipg_clk=66MHz,设置66分频,那么进入GPT定时器的最终时钟频率就是1MHz,周期为1us。
GPT的计数器每计一个数就表示“过去”了1us。如果计10个数就表示过去了10us。通过读取寄存器GPTx_CNT中的值就知道计数个数,比如现在要延时100us,那么进入延时函数以后记录下寄存器GPTx_CNT中的值为200,当GPTx_CNT中的值为300的时候就表示100us过去了,也就是延时结束。文章来源:https://www.toymoban.com/news/detail-432125.html
GPTx_CNT是个32位寄存器,如果时钟为1MHz,GPTx_CNT 最多可以实现0XFFFFFFFFus=4294967295us≈4294s≈72min。
也就是说72分钟以后GPTx_CNT 寄存器就会回滚到 0X00000000,也就是溢出,需要在延时函数里面处理溢出的情况。文章来源地址https://www.toymoban.com/news/detail-432125.html
到了这里,关于高精度延时的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!