DW_apb_timers 寄存器简介

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

📝 寄存器概览

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

类别 寄存器名称 (Register Name) 偏移地址 (Offset) 操作 描述 (Description)
定时器 N 私有寄存器 TimerNLoadCount Base + 0x00 读/写 加载计数寄存器,用于设定定时器的初始计数值。
TimerNCurrentValue Base + 0x04 读/写 当前计数值寄存器,反映定时器当前的实时计数值。
TimerNControlReg Base + 0x08 读/写 控制寄存器,用于配置定时器的使能、模式等。
TimerNEOI Base + 0x0C 只读 中断结束寄存器,读取该寄存器可清除当前定时器的中断状态。
TimerNIntStatus Base + 0x10 只读 中断状态寄存器,读取该寄存器可查询当前定时器未经掩码的中断状态。
全局共享寄存器 TimersIntStatus 0xA0 只读 全局中断状态寄存器,用于查询所有定时器经过掩码后的中断状态。
TimersEOI 0xA4 只读 全局中断结束寄存器,读取可一次性清除所有定时器的中断状态。
TimersRawIntStatus 0xA8 只读 原始中断状态寄存器,反映所有定时器未经掩码的原始中断状态。
TimersCompVersion 0xAC 只读 组件版本寄存器,用于读取该 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 0 ENABLE 定时器使能位0:禁用定时器;1:启用定时器。
bit 1 MODE 工作模式选择位0:自由运行模式 (free running);1:用户自定义模式 (periodic)。
bit 2 INT_MASK 中断使能位0:禁用中断;1:使能中断。
bit 3 EXTIN_CLK 外部输入时钟使能1:使用外部输入信号作为定时器时钟源。
bit 4 EXTIN_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 核的关键。

相关推荐
零涂毕业设计1 小时前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
阿龙的工作记录2 小时前
深入理解Linux设备驱动模型
linux·嵌入式硬件·工作记录
ye150127774552 小时前
220V转5V1A隔离芯片WT5602
单片机·嵌入式硬件·其他·硬件工程
武汉万象奥科3 小时前
AGV导航控制器方案 | 基于HD-RK3576系列核心板的算控融合一体化平台
arm开发·嵌入式硬件·arm核心板·单板机
ye150127774554 小时前
DC24V-100V转3.3V500mA隔离芯片WT5602
单片机·嵌入式硬件·其他·硬件工程
Lumos6fly4 小时前
51单片机从零到实战(15)——数字时钟温度计
单片机·嵌入式硬件·51单片机
gwf2164 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
zlinear数据采集卡5 小时前
从“脏信号”到“纳伏级纯净”:硬核拆解DABL7606的多级抗混叠滤波与24位过采样算法
arm开发·科技·嵌入式硬件·fpga开发·开源
放学校门口见6 小时前
vscode部署stm32开发调试环境
ide·vscode·stm32
碎光拾影8 小时前
I2C总线通信全解析:从原理到实战
单片机·嵌入式硬件