一. 延时函数
之前的延时函数是采用空指令执行来实现,延时肯定不准确!
当我们修改了 IMX6ULL的主频以后,采用空指令的延时函数就不准了!因此,我们需要高精度的延时函数,而且不随着主频的变化而改变。
本文我们就来学习一下,如何使用硬件定时器来实现高精度延时。
二. GPT定时器
1. GPT 定时器
GPT定时器有如下特点:
(1) GPT定时器是 32位向上计数器。
(2) GPT定时器有捕获的功能。
(3) GPT定时器支持比较输出或中断功能。
(4) GPT定时器有一个12位的分频器。
(5) GPT定时器的时钟源可以选择,这里我们选择 ipg_clk=66MHZ 作为 GPT的时钟源。
GPT定时器的工作模式:
GPT定时器有两种工作模式:restart模式 和 free-run模式。
restart模式:
定时器计数值和比较寄存器OCR的值相等时,定时器就会重新从0开始计时。
注意!只有比较通道1才有此功能。
free-run模式:
从 0 开始一直加到 0xffffffff ,然后重新从 0 开始,周而复始。三个输出比较通道都适用。
2. GPT定时器的寄存器
GPT_CR寄存器:
bit 0: GPT使能位,为 0的时候关闭 GPT,为 1的时候使能 GPT。
Bit 1:GPT定时器计数器的初始值。
为 0 的时候表示GPT定时器计数值默认为上次关闭的时候遗留的值,为 1则计数值为 0。
Bit8~6:为时钟源的选择,设置为 1,表示 GPT时钟源为 ipg_clk=66MHz。
bit 9: 设置GPT定时器工作模式。
为 0 的时候工作在 restart模式,为 1时则工作在 free-run模式。
Bit 15:软件复位。
GPT_PR寄存器:bit11~0 为分频值,可设置 0-4095,表示 1~4096分频。
GPT_SR寄存器(即状态寄存器):bit 5 表示溢出发生,bit4 和 bit3 分别为输入通道 2和 1的捕获中断标志位。Bit2~0,也就是 OF3~OF1 为比较中断。