1. 程式人生 > >2440裸機程式——定時器控制LED燈閃爍

2440裸機程式——定時器控制LED燈閃爍

/*********************************************************************************************
* File name:timer.c
* Author:ZXL 
* Description:通過定時器,讓LED燈每0.5秒閃爍一次,蜂鳴器每0.5秒鳴叫一次
* History:2013.5.8
*********************************************************************************************/


#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"




#define LED1_ON   ~(1<<5)
#define LED2_ON   ~(1<<6)
#define LED3_ON   ~(1<<7)
#define LED4_ON   ~(1<<8)


#define LED1_OFF   (1<<5)
#define LED2_OFF   (1<<6)
#define LED3_OFF   (1<<7)
#define LED4_OFF   (1<<8)


void led1_port_init()
{
    rGPBCON &= ~(0x3<<10);  //控制暫存器清零
    rGPBCON |=  (0x1<<10);  //控制暫存器設定為輸出
rGPBDAT |= (LED1_OFF)|(LED2_OFF)|(LED3_OFF)|(LED4_OFF); //LED燈全滅
}


void led1_run()
{
    if(rGPBDAT &(1<<5))        rGPBDAT &=~(1<<5); //LED燈原來是亮 ——> 則滅
    else      rGPBDAT |=(1<<5);//LED燈原來是滅 ——> 則亮
}


void beep_init()
{
rGPBCON &= ~(3<<0);//控制暫存器清零
rGPBCON |= (1<<0);//控制暫存器設定為輸出
}


void beep_run()
{
    if(rGPBDAT &(1<<0))        rGPBDAT &=~(1<<0);   //蜂鳴器鳴叫 ——> 則停止
    else      rGPBDAT |=(1<<0);  //蜂鳴器停止 ——> 則鳴叫
}


void __irq IRQ_Timer0_Handle(void)
{
if(rINTPND==BIT_TIMER0)//如果BIT_TIMER0觸發中斷,則INTPEND暫存器中對應BIT_TIMER0位被置1
     ClearPending(BIT_TIMER0); //清空BIT_TIMER0位中斷
    led1_run(); //LED閃爍
beep_run();  //蜂鳴器鳴叫
}


void timer0_init()
{
  rTCFG0 = 49;              //第一次50分頻 pclk/(49+1)=50M/50=1M
  rTCFG1 = 0x03;            //第二次16分頻=62500HZ=1M/16
  rTCNTB0 = 62500/2;          //TCNTB0[15:0]=計數值  
  rTCMPB0 = 0;
  rTCON |=(1<<1);           //將計數值裝入TCNTB0、TCMPB0
  rTCON =0x09;  //啟動定時器0 並自動過載


  rINTMOD = 0x0;       // 設定為IRQ模式   
  ClearPending(BIT_TIMER0);//清除BIT_TIMER0中斷
  pISR_TIMER0 = (U32)IRQ_Timer0_Handle;//將定時器執行函式對應定時器中斷入口地址
  EnableIrq(BIT_TIMER0); //使能BIT_TIMER0中斷
  Uart_Printf("\n中斷型別INTMSK=0x%x\n",rINTMSK);//顯示CPU將要服務的中斷的內型 1:遮蔽 0:可服務
}