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

📄 uart.cpp

📁 基于ARM 44b0的启动应到程序
💻 CPP
字号:

#include "Uart.h"


static int UartNum = 0;
/*
int iUartConfig(uint uiPort,ST_UART_CONFIG * pstUartConfig)
{

	volatile uint *  puiULCON[2] = {&rULCON0,&rULCON1};	//UART 线控制
	volatile uint *   puiUCON[2] = {&rUCON0,&rUCON1};	//UART 控制寄存器
	volatile uint *  puiUFCON[2] = {&rUFCON0,&rUFCON1};	//UART FIFO控制寄存器
	volatile uint * puiUBRDIV[2] = {&rUBRDIV0,&rUBRDIV1};	//UART 波特率分频寄存器
	volatile uint *  puiUMCON[2] = {&rUMCON0,&rUMCON1};	//UART MODEM控制寄存器

	(*puiULCON[uiPort]) = 0x00; // 初始化
	switch(pstUartConfig->parity) //奇偶
	{
		case COM_ODDPARITY:  
			(*puiULCON[uiPort]) |= (4<<3); 
			break;
		case COM_EVENPARITY: 
			(*puiULCON[uiPort]) |= (5<<3); 
			break;
		default : break;//COM_NOPARITY
	}
	switch(pstUartConfig->datalen)//数据长度
	{
		case COM_CHR6: 
			(*puiULCON[uiPort]) |= 1; 
			break;
		case COM_CHR7: 
			(*puiULCON[uiPort]) |= 2; 
			break;
		case COM_CHR8: 
			(*puiULCON[uiPort]) |= 3; 
			break;
		default : break;//COM_CHR5
	}
	switch(pstUartConfig->stop)
	{
		case COM_STOP2: 
			(*puiULCON[uiPort]) |= (1<<2); 
			break;
		default : break;//COM_STOP1
	}

	(*puiUCON[uiPort])  = 0x05; // 中断或轮询方式读取发送数据
	(*puiUFCON[uiPort]) = 0x00;//FIFO disable
	// 波特率
	(*puiUBRDIV[uiPort]) = ( (int)(MCLK/16.0/pstUartConfig->baud + 0.5) -1 );//config baudrate
	
	if(pstUartConfig->afc == EN_AFC)
	{
		(*puiUMCON[uiPort]) = 0x8;
	}
	else//DIS_AFC
	{
		(*puiUMCON[uiPort]) = 0x01;
	}
	return 0;
}

void vUartSendByte(uint uiPort, uchar ucData)
{

	volatile uint  * puiUTRSTAT[2] = {&rUTRSTAT0,&rUTRSTAT1}; //UART TX/RX状态寄存器
	volatile uchar *    pucUTXH[2] = {&rUTXH0,&rUTXH1};       //UART 发送寄存器

	while(1)
	{
		if( ((*puiUTRSTAT[uiPort])&0x06) == 0x06 )
		{
			break;
		}
	}
	(*pucUTXH[uiPort]) = ucData;
}

uchar ucUartRecvByte(uint uiPort)
{
	volatile uint  * puiUTRSTAT[2] = {&rUTRSTAT0,&rUTRSTAT1};
	volatile uchar *    pucURXH[2] = {&rURXH0,&rURXH1};
	
	while(!((*puiUTRSTAT[uiPort])&0x01));
	return (*pucURXH[uiPort]);
}
void vUartSendStr(uint uiPort, uchar * pucStr)
{
	while(*pucStr)
	{
		if(*pucStr == '\n')
		{
			vUartSendByte(uiPort,'\r');
		}
		vUartSendByte(uiPort,*pucStr++);
	}
}

void vUartPrintf(const char *fmt,...)
{
	va_list ap;
	char string[256];

	va_start(ap,fmt);
	vsprintf(string,fmt,ap);
	vUartSendStr(UART0_PORT, (uchar *)string);
	va_end(ap);
	return;
}

int iUartInit(void)
{
	ST_UART_CONFIG stUartConfig;
	
	rPCONC = 0x0F000000|rPCONC;
	rPUPC = 0x3000;
	
	rPCONE = (rPCONE&0xFC3)|0xEB;
	rPUPE = 0x6;
	

	stUartConfig.baud = COM_115200;
	stUartConfig.parity = COM_NOPARITY;
	stUartConfig.datalen = COM_CHR8;
	stUartConfig.stop = COM_STOP1;
	stUartConfig.afc = DIS_AFC;
	
	iUartConfig(0,&stUartConfig);
	stUartConfig.baud = COM_57600;
	iUartConfig(1,&stUartConfig);
	
	return 0;
}
*/
void Delay(int delay)
{
	int i;
	for(i=0; i<delay*1000; i++)
		;
}
int iUartInit(int com,int baud)
{
	rPCONC = 0x0F000000|rPCONC;
	rPUPC = 0x3000;
	
	rPCONE = (rPCONE&0xFC3)|0xEB;
	rPUPE = 0x6;
	
	if( com == 0 )
	{
		UartNum = 0;
		rUFCON0 = 0x0;
		rUMCON0 = 0x0;
		rULCON0 = 0x03;
		rUCON0 = 0x245;
		rUBRDIV0 = ((int)(MCLK/16.0/baud+0.5)-1);
	}
	else
	{
		UartNum = 1;
		rUFCON1 = 0x0;
		rUMCON1 = 0x0;
		rULCON1 = 0x03;
		rUCON1 = 0x245;
		rUBRDIV1 = ((int)(MCLK/16.0/baud+0.5)-1);
	}
	return 0;
}
void vUartSendByte(char ch)
{
	if( UartNum == 0 )
	{
		if( ch == '\n' )
		{
			while(!(rUTRSTAT0&0x02));
			WrUTXH0('\r');
		}
		while(!(rUTRSTAT0&0x02));
		Delay(10);
		WrUTXH0(ch);		
	}
	else
	{
		if( ch == '\n' )
		{
			while(!(rUTRSTAT1&0x02));
			WrUTXH1('\r');
		}
		while(!(rUTRSTAT1&0x02));
		Delay(10);
		WrUTXH1(ch);
	}
}
void vUartSendStr(char * pucStr)
{
	while(*pucStr)
	{
		vUartSendByte(*pucStr++);
	}
}
void vUartPrintf(const char *fmt,...)
{
	va_list ap;
	char string[256];

	va_start(ap,fmt);
	vsprintf(string,fmt,ap);
	vUartSendStr(string);
	va_end(ap);
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -