📄 usart.c
字号:
//uart.C
//Catinux 040811
// Include Standart LIB files
#include "AT91RM9200.h"
#include "lib_AT91RM9200.h"
#include "eb55.h"
#include "Usart.h"
//#include "timer.h"
//#include "includes.h"
//引用的汇编外部函数
extern void usart2_asm_irq_handler(void);
extern void usart1_asm_irq_handler(void);
extern void debugport_asm_irq_handler(void);
///extern OS_EVENT *SemNewRx;
//串口状态标志
char flagUsTxEmpty; //串口发送空闲
char flagUsTxEmpty_DBGU; //DBGU串口发送空闲
char flagUsTimeOut; //串口数据超时
char flagUsOVRE; //串口数据接收覆盖
//char flagUsFrameReceived; //数据串接收完毕
//char flagUsFrameTransmitted;//数据串发送完毕
//char flagUsByteFrameError; //串口数据接收字节帧错误
//char flagUsPareError; //串口数据接收字节校验位错误
int UsOverCnt;//串口被覆盖的数据个数,用于检错
//串口缓冲定义
char DBGU_RX_OVER_FLAG,IRDA_RX_OVER_FLAG;
S_USART_BUFFER USART0_BUFFER;
S_USART_BUFFER USART1_BUFFER;
S_USART_BUFFER USART2_BUFFER;
S_USART_BUFFER DEBUG_BUFFER;
PS_USART_BUFFER pUSART0_BUFFER = &USART0_BUFFER;
PS_USART_BUFFER pUSART1_BUFFER = &USART1_BUFFER;
PS_USART_BUFFER pUSART2_BUFFER = &USART2_BUFFER;
PS_USART_BUFFER pDEBUG_BUFFER = &DEBUG_BUFFER;
//---------------------------------- 外部函数 -----------------------------
//返回接收缓冲的字节数量
int Us_GetRxCurIndex(char UsartNo)
{
PS_USART_BUFFER pUsart_Buffer;
switch(UsartNo)
{
case COM0:
pUsart_Buffer = pUSART0_BUFFER;
break;
case COM1:
pUsart_Buffer = pUSART1_BUFFER;
break;
}
return pUsart_Buffer->RxCurIndex;
}
//接收字符串(串口通道COM0,1,2 接收指针,接收数量)
int Us_RecvStr(char UsartNo,char *pBuffer,int szBuffer)
{
AT91PS_USART pUSART;
PS_USART_BUFFER pUsart_Buffer;
int i,szRecved;
switch(UsartNo)
{
case COM0:
pUSART = AT91C_BASE_US0;
pUsart_Buffer = pUSART0_BUFFER;
break;
case COM1:
pUSART = AT91C_BASE_US1;
pUsart_Buffer = pUSART1_BUFFER;
break;
}
AT91F_US_DisableRx(pUSART); //暂停接收
szRecved = (szBuffer <= pUsart_Buffer->RxCurIndex)? szBuffer : 0;
if(szRecved>0)
{
for(i=0;i<szRecved;i++)
{
pBuffer[i] = *(pUsart_Buffer->RxHead++); //出队,读取接收缓冲
if( pUsart_Buffer->RxHead >= (pUsart_Buffer->RxBuffer+RX_MAX) )
pUsart_Buffer->RxHead = pUsart_Buffer->RxBuffer;//队列指针调整
}
pUsart_Buffer->RxCurIndex -= szRecved; //队列长度更新
}
AT91F_US_EnableRx(pUSART); //恢复接收
return szRecved;
}
//发送字符串,
int Us_SendStr(char UsartNo,char * pBuffer,int szBuffer)
{
AT91PS_USART pUSART;
PS_USART_BUFFER pUsart_Buffer;
int i,szSended;
switch(UsartNo)
{
case COM0:
pUSART = AT91C_BASE_US0;
pUsart_Buffer = pUSART0_BUFFER;
break;
case COM1:
pUSART = AT91C_BASE_US1;
pUsart_Buffer = pUSART1_BUFFER;
break;
}
AT91F_US_DisableTx(pUSART); //暂停发送 US_CR = AT91C_US_TXDIS;
//如果缓冲区不足,则不发,直接返回
szSended = (szBuffer <= (TX_MAX - pUsart_Buffer->TxCurIndex)) ? szBuffer : 0;
if(szSended>0)
{
for(i=0;i<szSended;i++)
{
*(pUsart_Buffer->TxTail++) = pBuffer[i]; //入队,写入发送缓冲
if( pUsart_Buffer->TxTail >= (pUsart_Buffer->TxBuffer + TX_MAX) )
pUsart_Buffer->TxTail = pUsart_Buffer->TxBuffer;//队列指针调整
}
pUsart_Buffer->TxCurIndex += szSended; //队列长度更新
}
AT91F_US_EnableTx(pUSART); //恢复发送,启动发送//US_CR = AT91C_US_TXEN;
return szSended;
}
//清空收发缓冲
void ResetRxBuffer(char UsartNo)
{
PS_USART_BUFFER pUsart_Buffer;
switch(UsartNo)
{
case COM0:
pUsart_Buffer = pUSART0_BUFFER;
break;
case COM1:
pUsart_Buffer = pUSART1_BUFFER;
break;
}
pUsart_Buffer->RxCurIndex = 0;
pUsart_Buffer->RxHead = pUsart_Buffer->RxBuffer;
pUsart_Buffer->RxTail = pUsart_Buffer->RxBuffer;
UsOverCnt = 0;
}
void ResetTxBuffer(char UsartNo)
{
PS_USART_BUFFER pUsart_Buffer;
switch(UsartNo)
{
case COM0:
pUsart_Buffer = pUSART0_BUFFER;
break;
case COM1:
pUsart_Buffer = pUSART1_BUFFER;
break;
}
pUsart_Buffer->TxCurIndex = 0;
pUsart_Buffer->TxHead = pUsart_Buffer->TxBuffer;
pUsart_Buffer->TxTail = pUsart_Buffer->TxBuffer;
flagUsTxEmpty = TRUE;
}
//Debug port 初始化
void DEBUGport_Init ( void )
{
AT91PS_USART pUSART;
//设置DBGU 口的中断方式 收|发
AT91F_US_EnableIt((AT91PS_USART)AT91C_BASE_DBGU, AT91C_US_RXRDY | AT91C_US_TXRDY | AT91C_US_OVRE );
//设置中断句柄* open Debug port interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_SYS, USART0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, debugport_asm_irq_handler);
//允许中断
// AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);
}
//--------------------------- 中断函数 ------------------------------------
//串口中断处理,目前为3个串口共用
//入口参数: 串口号指针,如AT91C_BASE_US0,AT91C_BASE_US1,AT91C_BASE_US2
void Debugport_c_irq_handler(AT91PS_USART USART_pt)
{
unsigned int status;
int RxTxData;//收到的,或待发送的一字节数据
//unsigned char RxChar;
PS_USART_BUFFER pUsart_Buffer;
pUsart_Buffer = pDEBUG_BUFFER;
//* get Usart status register
status = USART_pt->US_CSR;
if( status & AT91C_US_RXRDY) //US_RHR内有数据待读取
{
RxTxData = AT91F_US_GetChar(USART_pt); //读US_RHR
pUsart_Buffer->RxBuffer[pUsart_Buffer->RxCount++]=RxTxData;
if(RxTxData==0x0d || RxTxData==0x0a)
{
DBGU_RX_OVER_FLAG=1;
pUsart_Buffer->RxBuffer[pUsart_Buffer->RxCount++]=0x0;
}
}
if( status & AT91C_US_TXRDY) //US_THR空,可以写入下一个待发数据
{
if(pUsart_Buffer->TxCurIndex>0) //如果发送缓冲非空,则发送数据
{
RxTxData = pUsart_Buffer->TxBuffer[pUsart_Buffer->TxCount++]; //出队,读取发送缓冲
pUsart_Buffer->TxCurIndex--; //队列长度更新
if(RxTxData!=0x0)
AT91F_US_PutChar (USART_pt,RxTxData);//写US_THR
}
else
{
AT91F_US_DisableTx(USART_pt);
flagUsTxEmpty_DBGU = TRUE; //发送缓冲已空
}
}
if( status & AT91C_US_OVRE) //US_RHR未及时读取,被新到数据覆盖
{
RxTxData = AT91F_US_GetChar(USART_pt); //读US_RHR
*(pUsart_Buffer->RxTail++) = RxTxData; //入队,写入接收缓冲
if( pUsart_Buffer->RxTail >= (pUsart_Buffer->RxBuffer+RX_MAX) )
pUsart_Buffer->RxTail = pUsart_Buffer->RxBuffer;//队列指针调整
pUsart_Buffer->RxCurIndex++; //队列长度更新
flagUsOVRE = TRUE; //设覆盖标记
UsOverCnt++; //覆盖次数++
}
//* Reset the status bit
USART_pt->US_CR = AT91C_US_RSTSTA;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -