本帖最后由 ddllxxrr 于 2011-10-13 21:11 编辑
NUC1xx系列的定时器模块包含4组定时器,TIMER0~TIMER3(TIMER0,TIMER1在APB1,TIMER2,TIMER3在APB2)
·每组定时器有独立的时钟源(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
计数器重置位
对该位操作,将会重置定时器计数器和预分频器的值,同时强制CEN位0。
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)
|