ARM TIMER 使用 控制 详解

来源:互联网 发布:eclipse 关联源码 编辑:程序博客网 时间:2024/06/05 20:19

转帖网址:http://blog.chinaunix.net/u2/78572/showart_1212304.html

LPS ARM 21XX/22XX 系列得芯片内部都集成了两个时钟 TIMER0, TIMER1
 
这两个时钟除了外设基地址不同,别得都是相同得 包括控制和使用
 
作用:
 
    顾名思意 他们得主要作用就是用来计时合计数的   每个TIMER有4个捕获通道和4个匹配寄存器
 
寄存器介绍:
   
    IR   中断寄存器
    TCR  定时器控制寄存器
    TC   定时器控制器
    PR   预分频
    MR0~MR3    匹配寄存器
    MCR  匹配控制寄存器
 
    CR0~CR3  捕获寄存器
 
    CCR     捕获控制寄存器
   EMR   外部匹配寄存器
 
 
 
  定时器计数时钟频率计算如下:
     计数时钟频率=Fpclk/N+1
 
      N 为PR得值
 
下面是一个TIMER0得初始化(对于详细设置参阅数据手册)
 
void Timer0Init(void)
{
    T0TC = 0;                  //定时器设置为0
    T0PR = 0;                 //不分频采用pclk
    TOMCR = 0X03;            //设置当MR0 = TC 是产生中断并却复位tc
    T0MR0 = Fpclk/10;          //设置匹配值
    T0TCR = 0X01;           //启动定时器
}
 
 
2、用定时器进行脉宽测量
 
   T0TC = 0;
   TOPR = 0;
   while( (IO0PIN & 0X00000001)!= 0);//等待P0变为低电平
   T0TCR = 0X01;
   while( (IO0PIN & 0X00000001)== 0);//等待p0变为高电平
   T0TCR = 0X00;
   time = T0TC;
 
 
3、一个定时器和中断
//使用GCC编译器时对一个中断服务程序得声明
void tc0 (void) __attribute__ ((interrupt));    // Generate Interrupt
void init_timer (void) {
    T0MR0 = 149999;                        
    T0MCR = 3;                             
    T0TCR = 1;                            
    //VICIntSelect = 0x00000000;          可省 因为默认都是IRQ    
    VICVectAddr0 = (unsigned long)tc0;     //中断服务子程序地址  
    VICVectCntl0 = 0x20 | 0x04;             //分配中断源编号 使能IRQ 中断    
    VICIntEnable = 0x00000010;            //使能timer0中断        
}
 
void tc0(void)
{
     /*  * *  * */
}