《嵌入式硬件(十四):基于IMX6ULL的通用目的定时器(GPT)操作》
一、通用目的定时器概念
32位,增定时器

选ipg_clk,66m
引脚电平捕获可以测俩个上升沿之间的时间
二、步骤
使用GPT实现高精度延时
1.设定模式为自由
2.设置时钟为1MHz
3.实现延时
溢出回滚的解决
三、原理
1.CR(控制寄存器)
2.PR(分频寄存器)
3.CNT(计数器寄存器)
四、代码
1.gpt.c
#include "gpt.h"
#include "MCIMX6Y2.h"void int_gpt1(void)
{GPT1->CR = 0;GPT1->CR |= (1 << 15);while((GPT1->CR & (1 << 15)) != 0);GPT1->CR |= (1 << 9) | (1 << 6);GPT1->PR |= 65;GPT1->CR |= (1 << 0);
}
2.gpt.h
#ifndef _GPT_H_
#define _GPT_H_extern void int_gpt1(void);#endif
3.delay.c
#include "delay.h"
#include "MCIMX6Y2.h"void delay(unsigned int n)
{while(n--){}
}void delayus(unsigned int n)
{unsigned int counter = 0;unsigned int new_counter, old_counter;old_counter = GPT1->CNT;while(1){new_counter = GPT1->CNT;if(new_counter != old_counter){if(new_counter > old_counter){counter += new_counter - old_counter; }else{counter += 0xFFFFFFFF - old_counter + new_counter;}if(counter >= n){return;}old_counter = new_counter;}}
}void delayms(unsigned int n)
{while(n--){delayus(1000);}
}
4.delay.h
#ifndef _DELAY_H_
#define _DELAY_H_extern void delay(unsigned int n);
extern void delayus(unsigned int n);
extern void delayms(unsigned int n);#endif
5.main.c
#include "beep.h"
#include "led.h"
#include "key.h"
#include "MCIMX6Y2.h"
#include "core_ca7.h"
#include "gpio.h"
#include "interrupt.h"
#include "clock.h"
#include "epit.h"#include "gpt.h"
#include "delay.h"int main(void)
{init_clock();system_interrupt_init();init_led();init_beep();init_epit();int_gpt1(); while(1){led_nor();delayms(1000);}return 0;
}