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

📄 timer.c

📁 本代码是采用ARM7TDMI内核的S3C44BOX芯片硬件测试程序
💻 C
字号:
/****************************************************************
 *		  ARMSYS S3C44B0X  PWM Timer TEST						*  
 ****************************************************************
 
  1.2005.4.27::  PWM Timer TEST
 
 ***************************************************************/
 
#include <string.h>
#include "..\target\44b.h"
#include "..\target\44blib.h"
#include "..\target\def.h"
#include "..\inc\timer.h"

void __irq Timer0Done(void);
void __irq Timer1Done(void);
void __irq Timer2Done(void);
void __irq Timer3Done(void);
void __irq Timer4Done(void);
void __irq Timer5Done(void);
void __irq Wdt_Int(void);

/****************************************
 *  PWM Timer TOUT0/1/2/3/4 test	*
 ****************************************/
void Test_Timer(void)
{
	U32 save_E,save_PE;	
    save_E=rPCONE;
    save_PE=rPUPE;
    rPCONE=0xaaa8;	//Tout0/1/2/3/4 Rx0, Tx0
    rPUPE |=0xf8;	//Tout0/1/2/3/4 The full up is disabled

    //Uart_Printf("[定时器0/1/2/3/4/5测试...]  ");
    Uart_Printf("[PWM输出测试...]\n");
    Uart_Printf("MCLK=%dHz TIMER CLK=%dHz\n",MCLK,MCLK/3200);
    Uart_Printf("TCNTBn=1000(PWM频率=%dHz)\n",MCLK/3200000);
    Uart_Printf("按任意键,退出PWM测试模式!!!\n");
	
				// T0/1/2/3/4
    rTCFG0=0x1c8c8c8;	// Prescaler0/1/2=200, Deadzone=1
    rTCFG1=0x33333;		//rTCFG1=0x0;		// Interrupt, Devider=1/16
			// Timer clock = (MCLK/200)/16

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

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

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

    Uart_Getch();   

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


volatile int isWdtInt;

/****************************************
 *	Watch-dog timer test				*
 ****************************************/
void Test_WDTimer(void)
{
    Uart_Printf("[看门狗定时器测试...]\n");

    rINTMSK=~(BIT_GLOBAL|BIT_WDT);
    pISR_WDT=(unsigned)Wdt_Int;
    isWdtInt=0;
	
    rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1<<2);  //  t_watchdog = 1/63/128, interrupt enable
    rWTDAT=8448/4;
    rWTCNT=8448/4;
    rWTCON=rWTCON|(1<<5);   // 1/64/128,interrupt,enable watchdog timer

    while(isWdtInt!=10);	

    rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1);  //   1/64/128, reset enable
    Uart_Printf("\n系统将在2秒后复位!!!\n");
    rWTCNT=8448*2;
    rWTCON=rWTCON|(1<<5);   // 1/64/128,enable watchdog timer 
    while(1);
    rINTMSK=BIT_GLOBAL;
}

void __irq Wdt_Int(void)
{
    rI_ISPC=BIT_WDT;
    Uart_Printf("%d ",++isWdtInt);
}


volatile int 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;

    
    pISR_TIMER0=(int)Timer0Done;
    pISR_TIMER1=(int)Timer1Done;
    pISR_TIMER2=(int)Timer2Done;
    pISR_TIMER3=(int)Timer3Done;
    pISR_TIMER4=(int)Timer4Done;
    pISR_TIMER5=(int)Timer5Done;
    rTCON=0x0;			//all_stop
   	//Uart_Printf("[定时器0/1/2/3/4/5测试...]  ");
    Uart_Printf("[定时器0/1/2/3/4/5 中断测试...]\n");
    
    rTCFG0=0xf0f0f;		//dead zone=0,pre2=0xf,pre1=0xf,pre0=0xf
	//rTCFG1=0x401234;	//all interrupt,mux5=EXTCLK,mux2=1/2,mux3=1/4,mux2=1/8,mux1=1/16,mux0=1/32
    rTCFG1=0x01234;		//all interrupt,mux5=1/2,mux2=1/2,mux3=1/4,mux2=1/8,mux1=1/16,mux0=1/32
    
    rTCNTB0=0xffff;		//(1/(64MHz/15/32))*0xffff=0.48s
    rTCNTB1=0xffff;		//(1/(64MHz/15/16))*0xffff=0.24s
    rTCNTB2=0xffff;		//(1/(64MHz/15/8 ))*0xffff=0.12s
    rTCNTB3=0xffff;		//(1/(64MHz/15/4 ))*0xffff=0.06s
    rTCNTB4=0xffff;		//(1/(64MHz/15/2 ))*0xffff=0.03s
    rTCNTB5=0xffff;		//(1/(64MHz/15/2 ))*0xffff=0.03s
	//rTCNTB5=0xffff;	//(1/(1MHz)*0xffff=0.06s, EXTCLK
	
    rTCON=0x2222202;	//update T5/T4/T3/T2/T1/T0
    rTCON=0x1111101;	//T5/T4/T3/T2/T1=auto reload,T0=one shot,all_start
 	rINTMSK=~(BIT_GLOBAL|BIT_TIMER0|BIT_TIMER1|BIT_TIMER2|BIT_TIMER3|BIT_TIMER4|BIT_TIMER5);  	
   	while(variable0==0);
   	Delay(1);
   	rTCON=0x0;
   	
   	variable0=0;variable1=0;variable2=0;variable3=0;variable4=0;variable5=0;
	rTCFG0=0xf0f0f;		//dead zone=0,pre2=0xf,pre1=0xf,pre0=0xf
	rTCFG1=0x01234;		//all interrupt,mux5=1/2,mux2=1/2,mux3=1/4,mux2=1/8,mux1=1/16,mux0=1/32
    
    rTCNTB0=0xffff;		//(1/(64MHz/15/32))*0xffff=0.48s
    rTCNTB1=0xffff;		//(1/(64MHz/15/16))*0xffff=0.24s
    rTCNTB2=0xffff;		//(1/(64MHz/15/8 ))*0xffff=0.12s
    rTCNTB3=0xffff;		//(1/(64MHz/15/4 ))*0xffff=0.06s
    rTCNTB4=0xffff;		//(1/(64MHz/15/2 ))*0xffff=0.03s
    rTCNTB5=0xffff;		//(1/(64MHz/15/2 ))*0xffff=0.03s
	//rTCNTB5=0xffff;	//(1/(1MHz)*0xffff=0.06s, EXTCLK
	
    rTCON=0x2222202;	//update T5/T4/T3/T2/T1/T0
    rTCON=0x5999901;	//T5/T4/T3/T2/T1=auto reload,T0=one shot,all_start
   
	rINTMSK=~(BIT_GLOBAL|BIT_TIMER0|BIT_TIMER1|BIT_TIMER2|BIT_TIMER3|BIT_TIMER4|BIT_TIMER5);
	
    while(variable0==0);     
	Delay(1);	   		//To compensate timer error(<1 tick period)
    rTCON=0x0;			//all_stop

    if(variable5==16 && variable4==16 && variable3==8 && variable2==4 && variable1==2 && variable0==1)
	Uart_Printf("定时器0/1/2/3/4/5 中断测试 --> 通过!!!\n");
    else
	Uart_Printf("定时器0/1/2/3/4/5 中断测试 --> 失败!!!\n");
	Uart_Printf("定时器0/1/2/3/4/5 默认中断次数分别为:1,2,4,8,16,16\n");
	Uart_Printf("定时器0/1/2/3/4/5 测试中断次数分别为:%d,%d,%d,%d,%d,%d\n",variable0,
				variable1,variable2,variable3,variable4,variable5);
	//Uart_Printf("Timer0-%d(1),Timer1-%d(2),Timer2-%d(4),Timer3-%d(8),Timer4-%d(16),Timer5-%d(16)\n",
    //			variable0,variable1,variable2,variable3,variable4,variable5);
		
    rINTMSK=BIT_GLOBAL;
    Test_Timer();   
}


void __irq Timer0Done(void)
{
    rI_ISPC=BIT_TIMER0;
    variable0++;    
}

void __irq Timer1Done(void)
{
    rI_ISPC=BIT_TIMER1;
    variable1++;   
}

void __irq Timer2Done(void)
{
    rI_ISPC=BIT_TIMER2;
    variable2++;      
}

void __irq Timer3Done(void)
{
    rI_ISPC=BIT_TIMER3;
    variable3++;   
}

void __irq Timer4Done(void)
{
    rI_ISPC=BIT_TIMER4;
    variable4++;        
}

void __irq Timer5Done(void)
{
    rI_ISPC=BIT_TIMER5;
    variable5++;    
}

⌨️ 快捷键说明

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