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

📄 pwm.c

📁 led,key,i2c,uart,adc,rtc,wdt测SHI 文件代码
💻 C
字号:
#include <string.h>
#include <math.h>
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"
#include "..\inc\pwm.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);
volatile int variable0,variable1,variable2,variable3,variable4,variable5;
/****************************************
 *  PWM Timer TOUT0/1/2/3/4 test	*
 ****************************************/
 /*TCON :Timer control register
	B26:timer 5 auto reload on/off       0->one short     1->interval mode(auto reload)
	B25:timer 5 manual update            0->no operation, 1->updata TCNTB5
	B24:timer 5 start/stop               0->STOP        , 1->START
	B23:timer 4 auto reload on/off       0->one short     1->interval mode(auto reload)
	B22:timer 4 output inverter on /off  0->invert off    1->invert on for timer4
	B21:timer 4 manual update            0->no operation, 1->updata TCNTB4,TCMPB4
	B20:timer 4 start/stop               0->STOP        , 1->START
	B19:timer 3 auto reload on/off       0->one short     1->interval mode(auto reload)
	B18:timer 3 output inverter on /off  0->invert off    1->invert on for timer3
	B17:timer 3 manual update            0->no operation, 1->updata TCNTB3,TCMPB3
	B16:timer 3 start/stop               0->STOP        , 1->START
	B15:timer 2 auto reload on/off       0->one short     1->interval mode(auto reload)
	B14:timer 2 output inverter on /off  0->invert off    1->invert on for timer2
	B13:timer 2 manual update            0->no operation, 1->updata TCNTB2,TCMPB2
	B12:timer 2 start/stop               0->STOP        , 1->START
	
	B11:timer 1 auto reload on/off       0->one short     1->interval mode(auto reload)
	B10:timer 1 output inverter on /off  0->invert off    1->invert on for timer1
	B09:timer 1 manual update            0->no operation, 1->updata TCNTB1,TCMPB1
	B08:timer 1 start/stop               0->STOP        , 1->START
	
	B04:dead zone operation,             0->disable     , 1->enable
	B03:timer 0 auto reload on/off       0->one short     1->interval mode(auto reload)
	B02:timer 0 output inverter on /off  0->invert off    1->invert on for timer0
	B01:timer 0 manual update            0->no operation, 1->updata TCNTB0,TCMPB0
	B00:timer 0 start/stop               0->STOP        , 1->START
	*/
void Test_TimerInt(void)
{
	int intTemp;
    int save_E,save_PE,save_DE;
    save_DE=rPDATE;
    save_E=rPCONE;
    save_PE=rPUPE;
    
    variable0=0;variable1=0;variable2=0;variable3=0;variable4=0;variable5=0;
	intTemp=rINTMSK;
    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");

    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/(66MHz/15/32))*0xffff=0.48s
    rTCNTB1=0xffff;	//(1/(66MHz/15/16))*0xffff=0.24s
    rTCNTB2=0xffff;	//(1/(66MHz/15/8 ))*0xffff=0.12s
    rTCNTB3=0xffff;	//(1/(66MHz/15/4 ))*0xffff=0.06s
    rTCNTB4=0xffff;	//(1/(66MHz/15/2 ))*0xffff=0.03s
    rTCNTB5=0xffff;	//(1/(66MHz/15/2 ))*0xffff=0.03s

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

    while(variable0==0);     
	Delay(1);	   	//To compensate timer error(<1 tick period)
    rTCON=0x0;		//all_stop
    
    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);
				
    if((variable5==16) && (variable4==16) && (variable3==8) && (variable2==4) && (variable1==2) && (variable0==1))
		Uart_Printf("Timer0/1/2/3/4/5 interrupt Test --> OK\n");
    else
		Uart_Printf("Timer0/1/2/3/4/5 interrupt Test --> Fail\n");
		

	rTCON=0x0;		//Stop timer				
    rPCONE=save_E;
    rPUPE=save_PE;
    rPDATE=save_DE;  
    rINTMSK=intTemp;
}
/*
void Test_Timer(void)
{
    int save_E,save_PE,save_DE;
    save_DE=rPDATE;
    save_E=rPCONE;
    save_PE=rPUPE;
    rPCONE=0xaaa8;		//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;		// Total cont=1000 
    rTCNTB1=1000;
    rTCNTB2=1000;		
    rTCNTB3=1000;
    rTCNTB4=1000;

    rTCMPB0=1000-700;	// L_count:700, H_count:300
    rTCMPB1=1000-700;
    rTCMPB2=1000-700;	
    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;
    rPDATE=save_DE;
}
*/
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 + -