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

📄 uart.c

📁 C语言源代码及相关资料
💻 C
📖 第 1 页 / 共 3 页
字号:
		}
		if (uiParaData[Parity] > 4) {
			uiParaData[Parity] = 0;
		}
		if (uiParaData[RtsControl] != 0) {	
			uiParaData[RtsControl] = 0;
		}
		
		if (OPERATE_FAIL == (__uartBandRate(PUartInfo,uiParaData[BaudRate]))) {
#if defined(UART_SEMCONTROL)
			OSSemPost(PUartInfo->pUartSem);
#else
			OS_EXIT_CRITICAL();
#endif // end #if defined(UART_SEMCONTROL)
			return UART_NOK;
		}
		if(OPERATE_FAIL == (__uartMode(PUartInfo,uiParaData))) {
#if defined(UART_SEMCONTROL)
			OSSemPost(PUartInfo->pUartSem);
#else
			OS_EXIT_CRITICAL();
#endif // end #if defined(UART_SEMCONTROL)
			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位置位表示发送队列使能     */                       
#if defined(UART_SEMCONTROL)
		OSSemPost(PUartInfo->pUartSem);
	} // end of if ( PUartInfo->pUartSem!=0 )
#else
	OS_EXIT_CRITICAL();
#endif // end #if defined(UART_SEMCONTROL)
    
	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个参数         */

extern int32 uartInit (uint32 uiId,
                       char *pcArg,
                       void *pRsv)
{
 

 	
    uint32 uiParaData[MAX_UART_STR_NUM]={0};                            /*  定义一个数组存放字符串的参数*/
    
    char cCopyStr[80];                                                  /*  用于备份字符串              */

	
    if ((uiId<__UART_MAX_NUM) && (strlen(pcArg)<80)) {
        strcpy(cCopyStr,pcArg);										    /*  复制字符串                  */	
        
        __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发送长度            */
                                                                           
        __GpuiUartInfoTab[uiId]->PdqReviceBuf = (DataQueue *)GpuiUartReviceTab[uiId];   
                                                                        /*  记录接收缓存                */
                                                                        
        __GpuiUartInfoTab[uiId]->PdqSendBuf = (DataQueue *)GpuiUartSendTab[uiId];		
                                                                        /*  记录发送缓存                */
                                                                        
        __GpuiUartInfoTab[uiId]->uiUartId =  uiId;                      /*  记录下自己的ID号            */
                                                                      
        ImpCmd(Tab_UART,cCopyStr,uiParaData);                           /*  从字符串中提取参数          */           
		 
        if (__uartInit(__GpuiUartInfoTab[uiId], uiParaData, 
                       __GuiQueueReviceFifoTab[uiId], __GuiQueueSendFifoTab[uiId]) == OPERATE_FAIL) {
            return(UART_NOK);
        }
        else {
            return(UART_OK);
        }                                                                                                                               
    }
    else {
        return(UART_NOK);
    } 
}

/*********************************************************************************************************
** Function name:           uartSetMode
** Descriptions:            设置串口的参数
** input parameters:        uiId      : 子设备号
**                          uiCmd     :设置参数宏:CTMODE--串口模式;BAUDRATE--串口波特率
**                          pcArg     :字符串指针
** Output parameters:       NONE
** Returned value:			OPERATE_SUCCESS:    操作成功
**                          OPERATE_FAIL:       操作失败
** Example1:                char pUartBps[] = "BaudRate=9600";
**                          WdtSetMode( 0, BAUDRATE, pUartBps);  
** Example2:                char pUart[]="DataBits=8 StopBits=1 Parity=NONE RtsControl=NONE";
**                          WdtSetMode( 0, CTMODE, pUart);  
*********************************************************************************************************/
#define BAUDRATE    0   
#define CTMODE      1
extern int32 uartSetMode (uint32 uiId,
                          uint32 uiCmd,
                          char *pcArg)
{
    uint32 uiParaData[MAX_UART_STR_NUM]={0};                            /*  定义一个数组存放字符串的参数*/
    
    char cCopyStr[80];                                                  /*  用于备份字符串              */
	
    if ((uiId<__UART_MAX_NUM) && (strlen(pcArg)<80)) {
        strcpy(cCopyStr,pcArg);										    /*  复制字符串                  */	
        
		ImpCmd(Tab_UART,cCopyStr,uiParaData);                           /*  从字符串中提取参数          */ 
		
		switch(uiCmd) {

		case BAUDRATE:
			return(__uartBandRate(__GpuiUartInfoTab[uiId],uiParaData[BaudRate])); 
	        break;	
	    			
		case CTMODE:
			return(__uartMode(__GpuiUartInfoTab[uiId],uiParaData));					
            break;   
		default:
			break;	
		}
    }		
	return UART_NOK;     
}
/*********************************************************************************************************
** Function name:			__uartGetState
** Descriptions:			从底层串口寄存器获取当前串口的参数
** input parameters:		uiId:               子设备号
**							uiParaData:         字符串指针
** Output parameters:       NONE
** Returned value:			OPERATE_SUCCESS:    操作成功
**                          OPERATE_FAIL:       操作失败
*********************************************************************************************************/
int32 __uartGetState (uint32 uiId, uint32 *uiParaData)
{
    volatile uint32 *puiAddrBase;
	volatile uint32  uiOffBase;

	uint32 uiBak = 0;
	
	puiAddrBase = __GpuiUartInfoTab[uiId]->puiAddrBase;
	uiOffBase   = __GpuiUartInfoTab[uiId]->uiOffBase;
	
	uiBak = puiAddrBase[__B_UART_LCR << uiOffBase];
	puiAddrBase[__B_UART_LCR << uiOffBase] |= 0x80;                     /*  允许访问分频因子寄存器      */
		  
	uiParaData[BaudRate] = ((Fpclk /(puiAddrBase[__B_UART_DLL << uiOffBase]
	                       | (puiAddrBase[__B_UART_DLM << uiOffBase] << 8)) / 16));
	uiParaData[DataBits] = (uiBak & 0x03) + 5;
	uiParaData[StopBits] = ((uiBak >> 2) & 0x01) + 1;
	if (( (uiBak >> 3) & 0x01) == 0)
	    uiParaData[Parity] = 0;
	else
	{
	    uiParaData[Parity] = (((uiBak >> 4) & 0x03) + 1);   
	}
	
	puiAddrBase[__B_UART_LCR << uiOffBase] &= 0x7F;                     /*  禁止访问分频因子寄存器      */
	
	return UART_OK;
}
/*********************************************************************************************************
** Function name:           uartGetState
** Descriptions:            获取当前串口的参数
** input parameters:        uiId:               子设备号
**                          pcArg:              字符串指针
** Output parameters:       pcArg:              输出字符串参数
** Returned value:			OPERATE_SUCCESS:    操作成功
**                          OPERATE_FAIL:       操作失败
*********************************************************************************************************/
extern int32 uartGetState (uint32 uiId, char * pcArg)
{
    uint32 uiParaData[MAX_UART_STR_NUM]={0};                           /*  定义一个数组存放字符串的参数 */
	if (uiId < __UART_MAX_NUM) {
	    __uartGetState(uiId, uiParaData);
	    ExpCmd(Tab_UART, pcArg, uiParaData);
	}
	else
		return UART_NOK;
	return UART_OK;
}
/*********************************************************************************************************
** Function name:			_uartQueueStatus
** Descriptions:			获取Queue队列的状态
** input parameters:		PUartInfo      : 指向uart信息结构体的指针
**                          uiWhichFifo	  : 1-发送队列;0-接收队列
** Returned value:			发送队列中可操作的空间大小,或接收队列中可用数据个数
*********************************************************************************************************/
static int32 _uartQueueStatus (__PUART_INFO PUartInfo, uint32 uiWhichFifo)
{
#if defined(UART_SEMCONTROL)
	INT8U UartErr;
#endif // end #if defined(UART_SEMCONTROL)
#if defined(QUEUE_NEW_OPRT)
	uint16 uiCurNData = 0;
	
	uint16 uiMaxData;
  uint8 *pucIn, *pucOut;
#endif // end of #if defined(QUEUE_NEW_OPRT)

#if defined(QUEUE_NEW_OPRT)
#if defined(UART_SEMCONTROL)
	OSSemPend(PUartInfo->pUartSem, 0, &UartErr);
#else
	OS_ENTER_CRITICAL(); 
#endif // end #if defined(UART_SEMCONTROL)
	if ((uiWhichFifo == TX_FIFO) && ((PUartInfo->uiUartFlag) < 0x80))
	{
		pucIn = PUartInfo->PdqSendBuf->In;
		pucOut = PUartInfo->PdqSendBuf->Out;
		uiMaxData = PUartInfo->PdqSendBuf->MaxData;
		
		if ( pucIn > PUartInfo->PdqSendBuf->Out ) {
			uiCurNData = uiMaxData - (pucIn - pucOut);
		} else {

⌨️ 快捷键说明

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