在嵌入式实时系统中,通用定时器(GP Timer)如同精准的"时间指挥官",通过硬件级计时机制为系统提供可靠的时间基准。以TI处理器为例,其GPT模块采用三级流水线结构:时钟源→预分频器→计数器,这种设计在保证精度的同时实现了灵活的时钟调节。
GPT模块的寄存器映射采用统一编址方案,每个定时器实例拥有独立的地址空间。关键寄存器包括:
TTGR (Trigger Register):
c复制// 示例:通过TTGR触发计数器重载
REG_WRITE(GPT1_BASE + 0x030, 0x1); // 写入任意值触发
TWPS (Write-Posted Status Register):
GPT的时钟系统采用分级控制策略:
code复制32KHz OSC → Prescaler (1-128分频) → Counter Clock
↘ L4 Interface Clock
预分频器通过TTGR.PTV字段配置(3bit,支持2^0-2^7分频),这种设计使得同一个定时器既能处理微秒级精度的PWM信号,也能实现长达数小时的超长定时。
硬件设计细节:TWPS寄存器中的W_PEND位实际上是通过跨时钟域同步器(CDC)实现的,每个写操作需要至少2个功能时钟周期才能反映在状态位上。这就是为什么在高速配置时需要轮询TWPS状态。
当配置为定时器模式时,GPT的工作流程如下:
时钟周期计算公式:
code复制T = (2^32 - TLDR) * (Prescaler + 1) / Fclk
例如:当Fclk=32MHz,Prescaler=7(128分频),TLDR=0xFFFF0000时:
code复制T = (2^32 - 0xFFFF0000) * 128 / 32MHz ≈ 16ms
GPT产生PWM的关键在于TMAR(匹配寄存器)和TOCR(溢出计数寄存器)的配合:
c复制// PWM配置示例
void GPT_ConfigPWM(uint32_t base, uint32_t period, uint32_t duty) {
REG_WRITE(base + 0x038, duty); // TMAR设置占空比
REG_WRITE(base + 0x054, period - 1); // TOCR设置周期
REG_SET_BIT(base + 0x024, 1 << 10); // 使能比较模式
}
TCAR1/TCAR2寄存器组构成了捕获模式的双缓冲机制:
这种设计保证了即使在高速信号捕获时(如电机编码器信号),也不会丢失边沿事件。
TI处理器的WDT模块包含三个独立实例:
关键差异点:
| 特性 | WDT1 | WDT2 | WDT3 |
|---|---|---|---|
| 复位源 | POR | 所有 | 所有 |
| 默认超时 | 3min | 10s | 10s |
| 时钟源 | 内部OSC | 32KHz | 32KHz |
正确的喂狗操作需要严格遵循两步序列:
c复制#define WDT_WSPR_DISABLE_SEQ1 0xAAAA
#define WDT_WSPR_DISABLE_SEQ2 0x5555
void WDT_Disable(uint32_t base) {
REG_WRITE(base + 0x048, WDT_WSPR_DISABLE_SEQ1);
REG_WRITE(base + 0x048, WDT_WSPR_DISABLE_SEQ2);
}
硬件约束:两次写入间隔必须大于1.5个功能时钟周期但小于2.5个周期,否则会导致序列失效。这是为了防止软件跑飞时意外禁用看门狗。
WDT的Smart-idle模式通过WD_SYSCONFIG寄存器配置:
code复制IDLEMODE[1:0] = 10 : 智能空闲
CLOCKACTIVITY[9:8] = 01 : 保持功能时钟运行
这种配置使得:
由于TWPS的存在,批量配置寄存器时需要遵循以下原则:
c复制void GPT_OptimizedConfig(uint32_t base) {
while(REG_READ(base + 0x034) & 0x1FF); // 等待所有写完成
REG_WRITE(base + 0x030, 0x7); // 设置预分频
REG_WRITE(base + 0x038, 0xFFFF0000); // 设置周期
while(REG_READ(base + 0x034) & 0x4); // 等待TLDR写入完成
REG_SET_BIT(base + 0x024, 0x1); // 最后使能
}
使用GPT生成互补PWM时,死区时间可通过以下公式计算:
code复制Tdead = (TPIR - TNIR) / Fclk
其中:
设计实例:
需要产生200ns死区时间,Fclk=100MHz:
code复制TPIR - TNIR = 200ns * 100MHz = 20
当系统因看门狗复位时,可通过以下步骤诊断:
经验之谈:在实际项目中,建议将看门狗超时设置为正常任务周期的3-5倍。例如任务周期100ms,则WDT设为300-500ms,这样既能捕获死锁又不至于频繁误触发。
当GPT用于高频中断时(如1MHz采样),需采取以下措施:
c复制// 高频中断优化配置
REG_SET_BIT(GPT1_BASE + 0x040, 1 << 2); // 使能Posted写
DMA_Config(GPT1_TCAR1, BUFFER_ADDR, BURST_SIZE);
NVIC_SetPriority(GPT1_IRQn, 0xF0); // 设置最低优先级
在系统进入睡眠前,必须处理GPT的状态保存:
c复制void GPT_SleepSave(uint32_t base, GPT_Context *ctx) {
ctx->counter = REG_READ(base + 0x028); // 保存TCRR
ctx->status = REG_READ(base + 0x034); // 保存TWPS
REG_SET_BIT(base + 0x040, 1 << 1); // 触发软复位
}
多定时器协同工作时,需特别注意:
校准算法示例:
c复制void GPT_Calibrate(uint32_t master, uint32_t slave) {
REG_WRITE(master + 0x030, 0x1); // 触发主定时器
while(!(REG_READ(slave + 0x034) & 0x8)); // 等待从定时器同步
uint32_t drift = REG_READ(master + 0x028) - REG_READ(slave + 0x028);
REG_WRITE(slave + 0x038, REG_READ(slave + 0x038) + drift); // 补偿偏差
}
通过深入理解这些定时器模块的寄存器级操作和硬件设计原理,开发者可以构建出既精准又可靠的嵌入式时序控制系统。在实际项目中,建议结合芯片参考手册和仿真器调试工具,逐步验证每个配置步骤的效果。