2440裸機程式——定時器控制LED燈閃爍
阿新 • • 發佈:2019-02-11
/*********************************************************************************************
* 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:可服務
}
* 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:可服務
}