📄 uartdrv.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 + -