DW_apb_timers(3)

DW_apb_timers(3)

关于dw_apb_timer控制时钟边界和亚稳态的问题分析

APB接口中的所有寄存器都与pclk同步,每个定时器都有一个单独的时钟输入信号timer_N_clk,它可以与pclk同步或异步。也可以将timer_N_clk连接到pclk以外的时钟,此时必须考虑同步和亚稳态的问题。如果定时器是时钟与pclk异步,则必须确保在禁用定时器时停止时钟。

每个定时器都会产生一个与pclk域同步的内部中断信号。如下图为一个影响两个时钟域之间时钟边界的内部中断信号。
在这里插入图片描述

亚稳态介绍

亚稳态指触发器无法在某个规定的时间段内达到一个可确认(稳定的0或1)的状态。亚稳态既不是0也不是1,既可能为0也可能为1。

亚稳态产生原因: 数字信号跳变,从0—1或1—0,其对应的是电压的变化,这个变化需要一定的时间,如果输入信号刚好在寄存器不能判断的区间(VL—VH),那么输出就不能判断是0还是1,也就是亚稳态。

亚稳态消除的方法:
(1)使用同步器:常用2级或多级FF打拍的方式;
(2)降低系统频率;
(3)避免过快或过于频繁的信号进行跨时钟采样;

定时器内部中断介绍

当定时器计数器从0变为最大值时,在定时器时钟域中产生内部中断信号。内部中断信号在pclk域中进行边沿检测,以设置定时器中断,如下图所示:
在这里插入图片描述
上图中timer_intr信号和timer_intr_flag信号延迟了两个时钟周期,是因为通过例化亚稳态寄存器,在达到定时器最大计数和中断激活之间会出现额外的两个pclk延迟周期。

timer_en信号在定时器时钟域进行边沿检测。当使能信号从0变为1时,定时器计数器将加载当前值寄存器中的值。这保证了定时器在启动时处于已知状态。若禁用定时器计数器,则也会同步禁用pclk域中该定时器计数器的中断。这可以防止由于定时器时钟域中的错误采样而导致的虚假中断。

TimerNControlReg的定时器模式和TimerNLoadCount寄存器在pclk域和定时器时钟域之间都不同步。因此在编程之前或加载计数值之间禁用定时器非常重要,以便在定时器处于非使能(活动)状态时将这些信号的任何信息传达给定时器。无论何时启用定时器,都必须确保这些信号是稳定的。则必须至少遵守以下规则:
(1)首先使用TimerNControlReg禁用定时器,对其定时器模式进行编程,然后设置中断屏蔽。
(2)将定时器计数器值加载到TimerNLoadCount寄存器中。
(3)通过TimerNControlReg使能定时器。

扩展定时器内部中断信号宽度

DW_apb_timers组件支持最高为pclk频率四倍的定时器时钟。如果将timer_N_clk连接到比pclk更快的时钟源,则必须扩展内部中断信号的宽度,以便有足够的时间在pclk域对其进行采样。

通过TIM_PULSE_EXTD_N参数(扩展中断的时钟周期数,其中N在1~8范围内)设置为非零值,可将中断信号的宽度最多扩展到三个timer_N_clk时钟周期。

下图举例说明了相关的pck和timer_N_clk,其中timer_N_clk频率是pclk的2倍,为适应这种情况,将TIM_PULSE_EXTD_N参数设置为1,以便将内部中断信号延长一个timer_N_clk时钟周期。
在这里插入图片描述
下图说明了一个需要亚稳态寄存器的示例,因为pclk独立于timer_N_clk,并
1 < timer_N_clk < pclk的2倍。为适应此种情况,将TIM_PULSE_EXTD_N参数设置为1,以便将内部中断信号延长一个timer_N_clk时钟周期。
在这里插入图片描述

==若需要DW_apb_timers原文档的朋友,可私信 ==
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值