自学内容网 自学内容网

DW_apb_timers 寄存器简介

DW_apb_timers 的寄存器设计清晰明了,主要包括 定时器私有寄存器 和 全局共享寄存器 两大类。理解这些寄存器的功能和编程注意事项,是正确配置和使用该 IP 核的基础。

📝 寄存器概览

下表汇总了 DW_apb_timers 的核心寄存器及其地址偏移。其中,N 代表定时器序号(从 0 开始),基地址 Base + 0xN * 0x14 是每个定时器私有寄存器区域的起始地址。

类别寄存器名称 (Register Name)偏移地址 (Offset)操作描述 (Description)
定时器 N 私有寄存器TimerNLoadCountBase + 0x00读/写加载计数寄存器,用于设定定时器的初始计数值。
TimerNCurrentValueBase + 0x04读/写当前计数值寄存器,反映定时器当前的实时计数值。
TimerNControlRegBase + 0x08读/写控制寄存器,用于配置定时器的使能、模式等。
TimerNEOIBase + 0x0C只读中断结束寄存器,读取该寄存器可清除当前定时器的中断状态。
TimerNIntStatusBase + 0x10只读中断状态寄存器,读取该寄存器可查询当前定时器未经掩码的中断状态。
全局共享寄存器TimersIntStatus0xA0只读全局中断状态寄存器,用于查询所有定时器经过掩码后的中断状态。
TimersEOI0xA4只读全局中断结束寄存器,读取可一次性清除所有定时器的中断状态。
TimersRawIntStatus0xA8只读原始中断状态寄存器,反映所有定时器未经掩码的原始中断状态。
TimersCompVersion0xAC只读组件版本寄存器,用于读取该 IP 核的版本号。

注意:部分资料中提到的 APBTMRS_REG_SIZE 0x14 表示每个定时器的寄存器空间占用大小为 0x14 字节(即 20 字节),这意味着 Timer(N+1)LoadCount 的地址偏移是 Base + 0x14

📖 寄存器详解

1. 加载计数寄存器 (TimerNLoadCount)
  • 作用:设定定时器的初始计数值。定时器将从该值开始递减计数。

  • 加载时机

    • 定时器从禁用 (TimerNControlReg[0] = 0) 变为启用 (TimerNControlReg[0] = 1) 时。

    • 定时器计数递减到 0 时,根据工作模式加载不同值:

      • 自由运行模式 (free running):加载该定时器宽度下所能表示的最大值。

      • 用户自定义模式 (user mode):重新加载 TimerNLoadCount 寄存器的值。

2. 当前计数值寄存器 (TimerNCurrentValue)
  • 作用:读取此寄存器可获得定时器当前的实时计数值。

  • 重要特性:对该寄存器的写操作会立即更新计数器的当前值。

3. 控制寄存器 (TimerNControlReg)

这是配置定时器行为的关键寄存器,其各个位的功能如下:

位 (Bit)名称描述 (Description)
bit 0ENABLE定时器使能位
0:禁用定时器;1:启用定时器。
bit 1MODE工作模式选择位
0:自由运行模式 (free running);1:用户自定义模式 (periodic)。
bit 2INT_MASK中断使能位
0:禁用中断;1:使能中断。
bit 3EXTIN_CLK外部输入时钟使能
1:使用外部输入信号作为定时器时钟源。
bit 4EXTIN_EN外部输入使能信号使能
1:使用外部输入信号作为定时器的使能信号。
4. 中断结束寄存器 (TimerNEOI)
  • 作用:读取此寄存器是清除当前定时器中断的标准方法。

  • 重要特性:该寄存器是只读的,读取操作本身即触发中断清除。

5. 中断状态寄存器 (TimerNIntStatus)
  • 作用:查询当前定时器的原始中断状态,不受控制寄存器中 INT_MASK 位的影响。

  • 重要特性:读取该寄存器不会清除中断状态。

6. 全局共享寄存器
  • TimersIntStatus:所有定时器经过掩码后的中断状态的“或”结果。若所有定时器的中断都被掩码,则此寄存器可能为 0。

  • TimersEOI:一次性清除所有定时器的中断状态,等同于对所有 TimerNEOI 寄存器执行了读取操作。

  • TimersRawIntStatus:所有定时器未经掩码的原始中断状态的“或”结果。

⚠️ 关键编程注意事项

为了确保系统的稳定性和可靠性,在使用这些寄存器时,有几个关键的注意事项需要牢记:

  • 中断清除:推荐通过读取 TimerNEOI 寄存器来清除中断,而非写入操作。这是因为在高速 APB 总线中,使用写操作清除中断可能存在时序风险,导致中断清除不可靠。

  • 处理保留位:在修改任何包含保留位的寄存器时,务必执行 “读-修改-写” (Read-Modify-Write, RMW) 操作,以避免意外更改保留位的状态,从而防止未定义行为。

  • 跨时钟域访问timer_N_clk 可与 pclk 异步。如果它们是异步的,读取 TimerNCurrentValue 寄存器可能会返回未定义的值,需要谨慎处理。

  • 原子操作:当定时器位宽大于 APB 数据总线宽度时,读写操作可能需要拆分为多次总线访问。此时应启用一致性电路,并按 LSB 到 MSB 的顺序进行编程,以保证数据的一致性。

💎 总结

DW_apb_timers 的寄存器结构紧凑且功能明确,核心就是围绕 计数(Load/Current)控制(Control) 和 中断(Status/EOI) 三个维度来操作定时器。理解这些寄存器及其交互方式,并严格遵循中断清除、保留位处理和跨时钟域操作的规范,是成功应用这个 IP 核的关键。


原文地址:https://blog.csdn.net/liuluyang530/article/details/159926651

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!