⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 《基于s3c44B0X嵌入式uCLinux系统原理及应用》李岩编的ppt
💻 C
字号:
#include <string.h>
#include "..\inc\44b.h"
#include "..\inc\44blib.h"

void  Timer0Done(void);
void  Timer1Done(void);
void  Timer2Done(void);
void  Timer3Done(void);
void  Timer4Done(void);
void  Timer5Done(void);
unsigned char leddata;
unsigned char * ledbuffer = (unsigned char *)led_Address;

/****************************************
 *  PWM Timer TOUT0/1/2/3/4 test	*
 ****************************************/
void Test_Timer(void)
{
    int save_E,save_PE;
    save_E=rPCONE;
    save_PE=rPUPE;
    rPCONE=0xa6a8;	//Tout0/1/2/3/4, RxD0, TxD0
    rPUPE |=0xf8;

    Uart_Printf("[Timer 0,1,2,3,4,5 Test]\n");
    Uart_Printf("Check PWM Output\n");
    Uart_Printf("MCLK=%dHz TIMER CLK=%dHz\n",MCLK,MCLK/4);
    Uart_Printf("TCNTBn=1000(PWM frequency=%dHz)\n",MCLK/4000);
    Uart_Printf("To exit PWM test mode, Press any key!!!\n");

			// T0/1/2/3/4
    rTCFG0=0x1010101;	// Prescaler0/1/2=1, Deadzone=1
    rTCFG1=0x0;		// Interrupt, Devider=1/2
			// Timer clock = (MCLK/1)/2

    rTCNTB0=1000;
    rTCNTB1=1000;
    rTCNTB2=1000;	// Total cont=1000 
    rTCNTB3=1000;
    rTCNTB4=1000;

    rTCMPB0=1000-700;
    rTCMPB1=1000-700;
    rTCMPB2=1000-700;	// L_count:700, H_count:300
    rTCMPB3=1000-700;
    rTCMPB4=1000-700;

    rTCON=0xaaaa0a;	//auto reload, inverter off, manual update, dead zone off
    rTCON=0x999909;	//start PWM operation

    Uart_Getch();   

    rTCON=0x0;		//Stop timer
    
    rPCONE=save_E;
    rPUPE=save_PE;
}

unsigned char variable0,variable1,variable2,variable3,variable4,variable5;

/****************************************
 *  PWM Timer Interrupt0/1/2/3/4/5 test	*
 ****************************************/
void Test_TimerInt(void)
{
    variable0=0;
    variable1=0;
    variable2=0;
    variable3=0;
    variable4=0;
    variable5=0;

    rINTMSK=~(BIT_GLOBAL|BIT_TIMER0|BIT_TIMER1|BIT_TIMER2|BIT_TIMER3|BIT_TIMER4|BIT_TIMER5);
    pISR_TIMER0=(int)Timer0Done;
    pISR_TIMER1=(int)Timer1Done;
    pISR_TIMER2=(int)Timer2Done;
    pISR_TIMER3=(int)Timer3Done;
    pISR_TIMER4=(int)Timer4Done;
    pISR_TIMER5=(int)Timer5Done;

    Uart_Printf("[Timer0/1/2/3/4/5 Interrupt Test]\n");
    Uart_Printf("[8-SEG flash at different speed\n");
    
    *ledbuffer=0xff;
    
    rTCFG0=0xfafafa;	//dead zone=0,pre2=0xfa,pre1=0xfa,pre0=0xfa
    rTCFG1=0x112344;	//all interrupt,mux5=1/4,mux4=1/4,mux3=1/8,mux2=1/16,mux1=1/32,mux0=1/32
    
    rTCNTB0=0x9c40;	//(1/(40MHz/250/32))*0xffff=8s
    rTCNTB1=0x7530;	//(1/(40MHz/250/32))*0xffff=6s
    rTCNTB2=0x9c40;	//(1/(40MHz/250/16 ))*0xffff=4s
    rTCNTB3=0x9c40;	//(1/(40MHz/250/8 ))*0xffff=2s
    rTCNTB4=0x9c40;	//(1/(40MHz/250/4 ))*0xffff=1s
    rTCNTB5=0x9c40;	//(1/(40MHz/250/4 ))*0xffff=1s

    rTCON=0x2222202;	//update T5/T4/T3/T2/T1/T0
    rTCON=0x5999909;	//T5/T4/T3/T2/T1=auto reload,T0=one shot,all_start

    while(!Uart_GetKey());
    rTCON=0x0;	//all_stop
    rINTMSK=(BIT_GLOBAL|BIT_TIMER0|BIT_TIMER1|BIT_TIMER2|BIT_TIMER3|BIT_TIMER4|BIT_TIMER5);
}

void  Timer0Done(void)
{
    rI_ISPC=BIT_TIMER0;			//clear pending_bit
    if(variable0==0)
    {
    	variable0=1;
    	leddata&=0x7f; 
    	*ledbuffer=leddata;}
    else 
    {
    	variable0=0;
    	leddata|=0x80; 
    	*ledbuffer=leddata;}
}

void  Timer1Done(void)
{
    rI_ISPC=BIT_TIMER1;			//clear pending_bit
    if(variable1==0)
    {
    	variable1=1;
    	leddata&=0xbe; 
    	*ledbuffer=leddata;}
    else 
    {
    	variable1=0;
    	leddata|=0x41; 
    	*ledbuffer=leddata;}    
}

void  Timer2Done(void)
{
    rI_ISPC=BIT_TIMER2;			//clear pending_bit
    if(variable2==0)
    {
    	variable2=1;
    	leddata&=0xfd; 
    	*ledbuffer=leddata;}
    else 
    {
    	variable2=0;
    	leddata|=0x2; 
    	*ledbuffer=leddata;}      
}

void  Timer3Done(void)
{
    rI_ISPC=BIT_TIMER3;			//clear pending_bit
    if(variable3==0)
    {
    	variable3=1;
    	leddata&=0xdb; 
    	*ledbuffer=leddata;}
    else 
    {
    	variable3=0;
    	leddata|=0x24; 
    	*ledbuffer=leddata;}       
}

void  Timer4Done(void)
{
    rI_ISPC=BIT_TIMER4;			//clear pending_bit
    if(variable4==0)
    {
    	variable4=1;
    	leddata&=0xf7; 
    	*ledbuffer=leddata;}
    else 
    {
    	variable4=0;
    	leddata|=0x8; 
    	*ledbuffer=leddata;}       
}

void  Timer5Done(void)
{
    rI_ISPC=BIT_TIMER5;			//clear pending_bit
    if(variable5==0)
    {
    	variable5=1;
    	leddata&=0xef; 
    	*ledbuffer=leddata;}
    else
    {
    	variable5=0;
    	leddata|=0x10; 
    	*ledbuffer=leddata;}       
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -