打印
[新手园地]

ddllxxrr笔记十一:定时器

[复制链接]
1894|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ddllxxrr|  楼主 | 2011-10-13 21:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ddllxxrr 于 2011-10-13 21:11 编辑

NUC1xx系列的定时器模块包含4组定时器,TIMER0TIMER3TIMER0,TIMER1APB1,TIMER2,TIMER3APB2
·每组定时器有独立的时钟源(TMR0_CLK, TMR1_CLK, TMR2_CLK, TMR3_CLK)


·时间溢出间隔=(输入时钟周期)*(8位预分频器+1)*(24位比较寄存器(TCMP))

·时钟频率为25Mhz时的最大计时周期=(1/25)*(2^8)*(2^24)=171.8秒


·内部24位递增计数器的值可以通过数据寄存器(TDR)读出
·支持4种工作模式:单次触发模式,周期模式,连续计数模式


每个定时器都有四个寄存器:
TIMER0的寄存器:
TCSR0
TCMPR0
TISR0
TDR0
TIMER1的寄存器:
TCSR1
TCMPR1
TISR1
TDR1
TIMER2的寄存器:
TCSR2
TCMPR2
TISR2
TDR2
TIMER3的寄存器:
TCSR3
TCMPR3
TISR3
TDR3

每个寄存器用途如下:
一、TCSR
定时器控制及状态寄存器
30位】 CEN
计数器使能位
0 = 停止/暂停计数
1 = 开始计数
【29位】 IE
中断使能位
0 = 禁止定时器中断.
1 = 使能定时器中断.
28-27位】 MODE选择
定时器工作模式
00
定时器工作在单次触发模式. 当中断使能时,一旦定时器计数器的值(24位递增计数器)等于比较寄存器(TCMPR)的值,就会触发定时器中断,定时器中断只会触发一次并且CEN会被硬件自动清零。
01
定时器工作在周期模式.。当中断使能时,一旦定时器计数器的值(24位递增计数器)等于比较寄存器(TCMPR)的值,就会触发定时器中断。
10
保留
11
定时器工作在连续计数模式。当中断使能时,一旦定时器计数器的值(24位递增计数器)等于比较寄存器(TCMPR)的值,就会触发定时器中断,24位递增计数器会继续计
【26位】 CRST
计数器重置位
对该位操作,将会重置定时器计数器和预分频器的值,同时强制CEN0
0 = 无动作
1 = 重置定时器预分频器、内部24位递增计数器和CEN位。
25位】CACT
定时器工作状态位(只读)
该位表示定时器的工作状态.
0 = 定时器不在工作.
1 = 定时器在工作.
16位】TDR_EN
数据锁存使能位
该位置位时, 4个定时器时钟周期,24位递增计数器的数据将被更新到TDR (定时器数据寄存器)
1 = 定时器数据寄存器更新使能.
0 =定时器数据寄存器更新禁止.
7-0位】PRESCALE预分频器
定时器时钟输入到计数器前被这个预分频器分频(1/(Prescale+1). 如果Prescale=0, 时钟不做分频.
二、TCMP定时器比较寄存器
定时器作比较的值
24-0位】TCMP 是一个24位的比较寄存器。当内部的24位递增计数器开始计数,并且计数值等于TCMP的值时,如果中断使能,定时器中断将会产生。
三、TISR定时器状态寄存器
定时器中断标志
0位】该位表明定时器中断状态.
当内部24位递增计数器的值与比较寄存器的值相等时,TIF位由硬件置位,由软件写1到该位去清除该位。
四、TDR定时器数据寄存器
定时器数据寄存器
当定时器控制及状态寄存器(TCSR)的TDR_EN 位被设置为1, 内部24位递增计数器的值将会被锁存到定时器数据寄存器(TDR)。用户可以通过读这个寄存器来获得内部24位递增计数器的值。
本人编制的TIMER测试程序是这样,开始LED灯都亮。这时定时器开始记数,然后过5秒钟,LED全灭。
若再想开始,按复位键。

/* Step 1. Enable and Select Timer clock source */         
SYSCLK->CLKSEL1.TMR0_S = 4; //Select 22Mhz for Timer0 clock source
    SYSCLK->APBCLK.TMR0_EN =1; //Enable Timer0 clock source

/* Step 2. Select Operation mode */
TIMER0->TCSR.MODE=1;  //定时器工作在周期模式.当中断使能时,
//一旦定时器计数器的值(24位递增计数器)等于比较寄存器(TCMPR)的值,
//就会触发定时器中断。

/* Step 3. Select Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*/
TIMER0->TCSR.PRESCALE=0; // Set Prescale [0~255]
TIMER0->TCMPR= 2765;//TICR = 2765;  // Set TICR(TCMP) [0~16777215]
        // (1/22118400)*(0+1)*(2765)= 125.01usec or 7999.42Hz

/* Step 4. Enable interrupt */
TIMER0->TCSR.IE = 1;
TIMER0->TISR.TIF = 1;  //Write 1 to clear for safty  
NVIC_EnableIRQ(TMR0_IRQn); //Enable Timer0 Interrupt

/* Step 5. Enable Timer module */
TIMER0->TCSR.CRST = 1;  //Reset up counter
TIMER0->TCSR.CEN = 1;  //Enable Timer0



程序打包:
NUC testtimer.rar (2.24 MB)




相关帖子

沙发
ddllxxrr|  楼主 | 2011-10-13 21:10 | 只看该作者
代码有限制,程序贴不全,完整的在打包里

使用特权

评论回复
板凳
lixiaoxu2meng| | 2011-10-14 08:47 | 只看该作者
顶:victory:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2398

主题

6945

帖子

66

粉丝