系列文章目录
第一章 DW_TIMER功能及使用流程介绍
文章目录
目录
前言
dw_timer即定时器,在SOC系统中属于常用的模块,目前synopsis工具可以根据需求自动生成RTL代码,具有很强的通用性和移植性。本文主要针对dw_timer进行简单的介绍,包括寄存器配置flow以及使用过程中的一些注意事项。
timer的运行模式可以分为freerun以及user_mode两种,软件根据需求选择其中一种,其中user mode模式下,timer发生中断后会自动load初始配置的TIMER0_LOADCNT,而freerun模式下,每次timer发生中断后,需要软件更新TIMER0_LOADCNT寄存器。
一、使用步骤
举例:假如我们生成的timer为1拖2的timer,即同一个apb接口下面挂载两个timer定时器。当然也可以根据需求,生成1拖N的timer,下文介绍的内容都以1拖2为例子。
注意:本文介绍过程中使用的寄存器定义均严格与DW文档datasheet上保持一致,方便大家查阅分析。详细的寄存器描述这里不再赘述,需要大家自行查阅datasheet上的描述。
1.定义中断服务子程序
int timer_int_handler()
{
rdata = REG32(TIMERS_INTSTATUS);
if((rdata & 0x1) = 0x1){
REG32(TIMER0_EOI);
}
else if((rdata & 0x2) = 0x2){
REG32(TIMER1_EOI);
}
......
}
上述中断服务子程序,主要用于CPU处理中断,当timer计数到目标值后会给CPU上报中断,CPU收到中断后会跳转到中断服务子程序中,在上述服务子程序中,CPU先通过读总timer中断寄存器,根据其信息得知是哪个timer上报的中断,然后通过读其对应的中断状态位来清除当前timer中断。
2.定义main函数
CLK_TIMER_EN; //配置当前timer的时钟使能,根据RTL设计来决定
TIMER_CLK_SEL; //选择timer计数时钟源,根据RTL设计来决定
set_irq_vector(NVIC_NUM_TIMER0,(int)timer_int_handler); //配置中断服务程序
enable_int(NVIC_NUM_TIMER0) //使能CPU中断服务
REG32(TIMER0_CONTROLREG) |= (0x1 << 1); //设置timer运行模式为user mode
REG32(TIMER0_CONTROLREG) &= ~(0x1 << 1); //设置timer运行模式为freerun mode
REG32(TIMER0_CONTROLREG) |= (0x1 << 2); //设置timer内部中断使能
REG32(TIMER0_LOADCNT) = 0xFF ; //设置timer计数值为256
REG32(TIMER0_CONTROLREG) |= (0x1 << 0); //设置timer 使能
总结
1. 首先需要先配置timer模块的时钟enable,打开timer的pclk,否则后续无法配置timer内部寄存器,理论上来说还需要保证timer的复位正常释放掉。
2. 然后配置timer的模式以及目标计数值。
3. 最后一步使能timer,自此timer开始工作,一旦计数达到预设的值就会产生中断。