📄 uart.c
字号:
#include "config.h"
void UartInit(int uartnum,int baud)
{
uint16 Fdiv;
if(uartnum==0)
{
PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05; /* 选择管脚为UART0 */
U0LCR = 0x80; /* 允许访问分频因子寄存器 */
Fdiv = (Fpclk / 16) / baud; /* 设置波特率 */
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03; /* 禁止访问分频因子寄存器 */
/* 且设置为8,1,n */
U0FCR = 0x07; /* 使能并重启Rx、Tx缓冲寄存器 */ /* 初始化FIFO */
U0IER = IER_RBR | IER_THRE | IER_RLS;
install_irq(VIC_UART0,(void *)Uart0_Exception);
}
}
void Uart_SendByte(int uartnum,INT8U c)
{
switch(uartnum)
{
case 0:
U0THR=c;
while((U0LSR & 0x40) == 0); // 等待数据发送完毕
break;
case 1:
U1THR=c;
while((U1LSR & 0x40) == 0); // 等待数据发送完毕
break;
default:
break;
}
}
void Uart_SendString(int uartnum,char * s)
{
while(*s!=0)
{
Uart_SendByte(uartnum,*s);
s++;
}
}
#define SENDBUFLEN 20
void Uart_Printf(char * fmt)
{
#if 0
static INT8U show_buf[SENDBUFLEN];
memset(show_buf,0,sizeof(show_buf));
va_list vat;
va_start(vat,fmt);
vsprintf(show_buf,fmt,vat);
va_end(vat);
Uart_SendString(0,show_buf);
#else
Uart_SendString(0,fmt);
#endif
}
/*****************************************************************************
** 函数名 : UART0Handler
**
** 功能描述: UART0中断处理
**
*****************************************************************************/
void Uart0_Exception(void)
{
uint8 IIRValue, LSRValue;
uint8 Dummy;
OS_ENTER_CRITICAL(); /* */
IIRValue = U0IIR;
Dummy = U0RBR; /* 读RBR寄存器清楚中断 */
LSRValue = U0LSR;
VICVectAddr = 0;
OS_EXIT_CRITICAL();
Dummy = Dummy; /* 防止编译器警告 */
IIRValue >>= 1;
IIRValue &= 0x07; /* 中断标识位1~3 */
if ( IIRValue == IIR_RLS ) /* 接收线状态*/
{
if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) )
{
Uart_SendString(0,"Help~~~");
return;
}
if ( LSRValue & LSR_RDR ) /* 接收数据准备好 */
{
/* 如果在接收线上没有错误, 正常准备好, 则保存数据.读RBR将清楚中断 */
Uart_SendString(0,"Thankyou for ~~~"); /* write the code yourself*/
return ;
}
}
else if ( IIRValue == IIR_RDA ) /* 接收数据可用 */
{
Uart_SendString(0,"UART0中断--");
return ;
}
else if ( IIRValue == IIR_CTI ) /* 字符超时显示 */
{
/**/
}
else if ( IIRValue == IIR_THRE ) /* THRE, 传送寄存器空 */
{
if ( LSRValue & LSR_THRE )
{
/**/
}
else
{
/* */
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -