mini2440裸机程序--定时器中断

定时器内部控制逻辑的流程如下:

1、程序初始,设定TCMPBn、TCNTBn这两个寄存器。他们表示定时器N的比较值和初始计数值。
2、随之设置TCON寄存器启动定时器N,这时TCMPBn,TCNTBn的值将被装入其内部的寄存器TCMPn,TCNTn中,在定时器N的工作频率下,TCNTN 开始减一计数,其值可以通过读取TCNTOn寄存器得知。
3、当TCNTn的值等于TCMPN的值时,定时器N的输出管脚TOUTN反转;TCNTN继续减一计数,当TCNTN的值到达0时,其管脚TOUTN再次反转,并触发定时器N的中断。
4、当TCNTn的值到达0时,如果在TCON寄存器中将定时器N设为 自动加载 ,则TCMPBn 和 TCNTBn寄存器的值被自动装入TCMPn 和TCNTn寄存器中,下一个计数流程开始。
程序如下:(参考了其他人的)
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "def.h"
#include "Option.h"
#define U32 unsigned int
void __irq Timer4_ISR(void)
{
       static int count;
       count ++;
       rSRCPND = rSRCPND | (0x1<<14);//定时器4 清零
       rINTPND = rINTPND | (0x1<<14);//清中断
       //每隔2秒蜂鸣器响一次,持续时间为0.5秒,并伴随着LED亮
       if (count % 4 ==0)
              rGPBDAT = ~0x1ee;            //蜂鸣器响,LED亮
       else if (count % 4 ==1)
              rGPBDAT = 0x1ee;      //蜂鸣器不响,LED灭
}
 
 
void Main(void)
{       
 
  MMU_Init();
 
       rGPBCON = 0x155555;               //B0输出,给蜂鸣器;B5~B8输出,给LED
       rGPBUP  = 0x7ff;
      
       rGPBDAT = 0x1e0;      //蜂鸣器不响,LED灭
      
       
       rINTMSK = ~(0x1<<14);            //打开定时器4中断
         
       rTCFG0 &= 0xFF00FF;      
       rTCFG0 |= 0xf900;        // prescaler等于249
       
       rTCFG1 &= ~0xF0000;   
       rTCFG1 |= 0x20000;     //divider等于8,则设置定时器4的时钟频率为25kHz
       rTCNTB4 = 12500;              //让定时器4每隔0.5秒中断一次
      
       rTCON &= ~0xF00000;
       rTCON |= 0x700000;
       rTCON &= ~0x200000 ;              //定时器4开始工作
      
          
       pISR_TIMER4 = (U32)Timer4_ISR;
     
       while(1); 
}

posted on 2013-03-16 21:29  AI_JJ  阅读(162)  评论(0)    收藏  举报

导航