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

📄 uart.c

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 C
📖 第 1 页 / 共 3 页
字号:
/***********************************************Copyright (c)*********************************************
**                                Guangzou ZLG-MCU Development Co.,LTD.
**                                     
**                                       http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:			    uart.c
** Last modified Date:      2007-10-15
** Last Version:		    1.0
** Descriptions:		    串口的C文件
**
**--------------------------------------------------------------------------------------------------------
** Created by:			    wengshujie
** Created date:		    2007-10-15
** Version:				    1.0
** Descriptions:		    无
**
**--------------------------------------------------------------------------------------------------------
** Modified by:			    
** Modified Date:		    
** Version:				    
** Descriptions:		    
**
*********************************************************************************************************/
#include "Config.h"
#include "Uart.h"
#include "UartPrivate.h"

/*********************************************************************************************************
   定义操作UART器件的结构体,有多个器件就需要声明多个结构体
*********************************************************************************************************/
static __UART_INFO    __UART0Info;                                      /*  定义UART0的一个结构体       */
static __UART_INFO    __UART1Info;

/*********************************************************************************************************
   下面使用指针数组来保存结构体指针,方便对该驱动的扩展
*********************************************************************************************************/
 __PUART_INFO    __GpuiUartInfoTab[__UART_MAX_NUM] = {&__UART0Info, &__UART1Info};

/*********************************************************************************************************
   下面定义了UART基地址值,如果想增加UART器件可以在该位置添加相应的基地址即可
*********************************************************************************************************/
const uint32    __GuiUartBaseAddrTab[__UART_MAX_NUM] = {UART0_BASE_ADDR, UART1_BASE_ADDR};
                                                         
/*********************************************************************************************************
   下面定义了UART硬件FIFO值,如果想增加UART器件可以在该位置添加相应的值即可
*********************************************************************************************************/
const uint32    __GuiUartFifoTab[__UART_MAX_NUM] = {UART0FIFOLENFUN, UART1FIFOLENFUN};
                                                     
/*********************************************************************************************************
   下面定义了UART软件接收FIFO大小值,如果有想增加UART器件可以在该位置添加相应的值即可
*********************************************************************************************************/
const uint32    __GuiQueueReviceFifoTab[__UART_MAX_NUM] = {QUEUE0REVICEFIFOLENFUN, QUEUE1REVICEFIFOLENFUN};  

/*********************************************************************************************************
   下面定义了UART软件发送FIFO值,如果有想增加UART器件可以在该位置添加相应的值即可
*********************************************************************************************************/
const uint32    __GuiQueueSendFifoTab[__UART_MAX_NUM] = {QUEUE0SENDFIFOLENFUN, QUEUE1SENDFIFOLENFUN};  
                                                              
/*********************************************************************************************************
   下面定义了UART0的软件FIFO数组
*********************************************************************************************************/ 
uint32 uiUatr0RxBuf[QUEUE0REVICEFIFOLENFUN];
uint32 uiUatr0TxBuf[QUEUE0SENDFIFOLENFUN];    

/*********************************************************************************************************
   下面定义了UART1的软件FIFO数组
*********************************************************************************************************/ 
uint32 uiUatr1RxBuf[QUEUE1REVICEFIFOLENFUN];
uint32 uiUatr1TxBuf[QUEUE1SENDFIFOLENFUN]; 

/*********************************************************************************************************
   下面使用指针数组来保存UART软件FIFO数组的首地址
*********************************************************************************************************/ 
const uint32 *GpuiUartReviceTab[__UART_MAX_NUM] = {uiUatr0RxBuf, uiUatr1RxBuf};
const uint32 *GpuiUartSendTab[__UART_MAX_NUM] = {uiUatr0TxBuf, uiUatr1TxBuf}; 

/*********************************************************************************************************
** Function name:			__uartBandRate
** Descriptions:			初始化UART波特率参数
** input parameters:		PUartInfo:          指向uart信息结构体的指针
**                          uibps:              波特率值
** Output parameters:       NONE
** Returned value:			OPERATE_SUCCESS:    操作成功
**                          OPERATE_FAIL:       操作失败
*********************************************************************************************************/
static int32 __uartBandRate (__PUART_INFO PUartInfo, uint32 uibps)
{    
    volatile uint32  uiOffBase;
	volatile uint32 *puiAddrBase;
        
	puiAddrBase = PUartInfo->puiAddrBase;	                            /*  获取结构体参数               */
	uiOffBase   = PUartInfo->uiOffBase;
	
	if ((uibps <= 115200) && (uibps >= 200)) {							/*  参数过滤                     */
	    puiAddrBase[__B_UART_LCR << uiOffBase] |= 0x80;        		    /*  允许访问分频因子寄存器       */	
	    		                                                        /*  设置波特率                   */
	    puiAddrBase[__B_UART_DLM << uiOffBase] = ((Fpclk / uibps) / 16) / 256;
		puiAddrBase[__B_UART_DLL << uiOffBase] = ((Fpclk / uibps) / 16) % 256;		
 		puiAddrBase[__B_UART_LCR << uiOffBase] &= 0x7f;             	/*  禁止访问分频因子寄存器       */
	    return OPERATE_SUCCESS;
	}
    return OPERATE_FAIL;
}
/*********************************************************************************************************
** Function name:			__uartMode
** Descriptions:			初始化UART的模式参数
** input parameters:		PUartInfo:          指向uart信息结构体的指针
**                          uiParaData:         参数指针
** Output parameters:       NONE
** Returned value:			OPERATE_SUCCESS:    操作成功
**                          OPERATE_FAIL:       操作失败
*********************************************************************************************************/
static int32 __uartMode (__PUART_INFO PUartInfo, uint32 *uiParaData)
{
    volatile uint32 uiOffBase;
	volatile uint32 *puiAddrBase;
	
             uint32 uiBak;
             
	puiAddrBase = PUartInfo->puiAddrBase;	                            /*  获取结构体参数               */
	uiOffBase   = PUartInfo->uiOffBase;

                                                                        /*  参数过滤                     */ 
	if ((uiParaData[DataBits] < 5) || (uiParaData[DataBits] > 8)) {	
	    return OPERATE_FAIL;
	}
	if ((uiParaData[StopBits] == 0) || (uiParaData[StopBits] > 2)) { 	 
	    return OPERATE_FAIL;
	}
	if (uiParaData[Parity] > 4) {
	    return OPERATE_FAIL;
	}
	
	uiBak = uiParaData[DataBits] - 5;
	if (uiParaData[StopBits] == 2) {                                    /*  判断是否为2位停止位          */
		uiBak |= 0x04;			
	}
	if (uiParaData[Parity] != 0) {
		uiParaData[Parity] = uiParaData[Parity] - 1;
		uiBak |= 0x08;                    					            /*  使能奇偶校验	             */   
	}
	uiBak |= uiParaData[Parity] << 4;							        /*  设置奇偶校验                 */						 
    puiAddrBase[__B_UART_LCR << uiOffBase] = uiBak;           		    /*  禁止访问分频因子寄存器       */
    
	return OPERATE_SUCCESS;
}                                                 
/*********************************************************************************************************
** Function name:			__uartInit
** Descriptions:			初始化UART,此函数供UartInit调用,不提供给用户
** input parameters:		PUartInfo:          指向uart信息结构体的指针
**                          uiParaData:         参数指针
**                          uiReBufSize:        uart的接收缓冲区大小
**                          uiSeBufSize:        uart的发送缓冲区大小
** Output parameters:       NONE
** Returned value:			OPERATE_SUCCESS:    操作成功
**                          OPERATE_FAIL:       操作失败
*********************************************************************************************************/
static uint32 __uartInit (__PUART_INFO PUartInfo,
                          uint32      *uiParaData, 
                          uint32      uiReBufSize, 
                          uint32      uiSeBufSize)
{
    volatile uint32 *puiAddrBase;
	volatile uint32 uiOffBase;
	         uint32 uiId;
	
	puiAddrBase = PUartInfo->puiAddrBase;
	uiOffBase   = PUartInfo->uiOffBase;
	uiId = PUartInfo->uiUartId;
	
    IRQDisable();                                                       /* 关中断                         */    	
    if(QueueCreate((void *)PUartInfo->PdqReviceBuf, uiReBufSize, NULL, NULL) == NOT_OK) {	
                                                                        /*  创建接收缓冲区             */
    	return OPERATE_FAIL;  
    } 			
    if(QueueCreate((void *)PUartInfo->PdqSendBuf, uiSeBufSize, NULL, NULL) == NOT_OK) { 	
                                                                        /*  创建发送缓冲区             */
        return OPERATE_FAIL;
    }                                                               
	PUartInfo->uiUartFlag = 0x80;									    /*  7位置位表示不用发送队列缓冲
	                                                                        也就是禁止发送中断         */
										
	                                                                    /*  参数过滤                   */
	if ((uiParaData[BaudRate] <= 200 ) || (uiParaData[BaudRate] >= 256000)) {	
		uiParaData[BaudRate] = 115200;
	}
	if ((uiParaData[DataBits] < 5) || (uiParaData[DataBits] > 8)) {	
		uiParaData[DataBits] = 8;
	}
	if ((uiParaData[StopBits] == 0) || (uiParaData[StopBits] > 2)) { 	
		uiParaData[StopBits] = 1;
	}
	if (uiParaData[Parity] > 4) {
		uiParaData[Parity] = 0;
	}
	if (uiParaData[RtsControl] != 0) {	
		uiParaData[RtsControl] = 0;
	}
			
    if(OPERATE_FAIL == (__uartBandRate(PUartInfo, uiParaData[BaudRate]))) {
    	return OPERATE_FAIL;
    }
    if(OPERATE_FAIL == (__uartMode(PUartInfo, uiParaData))) {
    	return OPERATE_FAIL;
    }    
                             
    puiAddrBase[__B_UART_FCR << uiOffBase] = ((__GuiUartFifoTab[uiId] << 6) | 0x07);       
                                                                        /*  初始化FIFO为N个字节触发,WO
                                                                            发送和接收的FIFO都使能      */                                                                        
    puiAddrBase[__B_UART_IER << uiOffBase] = 0x05;                      /*  使能接收中断,不使能发送中断 */

    PUartInfo->uiUartFlag |= 0x10;                                      /*  4位置位表示发送队列使能     */                       
	
    IRQEnable();                                                        /* 开中断                       */
    
    return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name:           uartInit
** Descriptions:            串口初始化及中断设置
** input parameters:        uiId:       子设备号
**                          pcArg:      字符串指针
**                          pRsv:       保留参数
** Output parameters:       NONE
** Returned value:			OPERATE_SUCCESS:    操作成功
**                          OPERATE_FAIL:       操作失败
** Example:                 char pUart[]="BaudRate=9600,DataBits=8,StopBits=1,Parity=0,RtsControl=0"; 
**                          uartInit(0,pUart,0); 
*********************************************************************************************************/
#define MAX_UART_STR_NUM   5                                            /*  字符串中包含5个参数         */

extern int32 uartInit ( uint32 uiId,
                       char *pcArg,
                       void *pRsv)
{
 
    uint32 uiParaData[MAX_UART_STR_NUM] = {0};                          /*  定义一个数组存放字符串的参数*/
    
    if((uiId<__UART_MAX_NUM) && (strlen(pcArg)<80)) {	
        
        __GpuiUartInfoTab[uiId]->puiAddrBase = (uint32 *)__GuiUartBaseAddrTab[uiId];
                                                                        /*  定基址                      */
                                                                        
        __GpuiUartInfoTab[uiId]->uiOffBase = 0;                         /*  地址偏移量                  */
        
        __GpuiUartInfoTab[uiId]->uiUartFlag = 0;                        /*  清0标志                     */
        
        __GpuiUartInfoTab[uiId]->uiQueueReviceFifoLen = __GuiQueueReviceFifoTab[uiId];                    
                                                                        /*  软件FIFO接收长度            */
                                                                        
        __GpuiUartInfoTab[uiId]->uiQueueSendFifoLen = __GuiQueueSendFifoTab[uiId];                    
                                                                        /*  软件FIFO发送长度            */

⌨️ 快捷键说明

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