⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 基于S3C2410和SM501的彩屏控制器程序
💻 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 + -