📄 uart.c
字号:
/*******************************************************************************************************
**uart.c
********************************************************************************************************/
#define IN_UART
#include "config.h"
#define va_end(ap) ((void)(*(ap) = 0))
#define va_start(ap, parmN) (void)(*(ap) = __va_start(parmN))
// 串口选择 (为0时表示串口0,否则为串口1)
static uint8 g_uart_sel = 0;
typedef int *va_list[1];
static int whichUart=0;
/*********************************************************************************************************
** Function name: UART_Select
** Descriptions: 选择要操作的串口。(UART0--0,UART1--1)
** 选择串口后,必需调用一次UART_Init()进行初始化(只需要一次)。
** Input: no 要使用的串口
** Output: 返回上一次选用的串口
********************************************************************************************************/
int UART_Select(uint8 no)
{
int ret;
ret = g_uart_sel;
g_uart_sel = no;
return(ret);
}
/*********************************************************************************************************
** Function name: UART_Init
** Descriptions: 初始化串口。设置为8位数据位,1位停止位,无奇偶校验,波特率为UART_BPS
** Input: 无
** Output: 无
********************************************************************************************************/
void UART_Init(void)
{
int i;
if(g_uart_sel) // 判断是否为串口1
{
// I/O口设置 (GPH5,GPH4)
rGPHUP = rGPHUP | (0x03<<4);
rGPHCON = (rGPHCON & (~0x00000F00)) | (0x00000A00);
// 串口模式设置
rUFCON1 = 0x00; // 禁止FIFO功能
rUMCON1 = 0x00; // AFC(流控制)禁能
rULCON1 = 0x03; // 禁止IRDA,无奇偶校验,1位停止位,8位数据位
rUCON1 = 0x245; // 使用PCLK来生成波特率,发送中断为电平触发模式,接收中断为边沿触发模式,
// 禁止接收超时中断,使能接收错误中断,正常工作模式,中断或查询方式(非DMA)
// 串口波特率设置
rUBRDIV1=(int)(PCLK/16.0/UART_BPS + 0.5) -1;
}
else
{
// I/O口设置 (GPH3,GPH2)
rGPHUP = rGPHUP | (0x03<<2);
rGPHCON = (rGPHCON & (~0x000000F0)) | (0x000000A0);
// 串口模式设置
rUFCON0 = 0x00; // 禁止FIFO功能
rUMCON0 = 0x00; // AFC(流控制)禁能
rULCON0 = 0x03; // 禁止IRDA,无奇偶校验,1位停止位,8位数据位
rUCON0 = 0x245; // 使用PCLK来生成波特率,发送中断为电平触发模式,接收中断为边沿触发模式,
// 禁止接收超时中断,使能接收错误中断,正常工作模式,中断或查询方式(非DMA)
// 串口波特率设置
rUBRDIV0=(int)(PCLK/16.0/UART_BPS + 0.5) -1;
}
for(i=0;i<100;i++);
}
void Uart_Init1(int pclk,int baud)
{
int i;
if(pclk == 0)
pclk = PCLK;
rUFCON0 = 0x0; //UART channel 0 FIFO control register, FIFO disable
rUFCON1 = 0x0; //UART channel 1 FIFO control register, FIFO disable
rUFCON2 = 0x0; //UART channel 2 FIFO control register, FIFO disable
rUMCON0 = 0x0; //UART chaneel 0 MODEM control register, AFC disable
rUMCON1 = 0x0; //UART chaneel 1 MODEM control register, AFC disable
//UART0
rULCON0 = 0x3; //Line control register : Normal,No parity,1 stop,8 bits
// [10] [9] [8] [7] [6] [5] [4] [3:2] [1:0]
// Clock Sel, Tx Int, Rx Int, Rx Time Out, Rx err, Loop-back, Send break, Transmit Mode, Receive Mode
// 0 1 0 , 0 1 0 0 , 01 01
// PCLK Level Pulse Disable Generate Normal Normal Interrupt or Polling
rUCON0 = 0x245; // Control register
rUBRDIV0=( (int)(pclk/16./baud) -1 ); //Baud rate divisior register 0
// rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 ); //Baud rate divisior register 0
//UART1
rULCON1 = 0x3;
rUCON1 = 0x245;
rUBRDIV1=( (int)(pclk/16./baud) -1 );
//UART2
rULCON2 = 0x3;
rUCON2 = 0x245;
rUBRDIV2=( (int)(pclk/16./baud) -1 );
for(i=0;i<100;i++);
}
/*********************************************************************************************************
** Function name: UART_SendByte
** Descriptions: 向串口发送字节数据,并等待发送完毕。
** Input: data 要发送的数据
** Output: 无
********************************************************************************************************/
void UART_SendByte(uint8 data)
{
int i;
if(g_uart_sel)
{
while(!(rUTRSTAT1 & 0x02)); // 等待发送器为空
for(i=0; i<10; i++);
rUTXH1 = data; // 发送数据
}
else
{
while(!(rUTRSTAT0 & 0x02)); // 等待发送器为空
for(i=0; i<10; i++);
rUTXH0 = data; // 发送数据
}
}
/*********************************************************************************************************
** Function name: UART_SendStr
** Descriptions: 向串口发送一字符串。
** 对于'\n'字符,发送时会加入'\r'字符。
** Input: str 要发送的字符串的指针
** Output: 无
********************************************************************************************************/
void UART_SendStr(char const *str)
{
while(*str != '\0')
{
if(*str == '\n') UART_SendByte('\r');
UART_SendByte(*str++); // 发送数据
}
}
/*********************************************************************************************************
** Function name: UART_GetKey
** Descriptions: 从UART口读取一字节按键数据。
** 会一直等待,直到接收到1字节数据。
** Input: 无
** Output: 返回值即是读出值
********************************************************************************************************/
int UART_GetKey(void)
{
int i;
if(g_uart_sel)
{
while(!(rUTRSTAT1 & 0x1));
for(i=0; i<10; i++);
return(rURXH1);
}
else
{
while(!(rUTRSTAT0 & 0x1));
for(i=0; i<10; i++);
return(rURXH0);
}
}
char Uart_Getch(void)
{
if(whichUart==0)
{
while(!(rUTRSTAT0 & 0x1)); //Receive data ready
return RdURXH0();
}
else if(whichUart==1)
{
while(!(rUTRSTAT1 & 0x1)); //Receive data ready
return RdURXH1();
}
else if(whichUart==2)
{
while(!(rUTRSTAT2 & 0x1)); //Receive data ready
return RdURXH2();
}
}
void Uart_Printf(char *fmt,...)
{
va_list ap;
char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
UART_SendStr(string);
va_end(ap);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -