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

📄 usart.c

📁 在ads1.2下调试AT91RM9200的PWM功能测试程序源码
💻 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 + -