后续需要使用 GPT 计数器实现中断以及延时,这里我们需要先了解一下GPT的功能以及相关寄存器。
目录
一、GPT 定时器的功能
1、计数器
2、输入捕获
3、输出比较(GPT的两种工作模式)
二、寄存器解析
1、GPTx_CR
2、GPTx_PR
3、GPTx_SR
4、GPTx_IR
5、GPTx_OCRn
6、GPTx_ICRn
7、GPTx_CNT
gpt 定时器的主要包含以下三个功能:
根据图中路线,可以大致了解配置计数器的顺序:
因为计数器是向上计数的,也就是说,每过一个时钟周期就会自增 1。
输入捕获(Input Capture,ICR)可以捕获到时钟源产生的上升沿或者下降沿,并产生中断。GPT 定时器有两个输入捕获通道
输出比较(Output Compare,OCR)包含三个输出通道GPT_COMPARE1~3 ,通道的使用和触发中断的机制都取决于 GPT 的工作模式:
GPT 控制寄存器,可以控制时钟源、输入通道使能、输出通道使能等。下面主要解析后面需要用到的一些位。
bit 0:GPT 使能(启动 / 关闭GPT定时器),一般等到配置完其他寄存器再设置该字段。
bit 1:设置当定时器启动时的初始值。0 表示从上一次关闭时计数器的值开始计数,1 表示重新从0开始计数。
bit 8-6:选择时钟源。我们选择 ipg_clk(66MHz)
bit 9:选择 GPT 的工作模式。一般选 Restart Mode。(上面已经介绍了)
bit 15:设置软件复位状态。
补充:
寄存器: GPT1_CR
基地址: 0x2098000
初始化操作:
// 禁用GPT定时器
GPT1_CR &= ~(1 << 0);
// 复位
GPT1_CR |= (1 << 15);
while((GPT1_CR >> 15) & 0x1); // 等待复位结束
/*
* 配置GPT定时器
* bit 1: 1
* bit 8-6: 001
* bit 9: 0
*/
GPT1_CR |= (1 << 1);
GPT1_CR &= ~((7 << 6) | (1 << 9));
GPT1_CR |= (1 << 6);
// ... 其他初始化操作
// 启动定时器
GPT1_CR |= (1 << 0);
GPT 分频器,可以设置时钟源的分频数。bit 11-0 设置的是分频数(1~4096)
寄存器: GPT1_PR
基地址: 0x2098004
初始化操作:
// 66 分频
GPT1_PR &= ~(0xFFF << 0); // 低 12 bit 清零
GPT1_PR |= (66 << 0); // 66 分频
GPT状态寄存器,是一个可读寄存器,无需设置。主要保存如下内容:
寄存器: GPT1_SR
基地址: 0x2098008
GPT 中断寄存器,主要控制输入 / 输出通道的中断使能。上面GPT的工作模式已经设为 Restart Mode,所以我们需要 使能输出比较通道 1。
寄存器: GPT1_IR
基地址: 0x209800C
初始化操作:
GPT1_IR |= (1 << 0); // 输出比较通道1 使能
GPT 输出比较寄存器,保存的是比较值,Restart 模式下,当计数器的值 == 比较值时,触发中断。假设延时 10 ms,时钟源为 66 MHz,分频数为 66。
由此可以知道时钟周期为 1/1M,延时10ms对应的比较值 = 1M * 0.01 = 10000
寄存器: GPT1_OCR1
基地址: 0x2098010
初始化操作:
GPT1_OCR1 |= (10000 << 0); // 设置通道1 的比较值为10000
GPT 输入捕获寄存器,保存的是当捕获中断触发时,计数器的值。
寄存器: GPT1_ICR1
基地址: 0x209801C
GPT 计数寄存器,保存的是当前时刻计数器的值。
寄存器: GPT1_CNT
基地址: 0x2098024