DW_APB_timers(1)

DW_apb_timers

DW_apb_timers是一个可编程定时器外设,符合ABMA2.0总线协议。

一般使用DesignWare ConnectcoreConsultant来配置DW_apb_timers组件。若构建DesignWare AMBA子系统,则使用Connect工具;若自行配置、合成和模拟DW_apb_timers组件,则使用coreConsultant工具。

DW_apb_timers框图:
在这里插入图片描述
DW_apb_timers基本特征:
(1)多达8个可编程定时器;
(2)定时器宽度可设:8至32位;
(3)支持两种运行模式:自由运行和自定义运行;
(4)支持定时器的独立计时;
(5)每个中断可配置极性:低电平(下降沿),高电平(上升沿);
(6)单个或组合中断输出标志的可配置选项;
(7)可配置选项,为每个定时器提供读/写一致性寄存器;
(8)可配置选项,包括定时器切换输出,每当定时器计数器重新加载时切换;

*功能描述:

*1.总体概述:

 定时器从编程值开始计时,当计数达到零时产生中断。使用TIM_INTR_IO参数创建单个组合中断,该中断在任何单个定时器中断激活时都处于激活状态。

每个定时器都有一个独立的时钟输入,即timer_N_clk(N在1~8的范围),其可连接到pclk(可称为系统时钟或APB时钟)或外部时钟源。使用TIMER_WIDRHY参数(timer N的宽度)将计时器的宽度从8位配置为32位,其中N在1到NUM_TIMERS(实例化计数器的数量)的范围内。
  
  每个计数器的初始值(即倒计时的值)使用适当的加载计数寄存器(TimerNLoadCount)加载到定时器中。两个事件会导致定时器从TimerALoadCount寄存器加载初始计数:
 (1)定时器在复位或禁用后启用;
(2)定时器倒计时至0;

*2.使用流程:

  1. 初始化(通过TimerNConttolReg寄存器初始化定时器,N在1~8范围内)
    (1)通过向定时器使能位写“0”来禁用定时器,即timer_en输出信号被置为低电平
    (2)通过向定时器模式位写“0”或“1”来确定定时器模式(自由运行和自定义运行)
    (3)通过向定时器中断屏蔽位写“0”或“1”设置中断屏蔽或不屏蔽
  2. 将定时器计数器值加载到TimerNLoadCount寄存器中(N在1~8范围内)
  3. 通过给TimerNControlReg寄存器使能位写“1”来启动定时器

*3.定时器配置:

  1. 选择定时器数量(最多有8个定时器)
    每个定时器的有5个单独的寄存器,加载计数寄存器(TimerNLoadCount)、当前值计数器(TimerNCurrentValue)、控制寄存器(TimerNControlReg)、中断结束寄存器(TimerNEOI)、中断状态寄存器(TimerNIntStatus)

  2. 启用和禁用定时器
    当定时器启用并运行时,其计数器在时钟信号timer_N_clk的每个上升沿递减。当定时器从禁用转换为启用时,其TimerNLoadCount寄存器的当前值在timer_N_clk的下一个上升沿加载到定时器计数器。

    当定时器使能位被置低并停止运行时,定时器计数器和定时器时钟域中的任何相关寄存器,如切换寄存器,被异步复位。

    当定时器使能位被置位时,初始值在tiemer_en信号的上升沿被加载到定时器计数器中。当定时器未使能时,总是回读“0”;否则,定时器的当前值(TimerNCurrentValue寄存器)被读回。

  3. 配置定时器位宽
    通过配置Timer_WIDTH_N寄存器的参数配置宽度,每个定时器宽度范围为:8~32位。如果APB数据总线的宽度小于定时器的宽度(APB总线位宽可以是8、16、32位),则必须有多个APB写访问才能加载数据。

  4. 加载计数器倒计时值
    使用加载计数寄存器(TimerNLoadCount)将初始值加载到定时器中,两个事件会导致定时器从TimerALoadCount寄存器加载初始计数:
    (1)定时器在复位或禁用后启用;
    (2)定时器倒计时至0;

    当定时器倒计时至0时,会加载两个值之一,具体取决于定时器的操作模式:
    (1)用户自定义计数模式:定时器加载TimerNLoadCount寄存器的当前值。若需要固定的定时中断,使用该模式。通过给TimerNControlReg寄存器位1写“1”来指定该模式。
    (2)自由运行模式:定时器加载最大值,取决于定时器宽度;

  5. 使用中断
    通过TimerNStatus和TimerNEOI寄存器处理中断以确保中断清除的安全操作。由于HCLK/PCLK的比率,如果pclk执行写操作清除中断,它可以在不知道写入是否发生的情况下继续总线上的另一次传输。因此,通过读操作清除中断会安全的多。

    要检测和服务中断,系统时钟必须处于活动状态。timer模块timer_en输出总线用于激活定时器时钟,并确保定时器运行时为组件提供活动系统时钟。

  6. 清除中断
    如果定时器被使能,则中断保持有效,直到通过读取TimerNEOI(单独中断结束寄存器)和TimersEOI(全局中断结束寄存器)之一时将其清除。如果定时器被禁止,定时器中断被清除。可以通过读取TimerNEOI寄存器来清除单个定时器中断。也可以通过读取TimersEOI寄存器或禁用定时器来一次清除所有活动的定时器中断。

  7. 检查中断状态
    通过读取TimerNIntStatus寄存器来查询单个定时器的状态,而无需清除其中断。也可以通过读取全局TimersNIntStatus寄存器来查询所有定时器的中断状态而不清除中断。

  8. 屏蔽中断
    使用TimerNControlReg寄存器屏蔽每个单独的定时器中断。通过给TimenNControlReg寄存器的第2位写“1”来屏蔽一个中断。
    如果所有单独的定时器中断都被屏蔽,那么组合中断也要被屏蔽。

  9. 设置中断极性
    通过使用TIM_INTRPT_PLRITY参数将生成的定时器中断的极性配置为高电平有效或低电平有效。除了每个定时器的中断输出的信号之外,还有一个全局中断标志timer_intr_flag,如果任何定时器发生中断,则该标志被断言。该中断标志与其他生成的中断具有相同的极性特征。

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

  • 6
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值