📄 uart.c
字号:
#define __UART
#include "uart.h"
#undef __UART
//********************** Global Variable **********************
//----- 异步串行I/O口的配置参数 -----
uchar UartReceTimerOut[3]; //串口接收超时
uchar UartReceLen[3]; //串口接收长度
uchar UartSendLens[3]; //串口发送长度
uchar UartSendPosi[3]; //当前数据的位置
uchar UartReceBuf[3][256]; //串口接收缓冲区
uchar UartSendBuf[3][256]; //串口发送缓冲区
//*************************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 串口中断服务入口.
// 描述: 根据串口号选择相应的串口中断服务程序.
//
// [参数表]
// UartNo: 串口号.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void HandleUart(uchar UartNo)
{
S3C24X0_INTERRUPT * const inter = S3C24X0_GetBase_INTERRUPT();
switch(UartNo) // 根据串口号标记中断, 更新中断挂起寄存器
{
case UART0: //串口0中断
ClearPending(BIT_UART0);
break;
case UART1: //串口1中断
ClearPending(BIT_UART1);
break;
case UART2: //串口2中断
ClearPending(BIT_UART2);
break;
default: break;
}
if ((~inter->eINTSUBMSK ) & inter->eSUBSRCPND & UartRXD(UartNo) )
{
// UART 接收中断
inter->eSUBSRCPND = UartRXD(UartNo);
UartReceve(UartNo);
}
else if ((~inter->eINTSUBMSK ) & inter->eSUBSRCPND & UartTXD(UartNo) )
{
// UART 发送中断
inter->eSUBSRCPND = UartTXD(UartNo);
UartSend(UartNo);
}
else if ((~inter->eINTSUBMSK ) & inter->eSUBSRCPND & UartERR(UartNo) )
{
//UART 中断错误
inter->eSUBSRCPND = UartERR(UartNo);
}
}//HandleUart()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 串口接收中断服务.
//
// [参数表]
// port: 串口号. 0-UART0; 1-UART1; 2-UART2.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void UartReceve(uchar port)
{
UartReceTimerOut[port] = 10;
UartReceBuf[port][UartReceLen[port]++] = UartRecByte(port);
UartReceLen[port] &= 0xFF;
}//UartReceve()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 串口发送中断服务.
//
// [参数表]
// port: 串口号. 0-UART0; 1-UART1; 2-UART2.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void UartSend(uchar port)
{
if(UartSendLens[port] > 0)
{
UartSendByte(port,UartSendBuf[port][UartSendPosi[port]++]);
UartSendLens[port]--;
}
else
UartSendLens[port] = 0;
}//UartSend()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 串口发送单字节.
//
// [参数表]
// port: 串口号. 0-UART0; 1-UART1; 2-UART2.
// c: 待发送字节.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void UartSendByte (uchar port, uchar c)
{
S3C24X0_UART * const uart = S3C24X0_GetBase_UART(port);
uart->UTXH = c;
}//UartSendByte()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 串口接收单字节.
//
// [参数表]
// port: 串口号. 0-UART0; 1-UART1; 2-UART2.
//
// 返回: 串口接收到的数据(单字节).
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int UartRecByte (uchar port)
{
S3C24X0_UART * const uart = S3C24X0_GetBase_UART(port);
return uart->URXH & 0xff;
}//UartRecByte()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 启动串口发送.
// 描述: 通过串口发送数据数组的第一个字节, 并触发串口发送中断, 后续字节通过中断发送.
//
// [参数表]
// port: 串口号. 0-UART0; 1-UART1; 2-UART2.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void UartStartSend(uchar port)
{
UartSendPosi[port] = 1; // 串口发送数据数组指针指向下一数据
UartSendByte(port,UartSendBuf[port][0]); // 串口发送第一个数据, 并触发串口发送中断
UartReceLen[port] = 0;
}//UartStartSend()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 串口打印.
// 描述: 通过串口输出格式字符串.
//
// [参数表]
// fmt: 格式字符串始地址.
// ...: 格式参数
//
// 注: (1) 本函数所需的变量类型在stdarg.h中声明, vsprintf函数需要进行外部声明.
// (2) 串口号在头文件中进行宏定义.
// (3) 当需要输出回车时, 最好用转义字符"\r\n"; 仅仅用"\n"上位机可能无法有效响应回车.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void UARTprintf (char *fmt, ...)
{
va_list ap; // 虚拟参数列表
va_start(ap,fmt); // 初始化格式字符串
vsprintf((char *)UartSendBuf[UART_PRINT_PORT],fmt,ap); // 将格式字符串输出到串口发送缓冲区
UartSendLens[UART_PRINT_PORT] = strlen((char *)UartSendBuf[UART_PRINT_PORT])-1; // 计算串口发送长度
UartStartSend(UART_PRINT_PORT); // 开始串口发送
va_end(ap); // 撤销虚拟参数列表
// 延时等待, 确保字符串能完整发送
if( UartSendLens[UART_PRINT_PORT] <= 20)
udelay(2000); // 少于20个字符, 延时2ms
else if( UartSendLens[UART_PRINT_PORT] <= 50 )
udelay(4000); // 少于50个字符, 延时4ms
else if( UartSendLens[UART_PRINT_PORT] <= 120 )
udelay(10000); // 少于120个字符, 延时10ms
else
udelay(20000); // 延时20ms (最大发送字符数为256)
}//Uartprintf()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -