📄 uart.c
字号:
#define ULCON0 (*(volatile unsigned *)0x1d00000)
#define ULCON1 (*(volatile unsigned *)0x1d04000)
#define UCON0 (*(volatile unsigned *)0x1d00004)
#define UCON1 (*(volatile unsigned *)0x1d04004)
#define UFCON0 (*(volatile unsigned *)0x1d00008)
#define UFCON1 (*(volatile unsigned *)0x1d04008)
#define UMCON0 (*(volatile unsigned *)0x1d0000c)
#define UMCON1 (*(volatile unsigned *)0x1d0400c)
#define UTRSTAT0 (*(volatile unsigned *)0x1d00010)
#define UTRSTAT1 (*(volatile unsigned *)0x1d04010)
#define UERSTAT0 (*(volatile unsigned *)0x1d00014)
#define UERSTAT1 (*(volatile unsigned *)0x1d04014)
#define UFSTAT0 (*(volatile unsigned *)0x1d00018)
#define UFSTAT1 (*(volatile unsigned *)0x1d04018)
#define UMSTAT0 (*(volatile unsigned *)0x1d0001c)
#define UMSTAT1 (*(volatile unsigned *)0x1d0401c)
#define UBRDIV0 (*(volatile unsigned *)0x1d00028)
#define UBRDIV1 (*(volatile unsigned *)0x1d04028)
#define UTXH0 (*(volatile unsigned char *)0x1d00020)
#define UTXH1 (*(volatile unsigned char *)0x1d04020)
#define URXH0 (*(volatile unsigned char *)0x1d00024)
#define URXH1 (*(volatile unsigned char *)0x1d04024)
#define PCONC (*(volatile unsigned *)0x1d20010)
#define PCONE (*(volatile unsigned *)0x1d20028)
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "uart.h"
#define MCLK 60000000
static char whichUart = 0;
/****************************************************************************
【功能说明】选择串口(0或1)
****************************************************************************/
void Uart_Select(char ch)
{
whichUart=ch;
}
/****************************************************************************
【功能说明】串口初始化
****************************************************************************/
void Baud_Init(int baud)
{
UFCON0=0x0; //FIFO disable
UFCON1=0x0;
UMCON0=0x0;
UMCON1=0x0;
//UART0
ULCON0=0x3; //Normal,No parity,1 stop,8 bit
UCON0=0x245;
UBRDIV0=(MCLK/16/baud + 0.5)-1;
//UART1
ULCON1=0x3;
UCON1=0x245;
UBRDIV1=(MCLK/16/baud + 0.5)-1;
}
//串口初始化
void Uart_Init(char ch,int baud)
{
PCONC|=0xf<<24; //PC12~PC13:TXD1~RXD1
PCONE=(PCONE&(~(0xf<<2)))|(0xa<<2); //PE1~PE2: TXD0~RXD0
Uart_Select(ch);
Baud_Init(baud);
}
/****************************************************************************
【功能说明】从串口接收一个字符
****************************************************************************/
char Uart_Getch(void)
{
if(whichUart==0)
{
while(!(UTRSTAT0 & 0x1)); //Receive data read
return URXH0;
}
else
{
while(!(UTRSTAT1 & 0x1)); //Receive data ready
return URXH1;
}
}
/****************************************************************************
【功能说明】从串口获取一个字符串
****************************************************************************/
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[30];
char *string=str;
int base=10;
int minus=0;
int lastIndex;
int result=0;
int i;
Uart_GetString(string);
if(string[0]=='-')
{
minus=1;
string++;
}
if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
{
base=16;
string+=2;
}
lastIndex=strlen(string)-1;
if( string[lastIndex]=='h' || string[lastIndex]=='H' )
{
base=16;
string[lastIndex]=0;
lastIndex--;
}
if(base==10)
{
result=atoi(string);
result=minus ? (-1*result):result;
}
else
{
for(i=0;i<=lastIndex;i++)
{
if(isalpha(string[i]))
{
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;
}
//***************************************************************************
/****************************************************************************
【功能说明】向串口发送一个字节的整型数
****************************************************************************/
void Uart_SendByte(char data)
{
if(whichUart==0)
{
if(data=='\n')
{
while(!(UTRSTAT0 & 0x2));
UTXH0='\r';
}
while(!(UTRSTAT0 & 0x2)); //Wait until THR is empty.
UTXH0=data;
}
else
{
if(data=='\n')
{
while(!(UTRSTAT1 & 0x2));
UTXH1='\r';
}
while(!(UTRSTAT1 & 0x2)); //Wait until THR is empty.
UTXH1=data;
}
}
/****************************************************************************
【功能说明】向串口送出一串字符
****************************************************************************/
void Uart_SendString(char *pt)
{
while(*pt)
Uart_SendByte(*pt++);
}
/****************************************************************************
【功能说明】以标准输出格式向串口输出各种信息
****************************************************************************/
//if you don't use vsprintf(), the code size is reduced very much.
#define MAX_TBUF 1000
static char tbuf[MAX_TBUF]= {0, };
void Uart_Printf(char *fmt,...)
{
va_list v_list;
char *ptr;
int i= 0;
va_start(v_list, fmt); // Initialize variable arguments.
vsprintf(tbuf, fmt, v_list );
va_end(v_list);
ptr= tbuf;
while( (*ptr) && i<MAX_TBUF) {
Uart_SendByte(*ptr);
ptr++; i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -