【底软】串口接口函数

来源:互联网 发布:c语言开发实战宝典 编辑:程序博客网 时间:2024/06/16 07:39

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器。将数据由串行通信与并行通信间作传输转换,作为并行输入成为串行输出的芯片。UART的一帧数据主要包括起始信号、数据、校验位和结束信号。

串口芯片的初始化流程一般如下:

(1)设置发送数据和接收数据的长度为8位;

(2)设置FIFO控制寄存器;包括使能FIFO寄存器,清空发送FIFO缓冲器和接收FIFO缓冲器。

(3)设置波特率分频因子;

(4)设置串口时钟频率;

(5)设置中断使能寄存器,禁止中断;


1、串口初始化

#define UINT32unsigned int#define UINT8unsigned char#define UART_TIME_FOREVER(0x0)/* 串口永久定时 */#define UART_MAX_LOOP(0x5000)/* 默认循环次数 */#define UART_BAUD(9600)/* 串口默认波特率*/#define UARTx_USR_BUSY(0x00000001)/* 串口忙碌状态 */#define UARTx_USR_TFNF(0x00000002)/* 发送FIFO未满状态 */#define UARTx_USR_TFE(0x00000003)/* 发送FIFO空标志 */#define UARTx_USR_RFNE(0x00000004)/* 接收FIFO非空状态 */#define UARTx_USR_RFF(0x00000005)/* 接收FIFO满状态 *//****************************************************函数名:UartInit功能说明:实现串口初始化输入参数:无输出参数:无修改信息:xiaofeng 2014/2/17****************************************************/void UartInit(void){UINT32 uartFreq = 0;*(volatile UINT8*)UARTx_LCR_REG = UARTx_LCR_DLS8;*(volatile UINT8*)UARTx_FCR_REG = UARTx_FCR_EN | UARTx_FCR_RXCLR | UARTx_FCR_TXCLR;*(volatile UINT8*)UARTx_LCR_REG = UARTx_LCR_DLAB | UARTx_LCR_DLS8;uartFreq = 50000000; /*串口时钟频率*/*(volatile UINT8*)UARTx_DLL_REG = (uartFreq / 16 *( UART_BAUD)) & 0xff;*(volatile UINT8*)UARTx_DLH_REG = ((uartFreq / (16 * UART_BAUD)) >> 8) & 0xff;*(volatile UINT8*)UARTx_LCR_REG = UARTx_LCR_DLS8;*(volatile UINT8*)UARTx_IEL_REG = 0x0;}


2、串口发送一个字符

/****************************************************函数名:UartWriteChar功能说明:串口发送一个字符输入参数:character 发送字符输出参数:无修改信息:xiaofeng 2014/2/17****************************************************/void UartWriteChar(char character){UINT32 loop = 0;while(loop < UART_MAX_LOOP) /*确保可以发送,即发送FIFO未满*/{if((*(volatile UINT8*)UARTx_USR_REG) & UARTx_USR_TFNF == UARTx_USR_TFNF){break;}loop++;}*(volatile UINT8*)UARTx_THR_REG =(UINT8)character; /*发送字符*/loop = 0;while(loop < UART_MAX_LOOP) /*确保发送完成*/{if((*(volatile UINT8*)UARTx_USR_REG) & UARTx_USR_TFE == UARTx_USR_TFE){break;}loop++;}}

3、串口接收一个字符串

/****************************************************函数名:UartReadChar功能说明:串口接收一个字符输入参数:无输出参数:UINT8 接收字符修改信息:xiaofeng 2014/2/17****************************************************/UINT8 UartReadChar(void){UINT8 rCharacter = 0;UINT8 loop = 0;do{if((*(volatile UINT8*)UARTx_LSR_REG) & UARTx_LSR_DR == UARTx_LSR_DR){break;}loop++;if(loop > UART_MAX_LOOP){return 0;}}while((*(volatile UINT8*)UARTx_USR_REG) & UARTx_USR_BUSY)rCharacter = *(volatile UINT8*)UARTx_RBR_REG;return rCharacter;}

4、串口发送字符串

/****************************************************函数名:UartWriteString功能说明:串口发送字符串输入参数:*buffer发送字符串缓存空间          number发送字符串长度输出参数:UINT32发送字符串长度修改信息:xiaofeng 2014/2/17****************************************************/UINT32 UartWriteString(UINT8 *buffer, UINT32 number){UINT32 result = 0;if(NULL == buffer){return 0;}while(number--){UartWriteChar(*buffer);buffer++;}return result;}

5、串口接收字符串

/****************************************************函数名:UartReadString功能说明:串口接收字符串输入参数:*buffer接收字符串缓存空间          number接收字符串长度输出参数:UINT32接收字符串长度修改信息:xiaofeng 2014/2/17****************************************************/UINT32 UartReadString(UINT8 *buffer, UINT32 number){UINT32 result = 0;if(NULL == buffer){return 0;}while(number--){*buffer = UartReadChar();buffer++;}return result;}

6、串口在指定时间内等待接收字符

/****************************************************函数名:UartGetCharInTime功能说明:在指定时间内等待串口输入字符,若seconds为0,表示永久等待串口输入字符。输入参数:seconds指定时间,单位秒输出参数:UINT8 接收字符修改信息:xiaofeng 2014/2/17****************************************************/UINT8 UartGetCharInTime(UINT32 seconds){UINT32 timerLowBegin= 0;/* 64位时钟低32位起始计数值 */UINT32 timerLowEnd= 0;/* 64位时钟低32位结束计数值 */UINT32 timerHigh= 0;/* 64位时钟高32位计数值 */UINT32 timerFreq= 0;/* 64位定时器时钟频率 */char rCharacter= 0;/* 获取到的字符 */timerFreq = 25000000; /*时钟频率,如25M*/TimerCounterRead(&timerHigh, &timerLowBegin); /*获取64位时钟的高低32位计数器的计数值*/for(;;){/*如果获取到字符*/if((*(volatile UINT32*)UARTx_LSR_REG) & UARTx_LSR_DR == UARTx_LSR_DR) {break;}TimerCounterRead(&timerHigh, &timerLowEnd);/*获取64位时钟的高低32位计数器的计数值*/if(UART_TIME_FOREVER != seconds){    /*对于减计数器,计算时间需要将初始值减去结束值。timerFreq为    时钟频率,即1秒钟的ticket数 */if((timerLowBegin - timerLowEnd) > seconds * timerFreq) {return 0;}}}rCharacter = *(volatile UINT8*)UARTx_RBR_REG; /*获取字符*/return rCharacter;}


0 0
原创粉丝点击