GPT定时器
GPT定时器
GPT 定时器全称为 General Purpose Timer。
GPT 定时器是一个 32 位向上定时器(也就是从 0X00000000 开始向上递增计数), GPT 定时器也可以跟一个值进行比较,当计数器值和这个值相等的话就发生比较事件,产生比较中断。
GPT 定时器有一个 12 位的分频器,可以对 GPT 定时器的时钟源进行分频, GPT 定时器特性如下:
①、一个可选时钟源的 32 位向上计数器。
②、两个输入捕获通道,可以设置触发方式。
③、三个输出比较通道,可以设置输出模式。
④、可以生成捕获中断、比较中断和溢出中断。
⑤、计数器可以运行在重新启动(restart)或(自由运行)free-run 模式。


寄存器
GPTx_CR 比较寄存器(复位,时钟源选择,模式选择,使能)

GPTx_PR 来放分频值(12位)
GPTx_SR 状态寄存器(写1才清0,写0无效)

GPTx_IR中断寄存器



溢出中断,捕获中断,比较中断使能
GPTx_OCR[n]:来放比较值

GPTx_ICR[n]:来放捕获值
GPTx_CNT :当前计数值(向上)
模式
FRR只对channel 1有效,channel 2和3都是free-run模式
重新启动(restart)模式:当 GPTx_CR(x=1, 2)寄存器的 FRR 位清零的时候 GPT 工作在此模式。在此模式下,当计数值和比较寄存器中的值相等的话计数值就会清零,然后重新从0X00000000 开始向上计数,只有比较通道 1 才有此模式!向比较通道 1 的比较寄存器写入任何数据都会复位 GPT 计数器。对于其他两路比较通道(通道 2 和 3),当发生比较事件以后不会复位计数器。
自由运行(free-run)模式:当 GPTx_CR(x=1, 2)寄存器的 FRR 位置 1 时候 GPT 工作在此模式下,此模式适用于所有三个比较通道,当比较事件发生以后并不会复位计数器,而是继续计数,直到计数值为 0XFFFFFFFF,然后重新回滚到 0X00000000。
应用
高精度延时
不需要中断使能,比较值设为最大就行(也可以不设为最大),GPT1/2/3两种模式在轮询中记录差值并累加,时钟的值设置为1us加1
定时器中断
GPT1 reset模式可以同时设置为中断并且改变比较值(delay函数要同步)比较值不要太小,不然判断会误差(多走一个轮回)
if(newcnt > oldcnt) /* GPT是向上计数器,并且没有溢出 */
tcntvalue += newcnt - oldcnt;
else /* 发生溢出 */
tcntvalue += 0XFFFFFFFF-oldcnt + newcnt;
oldcnt = newcnt;例子
清0 复位 模式 分频 比较值 中断使能 外设使能 GIC使能 注册
void delay_init(void)
{
GPT1->CR = 0; /* 清零,bit0也为0,即停止GPT */
GPT1->CR = 1 << 15; /* bit15置1进入软复位 */
while((GPT1->CR >> 15) & 0x01); /*等待复位完成 */
GPT1->CR = (1<<6); //模式
GPT1->PR = 65; //分频
GPT1->OCR[0] = 500000;//比较值
GPT1->IR |= 1 << 0;//中断使能
GPT1->CR |= 1<<0; //使能GPT1
GIC_EnableIRQ(GPT1_IRQn); //使能GIC中对应的中断
system_register_irqhandler(GPT1_IRQn, (system_irq_handler_t)gpt1_irqhandler, NULL); //注册中断服务函数
#if 0
/* 中断处理函数 */
void gpt1_irqhandler(void)
{
static unsigned char state = 0;
state = !state;
/*
* GPT的SR寄存器,状态寄存器
bit2: 1 输出比较1发生中断
*/
if(GPT1->SR & (1<<0))
{
led_switch(LED2, state);
}
GPT1->SR |= 1<<0; /* 清除中断标志位 */
}
#endif
