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

📄 timer.c

📁 三星2413芯片的测试代码,对进行驱动开发很有帮助.
💻 C
📖 第 1 页 / 共 3 页
字号:
				break;
			case 'N':		// Up compare
				setCompareBuf(1, SLOPE);
				break;
			case 'n':		// down compare
				setCompareBuf(1, -SLOPE);
				break;
			case 'M':		// Up compare
				setCompareBuf(2, SLOPE);
				break;
			case 'm':		// down compare
				setCompareBuf(2, -SLOPE);
				break;
			case '<':		// Up compare
				setCompareBuf(3, SLOPE);
				break;
			case ',':		// down compare
				setCompareBuf(3, -SLOPE);
				break;
			case '[':
				rINTMSK = ~(BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0);
				isr_print = TRUE;
				break;
			case ']':
				rINTMSK = rINTMSK | BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0;
				isr_print = FALSE;
				break;
			case '/':		// ISR for Timer4 only
				rINTMSK = ~(BIT_TIMER4);
				break;
			case 'P':	// dead zone enable
				rTCON = rTCON | (1<<4);
				break;
			case 'p':	// dead zone disable
				rTCON = rTCON & ~(1<<4);
				break;
			case 'Q':
			case 'q':
				end_function = 1;
				break;
			default:
				break;
		}
		if ( end_function == 1 )
			break;
	}
	
	rGPBCON = rGPBCON_back;
}

void TimerSubMessage(void)
{
	int i;
	
	i=0;
	printf("\n\n");
	while(1)
	{   //display menu
	    printf("%2d:%s",i,timer_func[i][1]);
	    i++;
	    if((int)(timer_func[i][0])==0)
	    {
			printf("\n");
			break;
	    }
	    if((i%4)==0) printf("\n");
	}
}


//=========================================================================
//      SMDK24a0 TOUT configuration(GPCON_U:0x44800000)
//  GP23=PWM_TOUT3,GP22=PWM_TOUT2,GP21=PWM_TOUT1,GP20=PWM_TOUT0,
//  GP19=PWM_ECLK 
//
//Timer input clock frequency = PCLK/{prescaler value+1}/{divider value}
//{prescaler value} = 0 ~ 255   , {divider value} = 2,4,8,16
//
//  PWM Timer PWM_TOUT0/1/2/3/ECLK Test - 24a0
//=========================================================================

#define GPCONU_ABAIL (TRUE)  // if wanna GPGONU set "FALSE"

void Test_Timer(void)
{
	int save_GPB_CON, save_GPB_DAT;
	int Deadzone_test_flag= 0, PWM50_test_flag=1, Inverton_test_flag=0;
	int key;

    
	printf("[ PWM_TOUT 0,1,2,3 Test ]\n\n");    
	//printf("= Current Port Setting List =\n");
	//printf("rGPCON_U = 0x%8x,   rGPDAT = 0x%8x,   rGPUP= 0x%8x \n" ,rGPCON_U,rGPDAT,rGPUP);

	save_GPB_CON= rGPBCON;
	save_GPB_DAT= rGPBDAT;
  
	// controls PCLK into PWMTIMER block 0 :disable, 1:enable
	//rCLKCON = rCLKCON & ~(0x100) | 0x100;
	//    rPCLKCON = (1<<16);
	// IO port pull up control register : 0=enable, 1=disable   
	//rGPPU= rGPPU & ~(0x00f80000) | 0x00f80000;

	// IO port configuration register relative to TIMER
	rGPBCON=0x2aa;   //GPI0,GPI1,GPI2,GPI3,GPI4,

	// check the buffer writing, correctly
	//printf("= Changed Port Setting List =\n");    
	//printf("rGPCON_U = 0x%8x,   rGPDAT = 0x%8x,   rGPUP= 0x%8x \n" ,rGPCON_L,rGPDAT,rGPPU);
LABEL:

	printf("[ Select Timer Clock ]\n");
	printf("[  prescaler0 | prescaler1 | divider\n");
	printf("a.       0                 0             1/2 \n");
	printf("b.       0                 0             1/4 \n");
	printf("c.       0                 0             1/8 \n");
	printf("d.       0                 0             1/16 \n");
//    printf("e.       0                 0             TCLK0 \n"); // not implemented in GPIO
	printf("f.     255              255           1/2 \n");
	printf("g.    255              255           1/4 \n");
	printf("h.    255              255           1/8 \n"); 
	printf("i.     255              255           1/16 \n");
//    printf("j.     255              255           TCLK1 \n"); // // not implemented in GPIO	
	printf("k.       0                 0             1/2 (Dead-zone value=40 \n");
	printf("l.       0                 0             1/2 (PWM 50%% \n");
	printf("m.     0                 0             1/2 (Invert on.off \n");

	printf("\nSelect the function to test : ");
	key = Uart_getc();
	printf("%c\n\n",key);

    switch(key)
    {
	 case 'a'://All Interrupt, MUX 4 ~ 0 : 1/2 //Dead zone=1,Prescaler1=0,Prescaler0=0	
            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x10000;
            rTCFG1 = 0x0;
            break;
	 case 'b'://All Interrupt, MUX 4 ~ 0 : 1/4 //Dead zone=1,Prescaler1=0,Prescaler0=0	
            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x10000;
            rTCFG1 = 0x11111;
            break;
	 case 'c'://All Interrupt, MUX 4 ~ 0 : 1/8 //Dead zone=1,Prescaler1=0,Prescaler0=0	
            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x10000;
            rTCFG1 = 0x22222;
            break;
	 case 'd'://All Interrupt, MUX 4 ~ 0 : 1/16 //Dead zone=1,Prescaler1=0,Prescaler0=0
            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x10000;
            rTCFG1 = 0x33333; 
            break;
//	 case 'e'://All Interrupt, MUX 4 ~ 0 : TCLK0 //Dead zone=1,Prescaler1=0,Prescaler0=0
//            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x10000;
//            rTCFG1 = 0x44444; // Ext Clock.
//            break;
	 case 'f'://All Interrupt, MUX 4 ~ 0 : 1/2 //Dead zone=1,Prescaler1=255,Prescaler0=255	
            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x1ffff;
            rTCFG1 = 0x0;
            break;
	 case 'g'://All Interrupt, MUX 4 ~ 0 : 1/4 //Dead zone=1,Prescaler1=255,Prescaler0=255	
            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x1ffff;
            rTCFG1 = 0x11111;
            break;
	 case 'h'://All Interrupt, MUX 4 ~ 0 : 1/8 //Dead zone=1,Prescaler1=255,Prescaler0=255	
            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x1ffff;
            rTCFG1 = 0x22222;
            break;
	 case 'i'://All Interrupt, MUX 4 ~ 0 : 1/16 //Dead zone=1,Prescaler1=255,Prescaler0=255	
            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x1ffff;
            rTCFG1 = 0x33333;
            break;
//	case 'j'://All Interrupt, MUX 4 ~ 0 : TCLK1 //Dead zone=1,Prescaler1=255,Prescaler0=255	
//            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x1ffff;     
//            rTCFG1 = 0x44444; // Ext Clock.
//            break;
	 case 'k'://All Interrupt, MUX 1 ~ 0 : 1/2 //Dead zone=40,Prescaler1=0,Prescaler0=0	
            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x280000;
            rTCFG1 = 0x0;
            Deadzone_test_flag = 1;
            break;
	 case 'l'://All Interrupt, MUX 1 ~ 0 : 1/2 //Dead zone=1,Prescaler1=0,Prescaler0=0, PWM50%	
            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x280000;
            rTCFG1 = 0x0;
            PWM50_test_flag = 1;
            break;
	 case 'm'://All Interrupt, MUX 4 ~ 0 : 1/2 //Dead zone=1,Prescaler1=0,Prescaler0=0, Invert ON
            rTCFG0 = rTCFG0 & ~(0xffffff) | 0x280000;
            rTCFG1 = 0x0; 
            Inverton_test_flag = 1;
            break;
  			
        default:
		rTCON   = 0x0;

		rGPBCON=save_GPB_CON;
		rGPBDAT=save_GPB_DAT;

	return;
    }

////////////////////////////////////////////////////////////////////////////////////
// Step1>> write the rTCNTBn and rTCMPBn
//(1/(PCLK/(Prescaler+1)/divider) * count(Max 65535) = Timer clock (Frequency)
////////////////////////////////////////////////////////////////////////////////////

    rTCNTB0 = rTCNTB0 & ~(0xffff) | 2000;       //(1/(50MHz/69/2))  *  2000 =  5.5200 msec (181.159  Hz)
                                                //(1/(50.7MHz/69/2))*  2000 =  5.4437 msec (183.698  Hz)
                                                //(1/(50MHz/1/2))   *  2000 =  0.0800 msec ( 12.500 KHz)
                                                //(1/(50.7MHz/1/2)) *  2000 =  0.0788 msec ( 12.690 KHz)
    rTCNTB1 = rTCNTB1 & ~(0xffff) | 4000;       //(0.0000027600003) *  4000 = 11.0400 msec ( 90.579  Hz)
                                                //(0.0000027218935) *  4000 = 10.8875 msec ( 91.848  Hz)
                                                //(0.00000004)      *  4000 =  0.1600 msec (  6.250 KHz)
                                                //(0.0000000394477) *  4000 =  0.1577 msec (  6.337 KHz)
    rTCNTB2 = rTCNTB2 & ~(0xffff) | 5000;       //(0.0000027600003) *  5000 = 13.8000 msec ( 72.463  Hz)
                                                //(0.0000027218935) *  5000 = 13.6094 msec ( 73.478  Hz)
                                                //(0.00000004)      *  5000 =  0.2000 msec (  5.000 KHz)
                                                //(0.0000000394477) *  5000 =  0.1972 msec (  5.070 KHz)
    rTCNTB3 = rTCNTB3 & ~(0xffff) | 10000;      //(0.0000027600003) * 10000 = 27.6000 msec ( 36.231  Hz)
                                                //(0.0000027218935) * 10000 = 27.2189 msec ( 36.739  Hz)
                                                //(0.00000004)      * 10000 =  0.4000 msec (  2.500 KHz)
                                                //(0.0000000394477) * 10000 =  0.3944 msec (  2.535 KHz)


   //printf("rTCNTB0=%d |rTCNTB1=%d |rTCNTB2=%d | rTCNTB3=%d \n",rTCNTB0,rTCNTB1,rTCNTB2,rTCNTB3);

   if(PWM50_test_flag ==1 ){
       rTCMPB0 =  2000;     rTCMPB1 =  4000;    rTCMPB2 =  5000;    rTCMPB3 = 10000;
//	   rTCMPB0 =  4000;     rTCMPB1 =  8000;    rTCMPB2 =  5000;    rTCMPB3 = 10000;
	PWM50_test_flag = 0;
   }
   else{ 
//       rTCMPB0 =  2000 - 1000;    rTCMPB1 =  4000 - 2000;    rTCMPB2 =  5000 - 2500;    rTCMPB3 = 10000-5000;
	   rTCMPB0 = 1000;    rTCMPB1 =1000;    rTCMPB2 =1000;    rTCMPB3 = 1000;
   }

   //printf("rTCMPB0=%d |rTCMPB1=%d |rTCMPB2=%d | rTCMPB3=%d \n",rTCMPB0,rTCMPB1,rTCMPB2,rTCMPB3);


////////////////////////////////////////////////////////////////////////////////////
//	Step2.>> Set the manual update bit[TCON] of the corresponging timer. it is recommended to configure
//	   the inverter on/off bit
////////////////////////////////////////////////////////////////////////////////////
    //printf("rTCON  = 0x%6x (Before)  <= Timer control register.\n",rTCON); 

     // [22:20] [19:16] [15:12] [11:8] [7:4] [3:0]
     //   110     1010   1010    1010   0000  1010
    if(Deadzone_test_flag == 1)
       rTCON   = rTCON & ~(0xffffff) | 0x6aaa1a;  //Auto reload, Inverter off, Manual update, Stop, Dead zone enable
    else 
       rTCON   = rTCON & ~(0xffffff) | 0x6aaa0a;  //Auto reload, Inverter off, Manual update, Stop, Dead zone disable
    
    if(Inverton_test_flag == 1) rTCON |= 0x44404;
	
    //printf("rTCON  = 0x%6x (After)   <= Timer control register.(0x6aaa0a)\n",rTCON);
	

////////////////////////////////////////////////////////////////////////////////////
// Step3>> set start bit of corresponding timer to start the timer
//  (at the same time, clear the manual update bit)
 ////////////////////////////////////////////////////////////////////////////////////
    
     // [22:20] [19:16] [15:12] [11:8] [7:4] [3:0]
     //   101     1001   1001    1001   0000  1001
    if(Deadzone_test_flag == 1){
        //Auto reload, Inverter off, No operation, Timer0&1 Start, Dead zone enable
        rTCON   = rTCON & ~(0xffffff) | 0x099919;  
	 Deadzone_test_flag=0;
    	}
    else{
       if(Inverton_test_flag ==1){
          rTCON   = rTCON & ~(0xffffff) | 0x5ddd0d; // inverter on
          Inverton_test_flag = 0;
      	}
	 //Auto reload, Inverter off, No operation, Start, Dead zone disable
        rTCON   = rTCON & ~(0xffffff) | 0x599909;  
    }

    printf("rTCON  = 0x%6x (After)   <= Timer control register.(0x599909)\n\n",rTCON);
    printf("rGPICON  = 0x%8x (After)   <= Timer control register.(0x599909)\n\n",rGPBCON);
    //printf("\n");
    printf("Probing PWM TOUT0,1,2,3 and ECLK, respectively TP20,19,18,17,16 \n");
    printf("\nCheck PWM (Pulse Width Modulation) Output\n");
    printf("Press any key to exit.\n");
    printf("\n\n");
	//rTCON|=(1<<2)|(1<<10)|(1<<14)|(1<<18);

    Uart_getc();

    goto LABEL;
////////////////////////////////////////////////////////////////////////////////////
// Step4 >> Stop timer
////////////////////////////////////////////////////////////////////////////////////	 
	rTCON   = 0x0;      //One-shot, Inverter off, No operation, Dead zone disable, Stop
	//printf("rTCNTB0=0x%6x|rTCNTB1=0x%6x|rTCNTB2=0x%6x|rTCNTB3=0x%6x\n",rTCNTB0,rTCNTB1,rTCNTB2,rTCNTB3);
	//printf("rTCMPB0=0x%6x|rTCMPB2=0x%6x|rTCMPB2=0x%6x|rTCMPB3=0x%6x\n",rTCMPB0,rTCMPB1,rTCMPB2,rTCMPB3);
	//printf("rTCON  = 0x%6x   <= Timer control register.(0x0)\n",rTCON);
	rGPBCON=save_GPB_CON;
	rGPBDAT=save_GPB_DAT;
     
}


//========================================================
// Timer Interrupt 0/1/2/3/4 test
//========================================================
void Test_TimerInt(void)
{
   
    int save_PRIORITY;
    int save_INTMOD;
    	char i;
    	int j=0;
    
    rGPBCON = 0xaa;
    save_PRIORITY = rPRIORITY;
    save_INTMOD= rINTMOD;
    
    variable0 = 0;variable1 = 0;variable2 = 0;variable3 = 0;variable4 = 0;
		
	/* Timer0,1,2,3,4 Interrupt service is available */ 
    rINTMSK = ~(BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0);
	// printf("rINTMSK (After)  = 0x%8x   <= Timer4,3,2,1 Bit[14:10]\n",rINTMSK);

    /* Timer0,1,2,3,4 Interrupt Service Routine Entry Point Determine */ 
    pISR_TIMER0 = (int)Timer0Done;
    pISR_TIMER1 = (int)Timer1Done;
    pISR_TIMER2 = (int)Timer2Done;
    pISR_TIMER3 = (int)Timer3Done;
    pISR_TIMER4 = (int)Timer4Done;

    printf("\n[Timer 0,1,2,3,4 Interrupt Test]\n\n");
	
    rTCFG0 = rTCFG0 & ~(0xffffff) | 0xf0 | 0xf0<<8; //Dead zone=0,Prescaler1=255(0x0f),Prescaler0=255(0x0f)
    
    #if (FIQ_TEST||PRIORITY_TEST||DEADZONE_TEST)
    	rTCFG1  =rTCFG1 & ~(0xffffff) | 0x033333; //All interrupt,Mux4,Mux3,Mux2,Mux1,Mux0=1/16
		if (FIQ_TEST)
		{
			rINTMOD = 1<<12; //Only timer2 is FIQ MODE 
			printf("FIQ TEST!!!\n");
			pISR_FIQ=(int)Timer2Done;
		}
		
		if (PRIORITY_TEST) 
		{
			int i;
			printf("PRIORITY change MODE!! select the MODE\n");
			printf("0 = REQ 0-1-2-3-4-5\n");
			printf("1 = REQ 0-2-3-4-1-5\n");
			printf("2 = REQ 0-3-4-1-2-5\n");
			printf("3 = REQ 0-4-1-2-3-5\n");
			i=GetIntNum();
			rPRIORITY =(i<<11)|(1<<2); //ARBITER 2's PRIORITY is enabled 
		}
		if (DEADZONE_TEST)
		{
			rTCFG0|=(2<<16); // Deadzone length unit 150
			rTCON |=(1<<4);  // Deadzone enable
		}
		
	#else if
	rTCFG1  =rTCFG1 & ~(0xffffff) | 0x001233; //All interrupt,Mux4=1/2,Mux3=1/4,Mux2=1/8,Mux1=1/16,Mux0=1/16
	#endif
    
	printf ("rTCFG0 = 0x%x   rTCON = 0x%x \n",rTCFG0,rTCON);

	rTCNTB0 = 30000;	rTCNTB1 = 30000;	rTCNTB2 = 30000;	rTCNTB3 = 30000;	rTCNTB4 = 30000;

	rTCMPB0 = 15000;	rTCMPB1 = 15000;	rTCMPB2 = 15000;	rTCMPB3 = 15000;
	/*
	rTCNTB0 = 10;	rTCNTB1 = 10;	rTCNTB2 = 10;	rTCNTB3 = 10;	rTCNTB4 = 10;

	rTCMPB0 = 5;	rTCMPB1 = 5;	rTCMPB2 = 5;	rTCMPB3 = 5;	*/

	rTCON  = rTCON & ~(0xffffff) | 0x1<<1 | 0x1<<9 | 0x1<<13 | 0x1<<17 | 0x1<<21 ; //Manual update

	rTCON  = rTCON & ~(0xffffff) | 0x1 | 0x1<<3 ; //Timer 0 Start, Auto-reload 
	rTCON  = rTCON | 0x1<<8 | 0x1<<11 ; //Timer 1 Start, Auto-reload
	rTCON  = rTCON | 0x1<<12 | 0x1<<15 ; //Timer 2 Start, Auto-reload
	rTCON  = rTCON | 0x1<<16 | 0x1<<19 ; //Timer 3 Start, Auto-reload
	rTCON  = rTCON | 0x1<<20 | 0x1<<22 ; //Timer 4 Start, Auto-reload   

    //rTCON  = rTCON & ~(0xffffff) | 0x1 | 0x1<<3| 0x1<<8 | 0x1<<11 | 0x1<<12 | 0x1<<15 | 0x1<<16 | 0x1<<19  ; //without timer 4 Start, Auto-reload   
    
    //Auto reload,Inverter off,No operation,Dead zone disable,Start
	
	if (DEADZONE_TEST)
	{
		rTCFG0|=(3<<16); // Deadzone length unit 150
		rTCON |=(1<<4);  // Deadzone enable
	}

	#define TIMER_MAX_COUNT 10
	while(1)
	{

⌨️ 快捷键说明

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