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

📄 timer.c.bak

📁 Dignostic test program for SMDK441f board chip peripellel. ADS1.2 compiler
💻 BAK
字号:
#include "def.h"
#include "option.h"
#include <string.h>
#include "k44.h"
#include "k44lib.h"
#include "etcs.h"

volatile int tmcCnt0,tmcCnt1,tmcCnt2,tmcCnt3,tmcCnt4,tmcCnt5;
volatile int tmcVal0,tmcVal1,tmcVal2,tmcVal3,tmcVal4,tmcVal5;
volatile int tovfCnt0,tovfCnt1,tovfCnt2,tovfCnt3,tovfCnt4,tovfCnt5;

volatile int trerror,trtotal;

/*
#define RDTNCNT(n) \
	U32 RdT##n##CNT(void)\
	{\
	    unsigned t0,t1;\
	    rT##n##CNT;\
    	    while(1)\
    	    {\
            	t0=rT##n##CNT;\
 	    	t1=rT##n##CNT;\
		trtotal++;\
    	    	if(t0==t1)return t1;\
		if((t0+1)==t1)return t1;\
		if(t0==99 && t1==0)return t1;\
		trerror++;\
            }\
	}
*/

#define RDTNCNT(n) \
	U32 RdT##n##CNT(void)\
	{\
	    unsigned t0,t1;\
	    rT##n##CNT;\
    	    while(1)\
    	    {\
            	t0=rT##n##CNT;\
 	    	t1=rT##n##CNT;\
    	    	if(t0==t1)return t1;\
		if((t0+1)==t1)return t1;\
            }\
	}

RDTNCNT(0) //void RdT0CNT(void){...}
RDTNCNT(1) //void RdT1CNT(void){...}
RDTNCNT(2) //void RdT2CNT(void){...}
RDTNCNT(3) //void RdT3CNT(void){...} 
RDTNCNT(4) //void RdT4CNT(void){...}
RDTNCNT(5) //void RdT5CNT(void){...}


void __irq IsrT0MCLed(void)
{
    rINTPEND=~BIT_T0MC;  
    tmcVal0=RdT0CNT();
    Led_Display(tmcCnt0++);
}


void __irq IsrT0MC(void)
{
    rINTPEND=~BIT_T0MC;  
    tmcVal0=RdT1CNT();
}


void __irq IsrT1MC(void)
{
    rINTPEND=~BIT_T1MC;  
    tmcVal1=RdT2CNT();
    tmcCnt1++;
}

void __irq IsrT2MC(void)
{
    rINTPEND=~BIT_T2MC;  
    tmcVal2=RdT3CNT();
    tmcCnt2++;
}

void __irq IsrT3MC(void)
{
    rINTPEND=~BIT_T3MC;  
    tmcVal3=RdT4CNT();
    tmcCnt3++;
}

void __irq IsrT4MC(void)
{
    rINTPEND=~BIT_T4MC;  
    tmcVal4=RdT4CNT();
    tmcCnt4++;
}

void __irq IsrT5MC(void)
{
    rINTPEND=~BIT_T5MC;  
    tmcVal5=RdT5CNT();
    tmcCnt5++;
}


void __irq IsrT0OVF(void)
{
    rINTPEND=~BIT_T0OVF;  
    tovfCnt0++;
}

void __irq IsrT1OVF(void)
{
    rINTPEND=~BIT_T1OVF;  
    tovfCnt1++;
}

void __irq IsrT2OVF(void)
{
    rINTPEND=~BIT_T2OVF;  
    tovfCnt2++;
}

void __irq IsrT3OVF(void)
{
    rINTPEND=~BIT_T3OVF;  
    tovfCnt3++;
}

void __irq IsrT4OVF(void)
{
    rINTPEND=~BIT_T4OVF;  
    tovfCnt4++;
}

void __irq IsrT5OVF(void)
{
    rINTPEND=~BIT_T5OVF;  
    tovfCnt5++;
}



void Test_Timer(void)
{
    int i;
    int t0,t1,t2,t3,t4,t5;

    Uart_Printf("[]Timer0,1,2,3,4,5 interrupt test\n");
    Uart_Printf("NOTE: GPIO0 has to be connected to TIN.\n\n");

    rP0CON|=0x1; //GPIO0=output;

    pISR_T0MC=(unsigned)IsrT0MCLed; //to signal the interrupt period outside
    pISR_T1MC=(unsigned)IsrT1MC;
    pISR_T2MC=(unsigned)IsrT2MC;
    pISR_T3MC=(unsigned)IsrT3MC;
    pISR_T4MC=(unsigned)IsrT4MC;
    pISR_T5MC=(unsigned)IsrT5MC;
    
    pISR_T0OVF=(unsigned)IsrT0OVF;
    pISR_T1OVF=(unsigned)IsrT1OVF;
    pISR_T2OVF=(unsigned)IsrT2OVF;
    pISR_T3OVF=(unsigned)IsrT3OVF;
    pISR_T4OVF=(unsigned)IsrT4OVF;
    pISR_T5OVF=(unsigned)IsrT5OVF;

    tmcCnt0=tmcCnt1=tmcCnt2=tmcCnt3=tmcCnt4=tmcCnt5=0;
    tovfCnt0=tovfCnt1=tovfCnt2=tovfCnt3=tovfCnt4=tovfCnt5=0;
       
    rINTMASK=BIT_T0MC|BIT_T1MC|BIT_T2MC|BIT_T3MC|BIT_T4MC|BIT_T5MC|
             BIT_T0OVF|BIT_T1OVF|BIT_T2OVF|BIT_T3OVF|BIT_T4OVF|BIT_T5OVF;
  

    ///////////////////////
    //Interval mode test
    ///////////////////////
    
    Uart_Printf("1) Interval mode test.\n");	
    Uart_Printf("[PROBE]Check GPIO0 frequency(500hz) for 0.5s\n");

    rT0PRE=199; 	//100khz(20Mhz/200)
    rT1PRE=199;
    rT2PRE=199;
    rT3PRE=199;
    rT4PRE=199;
    rT5PRE=199;
    
    rT0DATA=99; 	//100khz/(99+1)=1khz
    rT1DATA=99;
    rT2DATA=99;
    rT3DATA=99;
    rT4DATA=99;
    rT5DATA=99;
            
    rT0CON=0xc0;	//En CLR ITVAL EXTCLK 00
    rT1CON=0xc0;	//1  1   000   0      00
    rT2CON=0xc0;
    rT3CON=0xc0;
    rT4CON=0xc0;
    rT5CON=0xc0;
  	
    for(i=0;i<500;i++)
    {
    	Led_Display(i);
        while(rT0CNT<90);
        while(rT0CNT>=90);
    }

    //Because the interrupt, TnCNT may not be near 0.
    t0=RdT0CNT();
    t1=RdT1CNT();
    t2=RdT2CNT();
    t3=RdT3CNT();
    t4=RdT4CNT();
    t5=RdT5CNT();


    rT0CON=0x0;	//Dis NCLR MC&OVF   EXTCLK 00
    rT1CON=0x0;	//0   0    000      0      00
    rT2CON=0x0;
    rT3CON=0x0;
    rT4CON=0x0;
    rT5CON=0x0;
    
    Uart_Printf("TnCNT=??, tmcCntn=500\n");    

    Uart_Printf("T0CNT=%d, tmcCnt0=%d\n",t0,tmcCnt0);
    Uart_Printf("T1CNT=%d, tmcCnt1=%d\n",t1,tmcCnt1);
    Uart_Printf("T2CNT=%d, tmcCnt2=%d\n",t2,tmcCnt2);
    Uart_Printf("T3CNT=%d, tmcCnt3=%d\n",t3,tmcCnt3);
    Uart_Printf("T4CNT=%d, tmcCnt4=%d\n",t4,tmcCnt4);
    Uart_Printf("T5CNT=%d, tmcCnt5=%d\n",t5,tmcCnt5);


    /////////////////////////////
    //Match& Overflow mode test
    /////////////////////////////
    Uart_Printf("2) Match & OVF mode test.\n");	
    
    tmcCnt0=tmcCnt1=tmcCnt2=tmcCnt3=tmcCnt4=tmcCnt5=0;
    tovfCnt0=tovfCnt1=tovfCnt2=tovfCnt3=tovfCnt4=tovfCnt5=0;
    tmcVal0=tmcVal1=tmcVal2=tmcVal3=tmcVal4=tmcVal5=0;
    
    rT0CON=0xc8;	//En CLR MC&OVF   EXTCLK 00
    rT1CON=0xc8;	//1  1   001      0      00
    rT2CON=0xc8;
    rT3CON=0xc8;
    rT4CON=0xc8;
    rT5CON=0xc8;
    
    while(rT0CNT<200);
    while(rT0CNT>=200); //to wait the timer overflow
    while(rT0CNT<200);

    t0=RdT0CNT();
    t1=RdT1CNT();
    t2=RdT2CNT();
    t3=RdT3CNT();
    t4=RdT4CNT();
    t5=RdT5CNT();

    rT0CON=0x08;	//Dis NCLR MC&OVF   EXTCLK 00
    rT1CON=0x08;	//0   0    001      0      00
    rT2CON=0x08;
    rT3CON=0x08;
    rT4CON=0x08;
    rT5CON=0x08;

    Uart_Printf("TnCNT=???, tmcCntn=2, tmcValn=100, tovfCntn=1\n");    
    Uart_Printf("T0CNT=%d, tmcCnt0=%d, tmcVal0=%d, tovfCnt0=%d\n",t0,tmcCnt0,tmcVal0,tovfCnt0);
    Uart_Printf("T1CNT=%d, tmcCnt1=%d, tmcVal1=%d, tovfCnt1=%d\n",t1,tmcCnt1,tmcVal1,tovfCnt1);
    Uart_Printf("T2CNT=%d, tmcCnt2=%d, tmcVal2=%d, tovfCnt2=%d\n",t2,tmcCnt2,tmcVal2,tovfCnt2);
    Uart_Printf("T3CNT=%d, tmcCnt3=%d, tmcVal3=%d, tovfCnt3=%d\n",t3,tmcCnt3,tmcVal3,tovfCnt3);
    Uart_Printf("T4CNT=%d, tmcCnt4=%d, tmcVal4=%d, tovfCnt4=%d\n",t4,tmcCnt4,tmcVal4,tovfCnt4);
    Uart_Printf("T5CNT=%d, tmcCnt5=%d, tmcVal5=%d, tovfCnt5=%d\n",t5,tmcCnt5,tmcVal5,tovfCnt5);


    ///////////////////////////////////
    //Capture mode test: falling mode
    ///////////////////////////////////
    pISR_T0MC=(unsigned)IsrT0MC;  
    //IsrT0MCLed can't be used when testing the capture mode.

    tovfCnt0=tovfCnt1=tovfCnt2=tovfCnt3=tovfCnt4=tovfCnt5=0;
    rP0=rP0&(~0x1); //GPIO0=0;
    Uart_Printf("> Capture mode (falling mode).\n");	
    rT0CON=0xe0;	//En CLR CAP_F EXTCLK 00
    rT1CON=0xe0;	//1  1   100   0      00
    rT2CON=0xe0;
    rT3CON=0xe0;
    rT4CON=0xe0;
    rT5CON=0xe0;
    while(rT5CNT<1000);
    rP0=rP0|(0x1);  //GPIO0=1;
    while(rT5CNT<2000);
    rP0=rP0&(~0x1); //GPIO0=0;

    while(rT5CNT>100); //check OVF interrupt is occurred.
    
    rT0CON=0x20;	//Dis NCLR CAP_F    EXTCLK 00
    rT1CON=0x20;	//0   0    100      0      00
    rT2CON=0x20;
    rT3CON=0x20;
    rT4CON=0x20;
    rT5CON=0x20;
       
    Uart_Printf("TnDATA=2000, tovfCntn=1\n");    
    Uart_Printf("T0DATA=%d, tovfCnt0=%d\n",rT0DATA,tovfCnt0);   
    Uart_Printf("T1DATA=%d, tovfCnt1=%d\n",rT1DATA,tovfCnt1);   
    Uart_Printf("T2DATA=%d, tovfCnt2=%d\n",rT2DATA,tovfCnt2);
    Uart_Printf("T3DATA=%d, tovfCnt3=%d\n",rT3DATA,tovfCnt3);   
    Uart_Printf("T4DATA=%d, tovfCnt4=%d\n",rT4DATA,tovfCnt4);   
    Uart_Printf("T5DATA=%d, tovfCnt5=%d\n",rT5DATA,tovfCnt5);      


    //////////////////////////////////
    //Capture mode test: rising mode
    //////////////////////////////////
    tovfCnt0=tovfCnt1=tovfCnt2=tovfCnt3=tovfCnt4=tovfCnt5=0;
    rP0=rP0&(~0x1); //GPIO0=0;
    Uart_Printf("> Capture mode (rising mode).\n");	
    rT0CON=0xe8;	//En CLR CAP_R EXTCLK 00
    rT1CON=0xe8;	//1  1   101   0      00
    rT2CON=0xe8;
    rT3CON=0xe8;
    rT4CON=0xe8;
    rT5CON=0xe8;

    while(rT5CNT<1000);
    rP0=rP0|(0x1);  //GPIO0=1;
    while(rT5CNT<2000);
    rP0=rP0&(~0x1); //GPIO0=0;

    while(rT5CNT>100); //check OVF interrupt is occurred.
    
    rT0CON=0x28;	//Dis NCLR CAP_R EXTCLK 00
    rT1CON=0x28;	//0   0    101   0      00
    rT2CON=0x28;
    rT3CON=0x28;
    rT4CON=0x28;
    rT5CON=0x28;
       
    Uart_Printf("TnDATA=1000, tovfCntn=1\n");    
    Uart_Printf("T0DATA=%d, tovfCnt0=%d\n",rT0DATA,tovfCnt0);   
    Uart_Printf("T1DATA=%d, tovfCnt1=%d\n",rT1DATA,tovfCnt1);   
    Uart_Printf("T2DATA=%d, tovfCnt2=%d\n",rT2DATA,tovfCnt2);
    Uart_Printf("T3DATA=%d, tovfCnt3=%d\n",rT3DATA,tovfCnt3);   
    Uart_Printf("T4DATA=%d, tovfCnt4=%d\n",rT4DATA,tovfCnt4);   
    Uart_Printf("T5DATA=%d, tovfCnt5=%d\n",rT5DATA,tovfCnt5);      


    //////////////////////////////////////////
    //Capture mode test: rising&falling mode
    //////////////////////////////////////////
    tovfCnt0=tovfCnt1=tovfCnt2=tovfCnt3=tovfCnt4=tovfCnt5=0;
    rP0=rP0&(~0x1); //GPIO0=0;
    Uart_Printf("> Capture mode (rising&falling mode).\n");	

    rT0CON=0xf0;	//En CLR CAP_RF EXTCLK 00
    rT1CON=0xf0;	//1  1   110    0      00
    rT2CON=0xf0;
    rT3CON=0xf0;
    rT4CON=0xf0;
    rT5CON=0xf0;

 
    while(rT5CNT<1000);
    rP0=rP0|(0x1);  //GPIO0=1;
    t0=rT0DATA;     //save the capture data
    t1=rT1DATA;
    t2=rT2DATA;
    t3=rT3DATA;
    t4=rT4DATA;
    t5=rT5DATA;
    
    while(rT5CNT<2000);
    rP0=rP0&(~0x1); //GPIO0=0;

    while(rT5CNT>100); //check OVF interrupt is occurred.
    
    rT0CON=0x30;	//Dis NCLR CAP_RF EXTCLK 00
    rT1CON=0x30;	//0   0    110    0      00
    rT2CON=0x30;
    rT3CON=0x30;
    rT4CON=0x30;
    rT5CON=0x30;
       
    Uart_Printf("1st_TnDATA=1000, 2nd_TnDATA=2000, tovfCntn=1\n");    
    Uart_Printf("1st_T0DATA=%d, 2nd_T0DATA=%d, tovfCnt0=%d\n",t0,rT0DATA,tovfCnt0);   
    Uart_Printf("1st_T1DATA=%d, 2nd_T1DATA=%d, tovfCnt1=%d\n",t1,rT1DATA,tovfCnt1);   
    Uart_Printf("1st_T2DATA=%d, 2nd_T2DATA=%d, tovfCnt2=%d\n",t2,rT2DATA,tovfCnt2);
    Uart_Printf("1st_T3DATA=%d, 2nd_T3DATA=%d, tovfCnt3=%d\n",t3,rT3DATA,tovfCnt3);   
    Uart_Printf("1st_T4DATA=%d, 2nd_T4DATA=%d, tovfCnt4=%d\n",t4,rT4DATA,tovfCnt4);   
    Uart_Printf("1st_T5DATA=%d, 2nd_T5DATA=%d, tovfCnt5=%d\n",t5,rT5DATA,tovfCnt5);      
    
    rINTMASK=0x0;
}








void Test_TimerRegRead(void)
{
    int t0,t1,t2,t3,t4,t5;
    Uart_Printf("[]Timer0,1,2,3,4,5 interrupt test\n");
    Uart_Printf("NOTE: GPIO0 has to be connected to TIN.\n\n");

    rP0CON|=0x1; //GPIO0=output;

    pISR_T0MC=(unsigned)IsrT0MCLed; //to signal the interrupt period outside
    pISR_T1MC=(unsigned)IsrT1MC;
    pISR_T2MC=(unsigned)IsrT2MC;
    pISR_T3MC=(unsigned)IsrT3MC;
    pISR_T4MC=(unsigned)IsrT4MC;
    pISR_T5MC=(unsigned)IsrT5MC;
    
    pISR_T0OVF=(unsigned)IsrT0OVF;
    pISR_T1OVF=(unsigned)IsrT1OVF;
    pISR_T2OVF=(unsigned)IsrT2OVF;
    pISR_T3OVF=(unsigned)IsrT3OVF;
    pISR_T4OVF=(unsigned)IsrT4OVF;
    pISR_T5OVF=(unsigned)IsrT5OVF;

    tmcCnt0=tmcCnt1=tmcCnt2=tmcCnt3=tmcCnt4=tmcCnt5=0;
    tovfCnt0=tovfCnt1=tovfCnt2=tovfCnt3=tovfCnt4=tovfCnt5=0;
       
    //rINTMASK=BIT_T0MC|BIT_T1MC|BIT_T2MC|BIT_T3MC|BIT_T4MC|BIT_T5MC|
    //         BIT_T0OVF|BIT_T1OVF|BIT_T2OVF|BIT_T3OVF|BIT_T4OVF|BIT_T5OVF;
  

    ///////////////////////
    //Interval mode test
    ///////////////////////
    
    Uart_Printf("Timer register(TnCNT) reading test.\n");	
    rT0PRE=199; 	//100khz(20Mhz/200)
    rT1PRE=199;
    rT2PRE=199;
    rT3PRE=199;
    rT4PRE=199;
    rT5PRE=199;
    
    rT0DATA=99; 	//100khz/(99+1)=100hz
    rT1DATA=99;
    rT2DATA=99;
    rT3DATA=99;
    rT4DATA=99;
    rT5DATA=99;
            
    rT0CON=0xc0;	//En CLR ITVAL EXTCLK 00
    rT1CON=0xc0;	//1  1   000   0      00
    rT2CON=0xc0;
    rT3CON=0xc0;
    rT4CON=0xc0;
    rT5CON=0xc0;

    rSYSCFG=0x1ff1;
    rSYSCFG=0x1ff1;
    trerror=0;
    trtotal=0;  	
    while(!Uart_GetKey())
    {
        t0=RdT0CNT();
	t1=RdT1CNT();
        t2=RdT0CNT();
	t3=RdT1CNT();
        t4=RdT0CNT();
	t5=RdT1CNT();
	
   	Uart_Printf("%3d,%3d,%3d,%3d,%3d,%3d,(t=%d,e=%d)\n",
		    t0,t1,t2,t3,t4,t5,trtotal,trerror);

        //If timer interrupt occurs during reading TnCNT, the read values will be different.
        //The timer interrupt occurs when TnCNT is 99 -> 0
    }
}



/*
U32 RdT0CNT(void)
{
    register t0,t1;
    while(1)
    {
        t0=rT0CNT;
 	t1=rT0CNT;  //These two values should be read sequentially to avoud the timer value increment.
    	if(t0==t1)return t1;
    }


  ;above code assembly
  ;-g- without -zpz0
  EXPORT RdT0CNT
RdT0CNT
  0x00144c:  e3a02af9  ..*. : MOV      r2,#0xf9000
  0x001450:  e282261f  ..&. : ADD      r2,r2,#0x1f00000
  0x001454:  e1d210b6  .... : LDRH     r1,[r2,#6]
  0x001458:  e1d200b6  .... : LDRH     r0,[r2,#6]
  0x00145c:  e1510000  .Q.. : CMP      r1,r0
  0x001460:  1afffffb  .... : BNE      0x1454
  0x001464:  e1a0f00e  .... : MOV      pc,r14

}
*/


   

⌨️ 快捷键说明

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