目录
[GPT 计数器操作模式](#GPT 计数器操作模式)
[输出比较:生成 1kHz PWM 波](#输出比较:生成 1kHz PWM 波)
[GPT Memory Map](#GPT Memory Map)
前言:
通用定时器(GPT)是一种功能强大的硬件模块,内置一个32位递增计数器,用于记录时钟脉冲的数量,为定时和计数操作提供核心支持;
GPT具备输入捕获能力,能够检测外部引脚的电平变化(如上升沿、下降沿或双边沿),并在触发时将当前的计数器值自动保存到专用寄存器中,方便后续读取或处理;
GPT支持输出比较功能,用户可以预先设定一个目标数值,当计数器达到该值时,硬件会自动在指定引脚上产生信号(例如电平翻转),可用于生成PWM波形或控制外部设备,此外,这一机制还会触发中断,让软件在中断服务中执行定时任务,比如周期性数据采集或系统调度;
GPT核心特性

- 一个具备时钟源选择功能的 32 位向上计数器,计数范围为(0 ~ 2³²-1),当时钟源选择内部高速时钟,可用于高精度定时,若选则低速时钟(32KHz RTC 时钟)则用于低功耗场景;
- 两个输入捕获通道,每个通道相互独立,每个输入捕获通道对应一个外部引脚,可监测引脚的电平跳变(上升沿 / 下降沿 / 双边沿), 当引脚出现指定边沿时,立即将当前计数器值自动保存到到捕获寄存器,可以用于测量脉冲宽度(捕获上升沿记录
t1
,捕获下降沿记录t2
,脉宽 =t2-t1
)与测量信号周期(连续捕获两个上升沿,周期 =t2-t1
);- 三个输出比较通道,每个通道相互独立,每个通道预设一个比较值,当计数器递增到该值时,触发硬件动作,常见输出模式为电平翻转(匹配时引脚电平翻转一次,用于生成单次脉冲)与 持续 PWM(周期由计数器溢出周期决定,占空比由比较值与周期的比值决定);
- 可配置为在低功耗模式和调试模式下保持工作状态;
- 在捕获事件、比较事件和计数器溢出事件发生时,可生成中断;
- 计数器操作支持重启模式或自由运行模式**;**
GPT 计数器操作模式

重启模式
当通过 GPT 控制寄存器
GPT_CR
配置为重启模式,在重启模式下,对于输出比较通道1,当计数器达到比较值 时 → 计数器会重置 并从0x00000000
重新开始计数;对于输出比较通道2与输出比较通道3,计数器达到其比较值 → 计数器不会重置,继续向上累加;
由于通道 1 的比较事件会强制重置计数器,如果通道 2与通道 3 的比较值 > 通道 1 的比较值 → 计数器会在达到通道 2与通道3 的比较值 之前,先触发通道 1 的比较事件 → 计数器被重置为
0
→ 通道 2/3 的比较事件永远不会触发;
注意事项:当对通道 1 的比较寄存器执行任何写操作时,都会重置 GPT 计数器;假设计数器正在运行,此时修改通道 1 的比较值:
若原比较值
C_old
较大(如0x1000
),新值C_new
较小(如0x0800
),且计数器已超过C_new
(当前计数值CNT > C_new
)→ 若不强制重置,C_new
永远不会触发比较事件(因为计数器只会继续递增到0xffffffff
);强制重置后,计数器从
0
开始,新的C_new
会在下次计数到C_new
时触发事件 → 确保修改比较值后,新的定时逻辑能立即生效,避免逻辑漏洞;
应用场景:通道 1 控制基础周期,通道 2与通道3 实现周期内的子事件;通道 1 设定 "大周期"(1ms),让计数器每 1ms 重启 → 实现固定周期的主任务(数据上传任务);
通道 2与通道3 设定 "大周期内的子时间点"(0.3ms、0.7ms)→ 触发周期内的细分任务(多阶段传感器采集数据、多阶段传感器数据处理);
自由运行模式
当通过 GPT 控制寄存器
GPT_CR
配置为自由模式,在自由运行模式下,当所有 3 个比较通道发生比较事件时,计数器都不会重置,计数器会继续递增计数,直到达到0xFFFFFFFF
,然后回绕(溢出) 到0x00000000
重新开始;
当计数器与通道的比较值相等时,触发该通道的比较事件,三个比较通道(通道 1/2/3)共用一个32 位向上计数器,但是三个比较通道可设置不同的比较值,在同一个时间轴上独立触发事件;
应用场景:多事件并行调度,示例如下:
- 通道 1 比较值
T1
(T1=1000
) → 触发传感器采集任务;- 通道 2 比较值
T2
(T2=3000
) → 触发检查硬件状态任务;- 通道 3 比较值
T3
(T3=5000
) → 触发系统校准任务;
GPT时钟源

- Crystal Oscillator:系统基准时钟,典型频率为24MHz;
- External Clock:外部时钟,无固定频率,可灵活配置;
- Peripheral Clock:系统外设总线时钟,典型频率为66MHz;
- Low Frequency Reference Clock: 低频参考时钟,用于低功耗模式、RTC 实时时钟,典型频率为32.768KHz;
- High Frequency Reference Clock:系统的高频基准时钟;
GPT框图

- Timer Counter 32-bit:32 位向上计数器;
- GPT_CAPTURE1:输入捕获引脚,用于检测外部信号的边沿(上升沿 / 下降沿);
- IM1 (Input Mode/Mask):输入模式控制,配置捕获的边沿类型(上升沿、下降沿、双边沿)或使能 / 屏蔽捕获;
- IF1 (Input Flag):输入捕获标志,当检测到指定边沿时置位,触发将计数器值保存到输入寄存器的机制;
- IF1IE (Input Capture Interrupt Enable):输入捕获中断使能位,置
1
时,捕获事件触发处理器中断;- Timer Input Reg 1 (32-bit):输入捕获寄存器,存储捕获时刻的计数器值;
- Counter Value BUS:用于实时传输当前计数器的计数值,一段连接 32 位定时器计数器,另一端连接 输入捕获寄存器和 输出比较比较器;
- ROV (Roll-Over):计数器溢出标志,当
Timer Counter
从0xFFFFFFFF
回绕到0
时置位;- ROVIE (Roll-Over Interrupt Enable):溢出中断使能位,置
1
时,溢出事件触发处理器中断;- FRR (Free-Run Restart):自由运行模式下的重启控制,决定计数器是否重置;
- Timer Output Reg1 (32-bit):输出比较寄存器,存储预设的比较值;
- cmp (Comparator):比较器,持续对比
Timer Counter
值与Timer Output Reg
值,匹配时触发事件;- OF1 (Output Flag):输出比较标志,比较匹配时置位,触发引脚动作或中断;
- OF1IE (Output Compare Interrupt Enable):输出比较中断使能位,置
1
时,比较事件触发处理器中断;- OM1 (Output Mode):输出模式控制,决定比较匹配时
GPT_COMPARE1
引脚的动作(如电平翻转、置高、置低等);GPT_COMPARE1
:输出比较通道引脚 ;
输入捕获:测量外部信号的高电平脉冲宽度
需求 :测量
GPT_CAPTURE1
引脚上的高电平脉冲宽度,系统时钟经预分频后为1MHz
(计数器每1μs
加1
);
一 配置阶段:
- 选择时钟源为
ipg_clk=66MHz
,设置预分频系数为 66(66MHz / 66 = 1MHz
,计数器每1μs
递增1
);- 配置
IM1
:由于需要测量高电平脉冲宽度,即上升沿开始、下降沿结束,因此选择上升沿和下降沿捕获;- 置位
IF1IE
:使能输入捕获中断,捕获事件触发中断处理;二 捕获上升沿(记录起始时间):
- 外部信号在
GPT_CAPTURE1
引脚产生上升沿,sync
同步后,IM1
触发IF1
;Timer Input Reg 1
锁存当前计数器值(假设为T1 = 1000
);- 若
IF1IE
使能,触发中断,软件记录T1
(起始时间);三 捕获下降沿(记录结束时间):
- 外部信号在
GPT_CAPTURE1
引脚产生下降沿,sync
同步后,IM1
再次触发IF1
;Timer Input Reg 1
锁存当前计数器值(假设为T2 = 1500
);- 触发中断,软件计算脉冲宽度:
T2 - T1 = 500
(计数)→ 对应时间500μs
(因1
计数 =1μs
);
输出比较:生成 1kHz PWM 波
需求 :在
GPT_COMPARE1
引脚生成1kHz
、占空比50%
的 PWM 波;分析: 假设计数器时钟
1MHz
(周期1μs
),则 PWM 周期需1000μs
(1kHz
),占空比50%
即高电平500μs
、低电平500μs
,那么输出比较寄存器的初始值设置为500;
一 配置阶段:
- 选择时钟源为
ipg_clk=66MHz
,设置预分频系数为 66;- 配置
OM1
:比较匹配时GPT_CAPTURE1
引脚电平翻转;- 初始化输出比较寄存器(
Timer Output Reg1
) 为500
;- 置位
OF1IE
:使能输出比较中断,用于更新下一次比较值;二 第一次比较匹配(上升沿):
- 计数器从
0
开始计数,达到500
时,cmp
比较匹配,OF1
置位;OM1
控制GPT_COMPARE1
引脚电平翻转(假设初始为低电平 → 高电平);- 若
OF1IE
使能,触发中断,软件更新Timer Output Reg1
为1000
;三 第二次比较匹配(下降沿):
- 计数器继续计数到
1000
,cmp
再次匹配,OF1
置位。OM1
控制引脚电平翻转(高电平 → 低电平)。- 中断中更新
Timer Output Reg1
为1500
(下一个周期的高电平结束点);四 循环生成 PWM:
- 每次比较匹配时翻转电平,并更新下一次比较值,持续循环 → 生成稳定的
1kHz
、50%
占空比 PWM 波;
GPT模块外部引脚复用与功能映射表

**时钟引脚选取:**首先检查检查是否需要以太网(ENET1)或 UART1 功能,若以太网和 UART1 都不用,任选;若其中一个需启用,选另一个闲置的;然后将选取的引脚复用为GPT 时钟引脚;
输入捕获引脚(
GPT1_CAPTURE1
)选取: 优先选取GPIO1_IO00,由于GPIO1_IO00
是独立 GPIO,复用为捕获功能时不影响其他外设;输出比较引脚(
GPT1_COMPARE1
)选取: 优先选取GPIO1_IO01,由于GPIO1_IO01
是独立 GPIO,复用为比较功能时不影响其他外设;
GPT使用注意事项

若 GPT 定时器被禁用(
EN=0
) ,则 计数器(Main Counter) 和 预分频器(Prescaler Counter) 会冻结当前计数值(停止递增,保持最后一次计数结果),此时,ENMOD
位 决定:当EN
位重新置1
(GPT 再次使能)时,计数器如何恢复计数:
- 若
ENMOD=1
(重置模式):当 GPT 重新使能(EN=1
)时,主计数器和预分频计数器会被强制重置为0
(从头开始计数);- 若
ENMOD=0
(续传模式):当 GPT 重新使能(EN=1
)时,主计数器和预分频计数器会从冻结的计数值继续递增;

硬件复位 :会将所有 GPT 寄存器重置为各自的默认复位值,除输出比较寄存器(OCR1、OCR2、OCR3) 会被置为
0xFFFFFFFF
外,其余寄存器均恢复默认,而输入捕获寄存器复位值会被重置为0x00000000
;
GPT Memory Map

GPT寄存器
GPTx_CR寄存器

***bit[0]:***EN位,定时器使能位, 若配置为
1
表示启用 GPT 计数器,开始计数;若配置为0表示禁用计数器,冻结当前计数值;
bit[1]: ENMOD位,使能模式位,决定禁用后重新使能时的行为,若配置为1
表示重新使能;时,计数器重置为 0,若配置为0表示重新使能时,计数器从冻结值继续递增计数;bit[8:6]: CLKSRC位,**时钟源选择位,**用于配置 GPT 计数器的时钟来源,若配置为000表示无时钟输入,配置为001表示时钟源为ipg_clk,配置为010表示时钟源为ipg_clk_highfreq,配置为011表示时钟源为External Clock,配置为100表示时钟源为ipg_clk_32k,配置为101表示时钟源为ipg_clk_24M;
bit[9]: FRR位,自由运行 / 重启模式选择位 ,若配置为
1
表示自由运行模式,若配置为0表示重启模式;bit[10]: EN_24M位,24MHz 时钟使能;
bit[15]: SWR位,软件复位控制位,写 1 复位 GPT 定时器,复位后自动清0;
***bit[17:16]:***IM1位,输入捕获通道1模式控制位, 用于配置
GPT_CAPTURE1
引脚的哪种跳变方式会触发保存计数器值的动作,若配置为00表示禁用捕获,若配置为01表示仅上升沿触发,若配置为10表示仅下降沿触发,若配置为11表示双边沿触发;***bit[22:20]:***OM1位,输出比较通道 1 的模式控制位, 用于配置比较匹配时
GPT_COMPARE1
引脚的具体动作,若配置为000表示输出断开即比较事件不影响引脚;若配置为001表示翻转输出即比较事件发生时,引脚电平翻转;若配置为010表示清除输出即比较事件发生时,引脚电平配置低电平;若配置为011表示置位输出即比较事件发生时,引脚电平配置高电平;bit[29]: FO1位,强制输出比较位**,** 其作用为手动触发输出比较动作,若配置为1时立即执行
OMn
配置的输出动作,但不置位状态寄存器(GPTX_SR)比较事件标志位(OFn),写1后自动清除;
GPTx_PR寄存器

bit[31:16]: 保留位
bit[15:12]: PRESCALER24M位,当且仅当 时钟源(CLK_SRC)选择 24M 晶体时钟 时生效,对 24MHz 输入时钟分频;
***bit[11:0]:***PRESCALER位,用于对 CLK_SRC 选择的任意时钟源 分频,决定最终输入计数器的时钟频率,其中分频系数 = PRESCALER 值 + 1,如
PRESCALER = 0x001
则分频系数为2
GPTx_SR寄存器

bit[0]: OF1位,输出比较通道 1 标志位,当计数器值匹配
GPT_COMPARE1
的比较值时置1
;
bit[3]: IF1位,输入捕获通道 1 标志位,当GPT_CAPTURE1
引脚检测到配置的边沿跳变时置1
;***bit[5]:***ROV位,计数器溢出标志位,无论计数器处于重启模式还是自由运行模式,只有计数器真正达到
0xFFFFFFFF
时ROV位置1
(当 32 位计数器从0xFFFFFFFF
回绕到0
时置1
;
GPTx_IR寄存器

***bit [0]:***OF1IE位,输出比较通道 1 中断使能 ,
0
表示禁用通道 1 的比较中断(OF1
标志置位不触发中断),1表示启用通道 1 的比较中断(OF1
标志置位时触发中断);***bit [3]:***IF1IE位,输入捕获通道 1 中断使能 ,0 表示禁用通道 1 的捕获中断(
IF1
标志置位不触发中断)1
表示启用通道 1 的捕获中断(IF1
标志置位时触发中断);bit [5]: ROVIE位,计数器溢出中断使能,
0
表示禁用溢出中断(即使ROV
标志置位,也不触发中断),1
表示启用溢出中断(ROV
标志置位时,触发中断);
GPTx_OCR1寄存器

输出比较寄存器 1用于存储 输出比较通道 1(Output Compare Channel 1)的预设比较值 ,当 GPT 的 32 位计数器(
GPT_CNT
)递增到该值时,会触发 输出比较事件;
GPTx_ICR1寄存器

GPTx_ICR1 为只读寄存器,专门用于保存 输入捕获通道 1(Input Capture Channel 1)最后一次捕获事件发生时的计数器值;
GPTx_CNT寄存器

GPT 模块的计数器寄存器GPTx_CNT 用于 存储 GPT 模块 32 位计数器的当前值,读操作实时反映计数器当前值,不影响计数流程,写操作会强制修改计数器值并且打断当前计数流程;