📄 uart_driver.c
字号:
/*
;************************************************************************************************************
;* 江西师范大学理电学院创新中心
;*
;* 创新研发小组
;*--------------------------------------------- 文件信息 -----------------------------------------------------
;*
;* 文件名称 : Uart_driver.c
;* 文件功能 : 该文件为串口的驱动。
;* 补充说明 :
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : zhouhong
;* 修改日期 : 2006/04/20
;* 版本声明 : V1.0.1
;*-------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 :
;* 创建日期 :
;* 版本声明 :
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/
#include "..\..\Startup44b0\inc\44b.h"
#include "..\..\Startup44b0\inc\44blib.h"
#include "..\..\Startup44b0\inc\option.h"
#include "..\inc\Uart_driver.h"
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
static int whichUart=0; //串口选择变量
/*
*************************************************************************************************************
- 函数名称 : Uart_Init(int mclk,int baud,char port)
- 函数说明 : 串口初始化
- 输入参数 : mclk,baud,port
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_Init(int mclk,int baud,char port)
{
int i;
if (mclk == 0)
{
mclk = MCLK;
}
i = mclk / (baud * 16); // 圆整 (int)((mclk/16.)/baud + 0.5) -1;
if (port == 0)
{ //UART0 配置各控制寄存器
rUFCON0 = 0x0; // 禁用 FIFO
rUMCON0 = 0x0;
rULCON0=0x3; //正常模式,无奇偶校验,一个停止位,8个数据位
//rULCON0=0x7; //正常模式,无奇偶校验,两个停止位,8个数据位
rUCON0=0x245; //RX边沿触发,TX电平触发,禁用延时中断,使用RX 错误中断,正常操作模式,中断请求或表决模式
rUBRDIV0 = i; //( (int)(mclk/16/baud + 0.5) -1 );
}
else if (port == 1)
{ //UART0 配置各控制寄存器
rUFCON1 = 0x0; // 禁用 FIFO
rUMCON1 = 0x0;
rULCON1 = 0x3; //正常模式,无奇偶校验,一个停止位,8个数据位
//rULCON1 = 0x7; //正常模式,无奇偶校验,两个停止位,8个数据位
rUCON1 = 0x245; //RX边沿触发,TX电平触发,禁用延时中断,使用RX 错误中断,正常操作模式,中断请求或表决模式
rUBRDIV1 = i; //( (int)(mclk/16./baud + 0.5) -1 );
}
for(i=0;i<100;i++);
}
/*
*************************************************************************************************************
- 函数名称 : Uart_Select
- 函数说明 : 串口的选择
- 输入参数 : 串口0,1
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_Select(int ch)
{
whichUart=ch;
}
/*
*************************************************************************************************************
- 函数名称 : Uart_TxEmpty(int ch)
- 函数说明 : 等待串口空
- 输入参数 : 串口端口 ch
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_TxEmpty(int ch)
{
if(ch==0)
while(!(rUTRSTAT0 & 0x4)); //wait until tx shifter is empty.
else
while(!(rUTRSTAT1 & 0x4)); //wait until tx shifter is empty.
}
/*
*************************************************************************************************************
- 函数名称 : Uart_Getch
- 函数说明 : 选择接收数据就绪的串口
- 输入参数 : 无
- 输出参数 : RdURXH0(),RdURXH1()
*************************************************************************************************************
*/
char Uart_Getch(void)
{
if(whichUart==0)
{
while(!(rUTRSTAT0 & 0x1)); //Receive data read
return RdURXH0();
}
else
{
while(!(rUTRSTAT1 & 0x1)); //Receive data ready
return rURXH1;
}
}
/*
*************************************************************************************************************
- 函数名称 : Uart_GetKey
- 函数说明 : 得到串口的键值
- 输入参数 : port
- 输出参数 : RdURXH0()或0,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;
}
}
/*
*************************************************************************************************************
- 函数名称 : Uart_GetString(char *string)
- 函数说明 : 串口得到字符串
- 输入参数 : string
- 输出参数 : 无
*************************************************************************************************************
*/
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');
}
/*
*************************************************************************************************************
- 函数名称 : Uart_GetIntNum()
- 函数说明 : 从串口得到数字
- 输入参数 : 无
- 输出参数 : 得到的数字值
*************************************************************************************************************
*/
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;
}
/*
*************************************************************************************************************
- 函数名称 : Uart_SendByte(int data)
- 函数说明 : 串口发送字节
- 输入参数 : 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;
}
}
/*
*************************************************************************************************************
- 函数名称 : Uart_SendString(char *pt)
- 函数说明 : 串口发送字符串
- 输入参数 : pt
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_SendString(char *pt)
{
while(*pt)
Uart_SendByte(*pt++);
}
/*
*************************************************************************************************************
- 函数名称 : Uart_Printf(char *fmt,...)
- 函数说明 : 串口打印字符
- 输入参数 : fmt ...
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_Printf(char *fmt,...) //如果您不使用 vsprintf(), 代码量将大幅增加
{
va_list ap;
char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
Uart_SendString(string);
va_end(ap);
}
/*
*************************************************************************************************************
*- 结束文件 -*
*************************************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -