本节介绍另外一个定时器,GPT定时器。通过GPT定时led灯的亮灭,可以输出到示波器上观察精度。
一、GPT定时器
GPT(General Purpose Timer)定时器和EPIT相比,GPT功能更加强大,有俩个捕获通道,三个输出比较通道,可以生成捕获中断,比较中断,和溢出中断。GPT定时器是向上计数的。
GTP有俩种运行模式:
1.restart模式:GPT1_CR[9] = 0。只适合与通道一。向上计数到比较事件发生,清零,重新计数。我们使用restart模式。
2.free-run模式:GPT1_CR[9] = 1。适合所有通道。即是比较事件发生,依旧向上继续计数。
GPT1_CR寄存器具体的设置:
1.GPT1_CR[15]=1软复位。
2.GPT1_CR[10]=0 不使用24M时钟。
3.GPT1_CR[9] = 0。使用restart模式。
4.GPT1_CR[8:6] = 001 使用ipg_clk时钟。66M。
5.GPT1_CR[0]=1。时钟使能位。
GPT1_PR寄存器具体的设置:
1.GPT1_PR[11:0]=000~fff。代表1到4096分频。我们设置为66分频,即0x41。
GPT1_OCR1寄存器具体的设置:
1.用于设置通道1的比较寄存器的值的。当定时器累加到这个数时,就会产生比较中断。本例程中我们不使用输出比较中断,所以将其设置为最大。
GPT1_CNT:只读寄存器,用于记录当前的计数值。
二、代码实现
1.高精度延时的原理
我们使用的是66M的时钟,使用的是66的分频,所以每秒1M个计数,通过统计GPT1_CNT计数的个数就可以知道延时的时间的长短。
2.具体代码
#include "bsp_delay.h"
void delay_short(volatile unsigned int n){
while (n--) {
}
}
//大约n ms的延时
void delay(int n){
while (n--){
delay_short(0x7ff)