?? pwm_test.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 + -