?? 2440lib.c
字號:
{
if(isupper(string[i]))
result = (result<<4) + string[i] - 'A' + 10;
else
result = (result<<4) + string[i] - 'a' + 10;
}
else
result = (result<<4) + string[i] - '0';
}
result = minus ? (-1*result):result;
}
return result;
}
//*****************************************************************************
//get a number for the uart
//*****************************************************************************
int Uart_GetIntNum_GJ(void)
{
char string[16] ;
char *p_string = string ;
char c;
int i = 0 ;
int data = 0 ;
while( ( c = Uart_Getch()) != '\r' )
{
if(c=='\b') p_string--;
else *p_string++=c;
Uart_SendByte( c ) ;
}
*p_string = '\0';
i = 0 ;
while( string[i] != '\0' )
{
data = data * 10 ;
if( string[i]<'0'||string[i]>'9' )
return -1 ;
data = data + ( string[i]-'0' ) ;
i++ ;
}
return data ;
}
//*****************************************************************************
//=====================================================================
void Uart_SendByte(int data)
{
if(whichUart==0)
{
if(data=='\n')
{
while(!(rUTRSTAT0 & 0x2));
// Delay(1); //because the slow response of hyper_terminal
WrUTXH0('\r');
}
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
// Delay(1);
WrUTXH0(data);
}
else if(whichUart==1)
{
if(data=='\n')
{
while(!(rUTRSTAT1 & 0x2));
//Delay(1); //because the slow response of hyper_terminal
rUTXH1 = '\r';
}
while(!(rUTRSTAT1 & 0x2)); //Wait until THR is empty.
//Delay(1);
rUTXH1 = data;
}
else if(whichUart==2)
{
if(data=='\n')
{
while(!(rUTRSTAT2 & 0x2));
//Delay(1); //because the slow response of hyper_terminal
rUTXH2 = '\r';
}
while(!(rUTRSTAT2 & 0x2)); //Wait until THR is empty.
//Delay(1);
rUTXH2 = data;
}
}
//====================================================================
void Uart_SendString(char *pt)
{
while(*pt)
Uart_SendByte(*pt++);
}
//=====================================================================
//If you don't use vsprintf(), the code size is reduced very much.
void Uart_Printf(char *fmt,...)
{
va_list ap;
char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
Uart_SendString(string);
va_end(ap);
}
//**************************[ BOARD LED ]*********************************
void Led_Display(int data)
{
//Active is low.(LED On)
// GPF7 GPF6 GPF5 GPF4
//nLED_8 nLED4 nLED_2 nLED_1
// rGPFDAT = (rGPFDAT & 0xf) | !((data & 0xf)<<4);
// rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);
//Active is low.(LED On)
// GPF7 GPF6 GPF5 GPF4
//nLED_8 nLED4 nLED_2 nLED_1
// rGPFDAT = (rGPFDAT & 0xf) | !((data & 0xf)<<4);
rGPBDAT = (rGPBDAT & ~(0xf<<5)) | ((~data & 0xf)<<5);
//rGPCDAT = (rGPBDAT & ~(0xf<<5)) | ((~data & 0xf0)<<5);
}
//***************************[ BOARD BEEP ]*******************************
/*
void Beep(U32 freq, U32 ms)
{
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 2;
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8
rTCNTB0 = (PCLK>>7)/freq;
rTCMPB0 = rTCNTB0>>1; // 50%
rTCON &= ~0x1f;
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2; //clear manual update bit
Delay(ms);
rGPBCON &= ~3; //set GPB0 as output
rGPBCON |= 1;
rGPBDAT &= ~1;
}*/
void Buzzer_Freq_Set( U32 freq )
{
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 2;
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8
rTCNTB0 = (PCLK>>7)/freq;
rTCMPB0 = rTCNTB0>>1; // 50%
rTCON &= ~0x1f;
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2; //clear manual update bit
}
void Buzzer_Stop( void )
{
rGPBCON &= ~3; //set GPB0 as output
rGPBCON |= 1;
rGPBDAT &= ~1;
}
//***************************[ BOARD BEEP ]*******************************
void Beep(U32 freq, U32 ms)
{
Buzzer_Freq_Set( freq ) ;
Delay( ms ) ;
Buzzer_Stop() ;
}
/****************************************************************************
【功能說明】蜂鳴器PWM測試
****************************************************************************/
void BUZZER_PWM_Test( void )
{
U16 freq = 1000 ;
Uart_Printf( "\nBUZZER TEST ( PWM Control )\n" );
Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !\n" ) ;
Uart_Printf( "Press 'ESC' key to Exit this program !\n\n" );
Buzzer_Freq_Set( freq ) ;
while( 1 )
{
U8 key = Uart_Getch();
if( key == '+' )
{
if( freq < 20000 )
freq += 10 ;
Buzzer_Freq_Set( freq ) ;
}
if( key == '-' )
{
if( freq > 11 )
freq -= 10 ;
Buzzer_Freq_Set( freq ) ;
}
Uart_Printf( "\tFreq = %d\n", freq ) ;
if( key == ESC_KEY )
{
Buzzer_Stop() ;
return ;
}
}
}
//********************** BOARD LCD backlight ]****************************
void LcdBkLtSet(U32 HiRatio)
{
#define FREQ_PWM1 1000
if(!HiRatio)
{
rGPBCON = rGPBCON & (~(3<<2)) | (1<<2) ; //GPB1設(shè)置為output
rGPBDAT &= ~(1<<1);
return;
}
rGPBCON = rGPBCON & (~(3<<2)) | (2<<2) ; //GPB1設(shè)置為TOUT1
if( HiRatio > 100 )
HiRatio = 100 ;
rTCON = rTCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1
rTCFG0 &= 0xffffff00; // set Timer 0&1 prescaler 0
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= 0xffffff0f; // set Timer 1 MUX 1/16
rTCFG1 |= 0x00000030; // set Timer 1 MUX 1/16
rTCNTB1 = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low
rTCMPB1 = ( rTCNTB1*(100-HiRatio))/100 ; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high
rTCON = rTCON & (~(0xf<<8)) | (0x0e<<8) ;
//自動重裝,輸出取反關(guān)閉,更新TCNTBn、TCMPBn,死區(qū)控制器關(guān)閉
rTCON = rTCON & (~(0xf<<8)) | (0x0d<<8) ; //開啟背光控制
}
/****************************************************************************
【功能說明】LCD背光亮度控制,PWM控制占空比
****************************************************************************/
void LCD_BackLight_Control( void )
{
U8 HiRatio = 50 ;
Uart_Printf( "\nNOTE : ONLY SOME type LCD kit SUPPORT backlight adjust!!!\n" ) ;
Uart_Printf( "Press +/- to increase/reduce the light of LCD !\n" ) ;
Uart_Printf( "Press 'ESC' to Exit this test program !\n\n" );
LcdBkLtSet( HiRatio ) ;
while( 1 )
{
U8 key = Uart_Getch();
if( key == '+' )
{
if( HiRatio < 100 )
HiRatio += 1 ;
}
if( key == '-' )
{
if( HiRatio > 1 )
HiRatio -= 1 ;
}
if( key == ESC_KEY ) break ;
LcdBkLtSet( HiRatio ) ;
Uart_Printf( "LCD backlight HiRatio %d\n", HiRatio ) ;
}
}
//*************************[ Timer ]********************************
void Timer_Start(int divider) //0:16us,1:32us 2:64us 3:128us
{
rWTCON = ((PCLK/1000000-1)<<8)|(divider<<3); //Watch-dog timer control register
rWTDAT = 0xffff; //Watch-dog timer data register
rWTCNT = 0xffff; //Watch-dog count register
// Watch-dog timer enable & interrupt disable
rWTCON = (rWTCON & ~(1<<5) & ~(1<<2)) |(1<<5);
}
//=================================================================
int Timer_Stop(void)
{
rWTCON = ((PCLK/1000000-1)<<8);
return (0xffff - rWTCNT);
}
//*************************[ MPLL ]*******************************
void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
{
rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
}
//************************[ HCLK, PCLK ]***************************
/*
// for 2410.
void ChangeClockDivider(int hdivn,int pdivn)
{
// hdivn,pdivn FCLK:HCLK:PCLK
// 0,0 1:1:1
// 0,1 1:1:2
// 1,0 1:2:2
// 1,1 1:2:4
rCLKDIVN = (hdivn<<1) | pdivn;
if(hdivn)
MMU_SetAsyncBusMode();
else
MMU_SetFastBusMode();
}
*/
// Modified for 2440.
void ChangeClockDivider(int hdivn_val,int pdivn_val)
{
int hdivn=2, pdivn=0;
// hdivn_val (FCLK:HCLK)ratio hdivn
// 11 1:1 (0)
// 12 1:2 (1)
// 13 1:3 (3)
// 14 1:4 (2)
// pdivn_val (HCLK:PCLK)ratio pdivn
// 11 1:1 (0)
// 12 1:2 (1)
switch(hdivn_val) {
case 11: hdivn=0; break;
case 12: hdivn=1; break;
case 13:
case 16: hdivn=3; break;
case 14:
case 18: hdivn=2; break;
}
switch(pdivn_val) {
case 11: pdivn=0; break;
case 12: pdivn=1; break;
}
//Uart_Printf("Clock division change [hdiv:%x, pdiv:%x]\n", hdivn, pdivn);
rCLKDIVN = (hdivn<<1) | pdivn;
switch(hdivn_val) {
case 16: // when 1, HCLK=FCLK/8.
rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8);
break;
case 18: // when 1, HCLK=FCLK/6.
rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<9);
break;
}
if(hdivn!=0)
MMU_SetAsyncBusMode();
else
MMU_SetFastBusMode();
}
//**************************[ UPLL ]*******************************
void ChangeUPllValue(int mdiv,int pdiv,int sdiv)
{
rUPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
}
//*************************[ General Library ]**********************
void * malloc(unsigned nbyte)
//Very simple; Use malloc() & free() like Stack
//void *mallocPt=Image$$RW$$Limit;
{
void *returnPt = mallocPt;
mallocPt = (int *)mallocPt+nbyte/4+((nbyte%4)>0); //To align 4byte
if( (int)mallocPt > HEAPEND )
{
mallocPt = returnPt;
return NULL;
}
return returnPt;
}
//-------------------------------------------------------------------
void free(void *pt)
{
mallocPt = pt;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -