?? 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 + -