【裸机开发】GPT 定时器(一) —— GPT的功能、寄存器解析

后续需要使用 GPT 计数器实现中断以及延时,这里我们需要先了解一下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 定时器的功能

gpt 定时器的主要包含以下三个功能:

  • 计数器
  • 输入捕获(可产生捕获中断)
  • 输出比较(可产生比较中断)------ 注意 GPT 的模式

1、计数器

根据图中路线,可以大致了解配置计数器的顺序:

  • 第一步,选择时钟源,这里我们依然 ipg_clk (66MHz)
  • 第二步,选择分频数(1~4096)

因为计数器是向上计数的,也就是说,每过一个时钟周期就会自增 1。

2、输入捕获

输入捕获(Input Capture,ICR)可以捕获到时钟源产生的上升沿或者下降沿,并产生中断。GPT 定时器有两个输入捕获通道

3、输出比较(GPT的两种工作模式)

输出比较(Output Compare,OCR)包含三个输出通道GPT_COMPARE1~3 ,通道的使用和触发中断的机制都取决于 GPT 的工作模式:

  • Restart Mode: 需要预设 Output Regx ,当计数器的值 == Output Regx时,会产生比较中断(仅适用于GPT_COMPARE1)
  • **Free-Run Mode:**计数器从 0 开始自增,自增到 0xFFFFFFFF 以后溢出,重新从 0 开始计数

二、寄存器解析

1、GPTx_CR

GPT 控制寄存器,可以控制时钟源、输入通道使能、输出通道使能等。下面主要解析后面需要用到的一些位。

**bit 0:**GPT 使能(启动 / 关闭GPT定时器),一般等到配置完其他寄存器再设置该字段。

**bit 1:**设置当定时器启动时的初始值。0 表示从上一次关闭时计数器的值开始计数,1 表示重新从0开始计数。

**bit 8-6:**选择时钟源。我们选择 ipg_clk(66MHz)

**bit 9:**选择 GPT 的工作模式。一般选 Restart Mode。(上面已经介绍了)

**bit 15:**设置软件复位状态。

  • 设为复位状态后,只要还在复位,该位会一直置 1 。除了bit 0、1、2、3、5外,其他位都会被重置为默认值。
  • 复位完毕后,会自动清零,即置 0

补充:

  • IM1~2 设置的是捕获状态,即上升沿还是下降沿捕获
  • OM1~3 设置的是输出状态,即不输出、输出反转等。
cpp 复制代码
寄存器: 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);

2、GPTx_PR

GPT 分频器,可以设置时钟源的分频数。bit 11-0 设置的是分频数(1~4096)

cpp 复制代码
寄存器: GPT1_PR
基地址: 0x2098004
初始化操作:
    // 66 分频
    GPT1_PR &= ~(0xFFF << 0);    // 低 12 bit 清零
    GPT1_PR |= (66 << 0);        // 66 分频

3、GPTx_SR

GPT状态寄存器,是一个可读寄存器,无需设置。主要保存如下内容:

  • 输出比较的中断触发状态 OF1~3
  • 输入捕获的中断触发状态 IF1~2
  • 溢出状态(即计数器的值是否和比较器的值相等 或者 是否计数到 0xFFFFFFFF)
cpp 复制代码
​寄存器: GPT1_SR
基地址: 0x2098008

4、GPTx_IR

GPT 中断寄存器,主要控制输入 / 输出通道的中断使能。上面GPT的工作模式已经设为 Restart Mode,所以我们需要 使能输出比较通道 1。

cpp 复制代码
寄存器: GPT1_IR
基地址: 0x209800C
初始化操作:
    GPT1_IR |= (1 << 0);    // 输出比较通道1 使能

5、GPTx_OCRn

GPT 输出比较寄存器,保存的是比较值,Restart 模式下,当计数器的值 == 比较值时,触发中断。假设延时 10 ms,时钟源为 66 MHz,分频数为 66。

由此可以知道时钟周期为 1/1M,延时10ms对应的比较值 = 1M * 0.01 = 10000

cpp 复制代码
寄存器: GPT1_OCR1
基地址: 0x2098010
初始化操作:
    GPT1_OCR1 |= (10000 << 0);    // 设置通道1 的比较值为10000

6、GPTx_ICRn

GPT 输入捕获寄存器,保存的是当捕获中断触发时,计数器的值。

cpp 复制代码
​寄存器: GPT1_ICR1
基地址: 0x209801C

7、GPTx_CNT

GPT 计数寄存器,保存的是当前时刻计数器的值。

cpp 复制代码
​寄存器: GPT1_CNT
基地址: 0x2098024
相关推荐
幼儿园蛋小黑1 小时前
单片机数码管LED灯独立按键中断定时器综合实战
单片机·嵌入式硬件
SKH.3 小时前
单片机(1)
单片机·嵌入式硬件
llilian_164 小时前
小切口解决大问题:时序校准场景下的标准时间间隔脉冲信号发生器应用方案
功能测试·单片机·嵌入式硬件·51单片机
三块石头1014 小时前
车载ADC避坑:为什么ADC采集值偏低?
经验分享·stm32·单片机·嵌入式硬件·mcu·硬件架构·硬件工程
jianqiang.xue4 小时前
ESP-IDF保姆级入门39|固件安全与安全启动全解:签名校验/Flash加密/防回滚/OTP密钥/知识产权保护,掌握工业级固件安全防护体系
单片机·物联网·esp32
llilian_164 小时前
时间统一系统 高精度时统设备选购避坑指南 授时系统
大数据·网络·人工智能·功能测试·单片机·嵌入式硬件·51单片机
en.en..4 小时前
sizeof与strlen的区别(附UDP网络编程实战坑点)
单片机·嵌入式硬件
糖糖单片机设计5 小时前
基于 STM32 的智能净水器系统
stm32·单片机·嵌入式硬件
zcmodeltech5 小时前
火电厂模型能演示冷态启动和故障处理吗?——基于STM32与Modbus RTU的集控实训控制系统设计
数据结构·stm32·单片机·嵌入式硬件·能源
llilian_165 小时前
标准时间间隔发生器应用解决方案 脉冲发生器 时间测量仪
大数据·网络·人工智能·功能测试·单片机·嵌入式硬件·51单片机