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

📄 pwm_test.c

📁 基于ARM9芯片的一个简单的GPRS测试程序
💻 C
字号:
/*********************************************************************************************
* File:		pwm_test.c
* Author:	embest
* Desc:		s3c44b0x pwm timer test 
* History:	
*			H.T.Zhang, Programming modify, September 14, 2005
*********************************************************************************************/

/*------------------------------------------------------------------------------------------*/
/*	 								include files						 				    */
/*------------------------------------------------------------------------------------------*/
#include "2410lib.h"
#include "demo.h"

/*------------------------------------------------------------------------------------------*/
/*	 								function declare					 				    */
/*------------------------------------------------------------------------------------------*/
void timer0_int(void) __attribute__((interrupt("IRQ")));
void timer1_int(void) __attribute__((interrupt("IRQ")));

/*------------------------------------------------------------------------------------------*/
/*	 								global variables					 				    */
/*------------------------------------------------------------------------------------------*/
char buf[50];
INT8T cEnChange0,cEnChange1;

/*********************************************************************************************
* name:		timer1_int
* func:		Timer0 Interrupt handler
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void timer0_int(void)
{
	ClearPending(BIT_TIMER0);
	if(cEnChange0)
	{
		switch(f_ucChar)
		{
			case 1:
				    rTCNTB0 = 792;
					rTCMPB0 = 396;
					break;
			case 2:
				    rTCNTB0 = 792;
					rTCMPB0 = 264;
					break;					
			case 3:
				    rTCNTB0 = 396;
					rTCMPB0 = 132;
					break;					
			case 4:
					rTCNTB0 = 396;
					rTCMPB0 = 198;
					break;		
			default:return;
		}
		lcd_clr_rect(30,144,286,160,BLUE);
		sprintf(buf,"PWM0:rTCNTB0 = %d rTCMPB0 = %d",rTCNTB0,rTCMPB0);
		print_lcd(30,144,WHITE,(UINT8T *)buf);
		cEnChange0=0;
	}
}

/*********************************************************************************************
* name:		timer1_int
* func:		Timer1 Interrupt handler
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void timer1_int(void)
{
	ClearPending(BIT_TIMER1);
	if(cEnChange1)
	{
		switch(f_ucChar)
		{
			case 5:
				    rTCNTB1 = 792;
					rTCMPB1 = 396;
					break;
			case 6:
				    rTCNTB1 = 792;
					rTCMPB1 = 264;
					break;					
			case 7:
				    rTCNTB1 = 396;
					rTCMPB1 = 132;
					break;					
			case 8:
					rTCNTB1 = 396;
					rTCMPB1 = 198;
					break;		
			default:return;
		}
		lcd_clr_rect(30,144,286,160,BLUE);
		sprintf(buf,"PWM1:rTCNTB1 = %d rTCMPB1 = %d",rTCNTB1,rTCMPB1);
		print_lcd(30,144,WHITE,(UINT8T *)buf);
		cEnChange1=0;
	}
}
/*********************************************************************************************
* name:		timer_init
* func:		initialize PWM Timer0
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void timer_init(void)
{		
	rGPBCON = rGPBCON & 0xFFFFF0|(1<<3);//|(1<<1);
	
	/* set interrupt handler */
    pISR_TIMER0=(unsigned)timer0_int;
    pISR_TIMER1=(unsigned)timer1_int;
    
	rTCFG0 = (39<<8)|(39);			// Prescaler0/1=39,39	
	rTCFG1 = (3<<4)|3;			// Interrupt; Devider value = 16
	// timer0 clock = PCLK/(prescaler+1)/16
	rTCON=0;				//disable dead zone,auto reload off,inverter off,not start

}

/*********************************************************************************************
* name:		pwm_test
* func:		initialize PWM Timer0
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void pwm_test(void)
{
	int i;
	char * pwmMenu[] = 
	{
		"1 PWM0:1/2,100Hz  5 PWM1:1/2,100Hz",
		"2 PWM0:1/3,100Hz  6 PWM1:1/3,100Hz",
		"3 PWM0:1/3,200Hz  7 PWM1:1/3,200Hz",
		"4 PWM0:1/2,200Hz  8 PWM1:1/2,200Hz"
	};
	lcd_disp_str16(30,40,BLUE,"Press Key1-8 to change duty cycle   and frequency:");
	for(i = 0;i < 4;i++)
		print_lcd(24,80+16*i,BLUE,pwmMenu[i]);	
	// init timer0
	timer_init();	
	ClearPending(BIT_TIMER0);
	ClearPending(BIT_TIMER1);
	/* initialize PWM timer0 register */
	rTCNTB0 = 792;
	rTCMPB0 = 396;
	rTCNTB1 = 792;
	rTCMPB1 = 396;
	rTCON |= (1<<10)|(1<<9)|(1<<2)|(1<<1);	// manual update
	delay(10);
	rTCON  &= ~((1<<9)|(1<<1));				// auto reload
	ClearPending(BIT_TIMER0);
	ClearPending(BIT_TIMER1);
	rINTMSK &=~(BIT_TIMER0|BIT_TIMER1);
	rTCON   |= (1<<11)|(1<<3)|(1<<8)|1;		// start timer,auto reload

	f_ucChar = 0;
	f_nKeyPress = 0;
	rGPBCON = rGPBCON & 0xFFFFFA;
	while(f_ucChar != 0xFF)			//Press Fun to exit
	{
		while(!f_nKeyPress);
		f_nKeyPress = 0;
		iic_read_keybd(0x70, 0x1, &f_ucChar);
		f_ucChar = key_set(f_ucChar);
	
		if(f_ucChar<5)
			cEnChange0=1;
		else
			cEnChange1=1;
//		while(cEnChange0);
//		while(cEnChange1);
	}
	rGPBCON = rGPBCON & 0xFFFFF5;
	rINTMSK |=(BIT_TIMER0|BIT_TIMER1);
	rTCON &= 0xffe;							// stop timer
}

⌨️ 快捷键说明

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