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

📄 uart.c

📁 SmartARM2400开发平台配套例程
💻 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"

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

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

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

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

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

/*********************************************************************************************************
   下面定义了UART2的软件FIFO数组
*********************************************************************************************************/ 
uint32 uiUatr2RxBuf[QUEUE2REVICEFIFOLENFUN];
uint32 uiUatr2TxBuf[QUEUE2SENDFIFOLENFUN]; 

/*********************************************************************************************************
   下面定义了UART3的软件FIFO数组
*********************************************************************************************************/ 
uint32 uiUatr3RxBuf[QUEUE3REVICEFIFOLENFUN];
uint32 uiUatr3TxBuf[QUEUE3SENDFIFOLENFUN];

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

/*********************************************************************************************************
** 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 >= 9600)) {							/*  参数过滤                    */
	    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 UART_OK;
	}
    return UART_NOK;
}

/*********************************************************************************************************
** 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 UART_NOK;
	}
	if ((uiParaData[StopBits] == 0) || (uiParaData[StopBits] > 2)) { 	 
	    return UART_NOK;
	}
	if (uiParaData[Parity] > 4) {
	    return UART_NOK;
	}
	
	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 UART_OK;
}                                                 
/*********************************************************************************************************
** 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;
	
    OS_ENTER_CRITICAL();                                                /*  关中断                     */     	
    if (QueueCreate((void *)PUartInfo->PdqReviceBuf, uiReBufSize, NULL, NULL) == NOT_OK) {	
                                                                        /*  创建接收缓冲区             */
    	return UART_NOK;  
    } 			
    if (QueueCreate((void *)PUartInfo->PdqSendBuf, uiSeBufSize, NULL, NULL) == NOT_OK) { 	
                                                                        /*  创建发送缓冲区             */
        return UART_NOK;
    }                                                               
	PUartInfo->uiUartFlag = 0x80;									    /*  7位置位表示不用发送队列缓冲
	                                                                        也就是禁止发送中断         */
										
	                                                                    /*  参数过滤                   */
	if ((uiParaData[BaudRate] < 9600 ) || (uiParaData[BaudRate] > 115200)) {	
		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 UART_NOK;
    }
    if(OPERATE_FAIL == (__uartMode(PUartInfo,uiParaData))) {
    	return UART_NOK;
    }    
                             
    puiAddrBase[__B_UART_FCR << uiOffBase] = ((__GuiUartFifoTab[uiId] << 6) | 0x07);       
                                                                        /*  初始化FIFO为N个字节触发,WO
                                                                            发送和接收的FIFO都使能      */                                                                        
    puiAddrBase[__B_UART_IER << uiOffBase] = 0x05;                      /*  使能接收中断,不使能发送中断 */

    PUartInfo->uiUartFlag |= 0x10;                                      /*  4位置位表示发送队列使能     */                       
	
    OS_EXIT_CRITICAL();
    
    return UART_OK;
}
/*********************************************************************************************************
** 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=NONE,RtsControl=NONE"; 
**                          uartInit(0,pUart,0); 
*********************************************************************************************************/
#define MAX_UART_STR_NUM   5                                            /*  字符串中包含5个参数         */

⌨️ 快捷键说明

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