【北京迅为】i.MX6ULL终结者GPT 定时器简介
GPT的全称是General Purpose Timer,它是一个32位的向上的定时器(也就是从0x00000000开始向上累加计数),GPT也可以和一个设定的值进行比较,当定时器的技术达到这个预设的值的时候,就会产生一个比较事件,产生一个中断。GPT有一个12位的分频器(我们在前面学习EPIT的时候,EPIT也是有一个12位的分频值),我们可以通过修改分频器的数值来修改GPT的频率,并且GPT的时钟源有多路可以选择。
首先我们来看下GPT的结构框架,如图 1:
从上图我们可以看到:
标识1是GPT定时器的时钟输入,GPT的时钟输入源有5路可以选择,我们下面会介绍。
标识2是12位的分频器,对输入的的时钟源进行分频,功能跟前面介绍的EPIT定时器的分频器基本一样。
标识3是经过分频后的时钟进入GPT定时器内部的32位计数器
标识4是输出比较寄存器,GPT一共支持三路,所以对应的有三路比较寄存器。
标识5是输出比较中断,对应的有三路,当计数器里面的值和比较近存起里面的值相等时就会产生比较中断。
下面我们来看下GPT的时钟源结构图,如图 2所示:
从上图可以看出GPT的时钟源有5路,他们分别是ipg_clk_24M、GPT_CLK、ipg_clk、ipg_clk_32k、ipg_clk_highfreq。我们在本例程选择的ipg_clk作为GPT的时钟源。
GPT定时器具有下列这些功能:
1.内部包含一个32位的向上累加的计数器,输入的时钟源可以选择
2.包含两路输入捕获通道,并且可以编程设置边沿触发方式
3.3路输出比较通道,并且可以编程设置输出模式
4.可以在低功耗或者调试模式下使用
5.比较,捕获,累加计数已满都可以产生对应的中断
6.支持重启模式和自动运行模式
接下来我们看一下GPT定时器相关的几个寄存器,首先第一个是GPTx_CR寄存器,寄存器的结构如图 3所示:
在这个寄存器我们只需关注下面的这些位:
SWR(bit15):软件复位标志,向此位写1,GPT定时器开始复位,当复位完成后,此位会自动清零。
FRR(bit9):操作模式位,此位是0的时候,工作在重启模式,此位是1的时候,工作在*运行模式。
CLKSRC(bit8-6):时钟源选择位,为0的时候不选择时钟源,为1的时候选择ipg_clk时钟源,为2的时候选择ipg_clk_highfreq时钟源,为3的时候选择外部时钟源。为4的时候选择ipg_clk_32k时钟源,为5的时候选择ipg_clk_24M时钟源,其它值作为保留。
STOPEN(bit5):停止模式使能位,为0的时候关闭停止模式,为1的时候打开停止模式。
ENMOD(bit1):使能模式位,当GPT关闭的时候,计数器和分频计数会冻结住他们当前的值,当GPT定时器再次被使能的时候,通过此位来决定计数器和分频计数的数值来源,比如,当此位为0的时候,GPT计数的值按照冻结时的值,如果此位为1,GPT计数器的值重新复位从0开始。
EN(bit0):GPT使能位,为0,关闭GPT,为1,打开GPT。我们需要注意:如果需要使能GPT功能,要先配置完GPT的其它寄存器,最后在使能该位。
GPT的分频寄存器GPTx_PR,结构如图 4所示:
我们在前面介绍过,GPT的分频器是12位的,所以我们用到该寄存器的(bit0-bit11),用来设置分频系数。
然后是GPT的状态寄存器GPTx_SR,结构如图 5所示:
该寄存器是32位的,bit31-bit6作为保留,我们不用关注。
ROV(bit5):累加标志位,当计数到达最大值,然后重新从0开始计数的时候设置该位;复位或*运行模式的时候,当计数到达0xfffffff的时候,此位也会设置为1。当我们服务到该位为0的时候,说明没有发生计数满的情况,如果读取到该位为1.说明发生计数满的情况了。
IF2,IF1(bit4,bit3):GPT计数器的两路输入捕获状态,如果对应的该位为0说明没有发生输入捕获,如果对应的该位为1,说明对应的通路上发生了输入捕获。
OF3,OF2,OF1(bit2,bit1,bit0):GPT定时器的三路输出比较中断标志位,对应的位为0说明没有发生比较中断,如果对应的位为1说明发生比较中断了。
接下来我们看下GPT定时器的输出比较寄存器GPTx_OCR,因为GPT定时器一共有三路输出,所以对应的比较器也会有三路,这里我们选择第一路比较寄存器来介绍下,其它两路和这个是一样的,GPT定时器的第一路输出比较寄存器是GPTx_OCR1,结构如图 6所示:
输出比较寄存器是32位的,用来保存比较数值,当计数器的数值和比较寄存器的数值相等的时候,就会在对应的输出通道产生一个比较事件。
接下来我们看下GPT定时器的计数器寄存器GPTx_CNT,结构如图 7所示:
我们看到GPT定时器的计数器是一个32位的,用来保存当前的计数值。