📄 44blib.c
字号:
/****************************************************************************
【文 件 名 称】44blib.c
【功 能 描 述】三星S3C44B0X板端口初始化和串口通用子程序代码
【程 序 版 本】2.0
【创建人及创建日期】龚俊//2003-07-02 15:27
【修改人及修改日期】龚俊//2004-2-16 9:33
****************************************************************************/
//***************************************************************************
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include "..\inc\def.h"
#include "..\inc\option.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
/****************************************************************************
【功能说明】IO端口功能、方向设定
****************************************************************************/
void Port_Init(void)
{
// PORT A GROUP
/* BIT 9 8 7 6 5 4 3 2 1 0 */
/* O A23 A22 A21 A20 A19 A18 A17 A16 A0 */
/* 0 1 1 1 1 1 1 1 1 1 */
rPCONA = 0x1ff;
// PORT B GROUP
/* BIT 10 9 8 7 6 5 4 3 2 1 0 */
/* /CS5 /CS4 /CS3 /CS2 /CS1 nWBE3 nWBE2 /SRAS /SCAS SCLK SCKE */
/* NC NC 8019 NC NC NC NC Sdram Sdram Sdram Sdram */
/* 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1 */
rPDATB = 0x04f;
rPCONB = 0x10f;
//PORT C GROUP
//BUSWIDTH=16 */
/* PC15 14 13 12 11 10 9 8 */
/* o o RXD1 TXD1 o o o o */
/* NC NC NC NC NC NC EL_ON nDISP_ON */
/* 00 00 00 00 00 00 01 01 */
/* PC7 6 5 4 3 2 1 0 */
/* o o o o o o o o */
/* VD4 VD5 VD6 VD7 NC NC NC NC */
/* 11 11 11 11 00 00 00 00 */
rPDATC = 0x0000; //All IO is low
rPCONC = 0x0005ff00;
rPUPC = 0x3000; //PULL UP RESISTOR should be enabled to I/O
//PORT D GROUP
/* PORT D GROUP(I/O OR LCD) */
/* BIT7 6 5 4 3 2 1 0 */
/* VF VM VLINE VCLK VD3 VD2 VD1 VD0 */
/* 01 01 01 01 01 01 01 01 */
rPDATD= 0x55;
rPCOND= 0xaaaa;
rPUPD = 0x00;
//These pins must be set only after CPU's internal LCD controller is enable
//PORT E GROUP
/* Bit 8 7 6 5 4 3 2 1 0 */
/* ENDLAN NC led2 led1 led0 Beep RXD0 TXD0 NC */
/* 00 00 01 01 01 01 10 10 00 */
rPDATE = 0x157;
rPCONE = 0x1568;
rPUPE = 0xff;
//PORT F GROUP
/* Bit8 7 6 5 4 3 2 1 0 */
/* NC RXD1 TXD1 NC NC NC NC NC NC */
/* 000 010 010 000 00 00 00 00 00 */
rPDATF = 0x0;
rPCONF = 0x024000;
rPUPF = 0x1d3;
//PORT G GROUP
/* BIT7 6 5 4 3 2 1 0 */
/* EINT7 EINT6 EINT5 EINT4 EINT3 EINT2 EINT1 EINT0 */
/* KEY3 KEY2 KEY1 KEY0 NC NC ETH_INT NC */
/* 11 11 11 11 00 00 11 00 */
rPDATG = 0xff;
rPCONG = 0xff0c; //enable extint0 extint1
rPUPG = 0x00; //enabled pull up register
rSPUCR= 0x7; //D15-D0 pull-up disable
//rSPUCR= 0x6; //D15-D0 pull-up enable
}
/****************************************************************************
【功能说明】通用延时函数
****************************************************************************/
static int delayLoopCount = 400 ;
void Delay(int time)
{
int i,adjust=0;
if(time==0)
{
time=200;
adjust=1;
delayLoopCount=400;
rWTCON=((MCLK/1000000-1)<<8)|(2<<3); //MCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable
rWTDAT=0xffff;//for first update
rWTCNT=0xffff;//resolution=64us @any MCLK
rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); //Watch-dog timer start
}
for(;time>0;time--)
for(i=0;i<delayLoopCount;i++);
if(adjust==1)
{
rWTCON=((MCLK/1000000-1)<<8)|(2<<3);//Watch-dog timer stop
i=0xffff-rWTCNT; //1count->64us, 200*400 cycle runtime = 64*i us
delayLoopCount=8000000/(i*64); //200*400:64*i=1*x:100 -> x=80000*100/(64*i)
}
}
/****************************************************************************
【功能说明】选择串口通道为COM0或者COM1
****************************************************************************/
static int whichUart=0;
void Uart_Select(int ch)
{
whichUart=ch;
}
//***************************************************************************
/****************************************************************************
【功能说明】异步串行口初始化
****************************************************************************/
void Uart_Init(int mclk,int baud)
{
int i;
if(mclk==0)
mclk=MCLK;
rUFCON0=0x0; //FIFO disable
rUFCON1=0x0;
rUMCON0=0x0;
rUMCON1=0x0;
//UART0
rULCON0=0x3; //Normal,No parity,1 stop,8 bit
// rULCON0=0x7; //Normal,No parity,2 stop,8 bit
rUCON0=0x245; //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
rUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 );
//UART1
// rULCON1=0x7; //Normal,No parity,2 stop,8 bit
rULCON1=0x3;
rUCON1=0x245;
rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 );
for(i=0;i<100;i++);
}
//***************************************************************************
/****************************************************************************
【功能说明】从串口接收一个字符
****************************************************************************/
char Uart_Getch(void)
{
if(whichUart==0)
{
while(!(rUTRSTAT0 & 0x1)); //Receive data read
return RdURXH0();
}
else
{
while(!(rUTRSTAT1 & 0x1)); //Receive data ready
return rURXH1;
}
}
//***************************************************************************
/****************************************************************************
【功能说明】从串口接收一个字符,如果没有收到数据返回0
****************************************************************************/
char Uart_GetKey(void)
{
if(whichUart==0)
{
if(rUTRSTAT0 & 0x1) //Receive data ready
return RdURXH0();
else
return 0;
}
else
{
if(rUTRSTAT1 & 0x1) //Receive data ready
return rURXH1;
else
return 0;
}
}
//***************************************************************************
/****************************************************************************
【功能说明】从串口获取一个字符串
****************************************************************************/
void Uart_GetString(char *string)
{
char *string2=string;
char c;
while((c=Uart_Getch())!='\r') //输入字符不等于回车
{
if(c=='\b') //输入字符等于退格
{
if( (int)string2 < (int)string )
{
Uart_Printf("\b \b");
string--;
}
}
else
{
*string++=c;
Uart_SendByte(c);
}
}
*string='\0'; //内容为空
Uart_SendByte('\n'); //换行
}
//***************************************************************************
/****************************************************************************
【功能说明】从串口获取一个整型数
****************************************************************************/
int Uart_GetIntNum(void)
{
char str[8] ;
char *string=str;
int i = 0 ;
int data = 0 ;
Uart_GetString(string);
while( str[i] != '\0' )
{
data = data * 10 ;
if( str[i]<'0'||str[i]>'9' )
return -1 ;
data = data + ( str[i]-'0' ) ;
i++ ;
}
return data ;
}
//***************************************************************************
/****************************************************************************
【功能说明】向串口发送一个字节的整型数
****************************************************************************/
void Uart_SendByte(int data)
{
if(whichUart==0)
{
if(data=='\n')
{
while(!(rUTRSTAT0 & 0x2));
Delay(10); //because the slow response of hyper_terminal
WrUTXH0('\r');
}
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
Delay(10);
WrUTXH0(data);
}
else
{
if(data=='\n')
{
while(!(rUTRSTAT1 & 0x2));
Delay(10); //because the slow response of hyper_terminal
rUTXH1='\r';
}
while(!(rUTRSTAT1 & 0x2)); //Wait until THR is empty.
Delay(10);
rUTXH1=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);
if( whichUart == 0 )
while(!(rUTRSTAT0 & 0x4)); //wait until tx shifter is empty.
else
while(!(rUTRSTAT1 & 0x4)); //wait until tx shifter is empty.
}
//***************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -