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

📄 uartdrv.c

📁 三星S34510板子上移植的uCosII源码
💻 C
字号:
#include	"uart.h"
#include 	"head.h"
#include   "s3c4510b.h"

UART_DEV armUartDev[2];

/*******************************************************************
函数名称:       uartDevInit()
函数功能:       初始化串口,包括填充设备结构,设置波特率,数据帧格式等.
入口参数:       channel        串口设备号(0-1).
返 回 值:       OK             初始化成功.
                ERROR          初始化失败.
备    注:       由于s3c4510b只有两个串口,所以channel只能为0或1.
********************************************************************/
STATUS uartDevInit(char channel)
{
      UART_DEV *pArmUartDev = NULL;
      UINT32 dataTmp;
    
	if((channel != 0) && (channel != 1))   //只有两个通道.
		return ERROR;
	
	pArmUartDev = &armUartDev[channel];
	if(pArmUartDev ==NULL)
	    return ERROR;
       
	pArmUartDev->lineCtrReg = (UINT32 *)(ULCON0 + channel * 0x1000);    //相应寄存器地址填充到数据结构中.
	pArmUartDev->chanCtrReg = (UINT32 *)(UCON0  + channel * 0x1000);
	pArmUartDev->statusReg  = (UINT32 *)(USTAT0 + channel * 0x1000);
	pArmUartDev->sendBufReg = (UINT32 *)(UTXBUF0 + channel * 0x1000);
	pArmUartDev->recvBufReg = (UINT32 *)(URXBUF0 + channel * 0x1000);
	pArmUartDev->baudDivReg = (UINT32 *)(UBRDIV0 + channel * 0x1000);
	pArmUartDev->baudCountReg = (UINT32 *)(BRDCNT0 + channel * 0x1000);
	pArmUartDev->baudMonReg = (UINT32 *)(BRDCLK0 + channel * 0x1000);

	dataTmp = *(pArmUartDev->statusReg);    		//clear status register.	
	*(pArmUartDev->lineCtrReg) = (INT_CLK | PARITY_NONE | ONE_STOP |WORD_LEN);   /*内部时钟,无校验,1停止,8位*/
	*(pArmUartDev->chanCtrReg) = (UCON_TX |UCON_RX);  						/* 采用中断模式,但发送和接收采用POLL模式 */
	*(pArmUartDev->baudDivReg) = (ARM_CNT_38400|ARM_CNT1_VAL);  			/*设置缺省波特率为38400*/

	pArmUartDev->opened = 1;
	pArmUartDev->channel = channel;
	pArmUartDev->workMode =  UART_POLL_MODE;
	pArmUartDev->baudFreq = ARM_DEFAULT_BAUD;
	
	return OK;
}
 
/*******************************************************************
函数名称:       armUartRead()
函数功能:       从指定的串口通道接收指定的字节数.
入口参数:       channel        串口设备号(0-1).
                buffer         接收数据缓冲区地址.
                nBytes         要接收数据的字节数.
返 回 值:       nBytes         接收字节数.
                ERROR          接收失败.
备    注:       由于s3c4510b只有两个串口,所以channel只能为0或1.
********************************************************************/
int armUartRead(char channel,  char *buffer, int nBytes) 
{
	int i;
    UART_DEV *pArmUartDev = NULL;
	if((channel != 0) && (channel != 1))   //只有两个通道.
		return ERROR;
	
	pArmUartDev = &armUartDev[channel];
	if((pArmUartDev == NULL)||(buffer == NULL))
	    return ERROR;
	    
    for(i=0; i<nBytes; i++,buffer++)
	{
		while((*(pArmUartDev->statusReg) & 0x20) == 0)     //等待SBUF有数据
		    ;
		*buffer = *pArmUartDev->recvBufReg;      //从串口接收寄存器读取数据.
	}                
	return (nBytes);
}

/*******************************************************************
函数名称:       armUartWrite()
函数功能:       从指定的串口通道发送指定的字节数.
入口参数:       channel        串口设备号(0-1).
                buffer         接收数据缓冲区地址.
                nBytes         要发送数据的字节数.
返 回 值:       nBytes         发送字节数.
                ERROR          发送失败.
备    注:       由于s3c4510b只有两个串口,所以channel只能为0或1.
********************************************************************/
int armUartWrite(char channel, char *buffer, int nBytes) 
{
	int i;
    UART_DEV *pArmUartDev = NULL;
	if((channel != 0) && (channel != 1))   //只有两个通道.
		return ERROR;
	
	pArmUartDev = &armUartDev[channel];
	if((pArmUartDev == NULL)||(buffer == NULL))
	    return ERROR;

	for(i=0; i<nBytes; i++,buffer++)
	{
		while((*(pArmUartDev->statusReg) & 0x40) == 0)     //等待发送缓冲区有空槽.
		    ;
		//delayMs(2);
		*pArmUartDev->sendBufReg = *buffer;      			      /* Write data to uart sendBuffer*/
	}
//	while(((*pArmUartDev->statusReg) & 0x80) == 0x00)  	     /* wait  until the shift register is empty */
//	    ;	
	return (nBytes);
}

/*******************************************************************
函数名称:       armUartIoctl()
函数功能:       获取或设置指定串口通道的波特率.
入口参数:       channel        串口设备号(0-1).
                command        GET_BAUDRATE  获取指定串口通道的波特率.
                               GET_BAUDRATE  设定指定串口通道的波特率.
                baudRate       设定的波特率值.                               
返 回 值:       OK             设置成功.
                ERROR          设置失败.
                baud           获取的波特率.
备    注:       由于s3c4510b只有两个串口,所以channel只能为0或1.
********************************************************************/
int armUartIoctl(char channel, int command, int baudRate)
{
    UART_DEV *pArmUartDev = NULL;
	if((channel != 0) && (channel != 1))   //只有两个通道.
		return ERROR;
	
	pArmUartDev = &armUartDev[channel];
	if(pArmUartDev == NULL)
	    return ERROR;
	
	if(command == GET_BAUDRATE)
	    return(pArmUartDev->baudFreq);
	    
	else if(command == SET_BAUDRATE)
	{    
    	if (baudRate < ARM_BAUD_MIN || baudRate > ARM_BAUD_MAX)
    		return ERROR;
    
    	switch(baudRate)
    	{
    		case 1200:
    		
    			*(volatile UINT32 *)ARM7_INTMASK |= 0x200000;            // 禁止中断.
    			*pArmUartDev->baudDivReg = (ARM_CNT_1200|ARM_CNT1_VAL);
    			*(volatile UINT32 *)ARM7_INTMASK &= ~0x200000;            // 允许中断.
    			break;
    
    		case 2400:
    			*(volatile UINT32 *)ARM7_INTMASK |= 0x200000;            // 禁止中断.
    			*pArmUartDev->baudDivReg = (ARM_CNT_2400|ARM_CNT1_VAL);
    			*(volatile UINT32 *)ARM7_INTMASK &= ~0x200000;            // 允许中断.
    			break;
    
    		case 4800:
    			*(volatile UINT32 *)ARM7_INTMASK |= 0x200000;            // 禁止中断.
    			*pArmUartDev->baudDivReg = (ARM_CNT_4800|ARM_CNT1_VAL);
    			*(volatile UINT32 *)ARM7_INTMASK &= ~0x200000;            // 允许中断.
    			break;
    
    		case 9600:
    			*(volatile UINT32 *)ARM7_INTMASK |= 0x200000;            // 禁止中断.
    			*pArmUartDev->baudDivReg = (ARM_CNT_9600|ARM_CNT1_VAL);
    			*(volatile UINT32 *)ARM7_INTMASK &= ~0x200000;            // 允许中断.
    			break;
    
    		case 19200:
    			*(volatile UINT32 *)ARM7_INTMASK |= 0x200000;            // 禁止中断.
    			*pArmUartDev->baudDivReg = (ARM_CNT_19200|ARM_CNT1_VAL);
    			*(volatile UINT32 *)ARM7_INTMASK &= ~0x200000;            // 允许中断.
    			break;
    
    		case 38400:
    			*(volatile UINT32 *)ARM7_INTMASK |= 0x200000;            // 禁止中断.
    			*pArmUartDev->baudDivReg = (ARM_CNT_38400|ARM_CNT1_VAL);
    			*(volatile UINT32 *)ARM7_INTMASK &= ~0x200000;            // 允许中断.
    			break;
    
    		case 57600:
    			*(volatile UINT32 *)ARM7_INTMASK |= 0x200000;            // 禁止中断.
    			*pArmUartDev->baudDivReg = (ARM_CNT_57600|ARM_CNT1_VAL);
    			*(volatile UINT32 *)ARM7_INTMASK &= ~0x200000;            // 允许中断.
    			break;
    
    		case 115200:
    			*(volatile UINT32 *)ARM7_INTMASK |= 0x200000;            // 禁止中断.
    			*pArmUartDev->baudDivReg = (ARM_CNT_115200|ARM_CNT1_VAL);
    			*(volatile UINT32 *)ARM7_INTMASK &= ~0x200000;            // 允许中断.
    			break;
    
    		case 230400:
    			*(volatile UINT32 *)ARM7_INTMASK |= 0x200000;            // 禁止中断.
    			*pArmUartDev->baudDivReg = (ARM_CNT_230400|ARM_CNT1_VAL);
    			*(volatile UINT32 *)ARM7_INTMASK &= ~0x200000;            // 允许中断.
    			break;
    
    		case 460800:
    			*(volatile UINT32 *)ARM7_INTMASK |= 0x200000;            // 禁止中断.
    			*pArmUartDev->baudDivReg = (ARM_CNT_460800|ARM_CNT1_VAL);
    			*(volatile UINT32 *)ARM7_INTMASK &= ~0x200000;            // 允许中断.
    			break;
    
    		default:
    			return ERROR;
    
    	}	
        pArmUartDev->baudFreq = baudRate;    //修改相应通道结构内容.
        return OK;
    }
    else 
        return ERROR;
}


/*************
**/
void print( char *buffer,char *data)
{ 
 char a,b,c;
 char dat1;
 
 int nByte;
 nByte=20+5;
 dat1=*data;
 a=(dat1)%100;
 b=(dat1-a*100)%10;
 c=(dat1-a*100-b*10);
 
 *(buffer+21)='a';//a+0x30;
 *(buffer+22)=b+0x30;
 *(buffer+23)=c+0x30;
armUartWrite(0, buffer, nByte);   
}

⌨️ 快捷键说明

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