DW_apb_timers介绍
DW_apb_timers是新思设计的基于APB总线的一个IP
DW_apb_timers框图如下:
DW_apb_timers特性:
1、多达8个可编程定时器;
2、定时器宽度可设:8至32位;
3、支持两种运行模式:free running和user-mode;
4、支持定时器的独立计时;
5、每个中断可配置极性:低电平(下降沿),高电平(上升沿);
6、单个或组合中断输出标志的可配置选项;
7、可配置选项,为每个定时器提供读/写一致性寄存器;
8、可配置选项,包括定时器切换输出,每当定时器计数器重新加载时切换;
9、可配置选项,包含PWM切换输出0%-100%占空比
使用流程:
timer使用较为简单,内部寄存器也很少
设置timer模式为free running或者user-mode,设置中断处理函数,初始化load值,后开启使能timer
根据wclk的大小,(初始load值-当前读取值TimerNCurrentValue)/wclk,就可以得出计时时间
定时器配置:
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)user mode:定时器加载TimerNLoadCount寄存器的当前值。若需要固定的定时中断,使用该模式。通过给TimerNControlReg寄存器位1写“1”来指定该模式。
(2)free running:定时器加载最大值,取决于定时器宽度;
4、使用中断
通过TimerNStatus和TimerNEOI寄存器处理中断以确保中断清除的安全操作。由于HCLK/PCLK的比率,如果pclk执行写操作清除中断,它可以在不知道写入是否发生的情况下继续总线上的另一次传输。因此,通过读操作清除中断会安全的多。
要检测和服务中断,系统时钟必须处于活动状态。timer模块timer_en输出总线用于激活定时器时钟,并确保定时器运行时为组件提供活动系统时钟。
5、清除中断
如果定时器被使能,则中断保持有效,直到通过读取TimerNEOI(单独中断结束寄存器)和TimersEOI(全局中断结束寄存器)之一时将其清除。如果定时器被禁止,定时器中断被清除。可以通过读取TimerNEOI寄存器来清除单个定时器中断。也可以通过读取TimersEOI寄存器或禁用定时器来一次清除所有活动的定时器中断。
6、检查中断状态
通过读取TimerNIntStatus寄存器来查询单个定时器的状态,而无需清除其中断。也可以通过读取全局TimersNIntStatus寄存器来查询所有定时器的中断状态而不清除中断。
7、屏蔽中断
使用TimerNControlReg寄存器屏蔽每个单独的定时器中断。通过给TimenNControlReg寄存器的第2位写“1”来屏蔽一个中断。
如果所有单独的定时器中断都被屏蔽,那么组合中断也要被屏蔽。
8、设置中断极性
通过使用TIM_INTRPT_PLRITY参数将生成的定时器中断的极性配置为高电平有效或低电平有效。除了每个定时器的中断输出的信号之外,还有一个全局中断标志timer_intr_flag,如果任何定时器发生中断,则该标志被断言。该中断标志与其他生成的中断具有相同的极性特征。