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

📄 uart.c

📁 周立功公司CANStart—II部分源码
💻 C
字号:
/*
****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        CAN开发组 
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: UART.H
**创   建   人: 滕欣欣
**最后修改日期: 2004年5月01日
**描        述: UART的基本操作函数
**
********************************************************************************************************
*/
#define	_UART_GLOBAL_
#include "..\..\src\config.h"
/*
**************************************
	   定义配置常量
**************************************
*/
/*
*********************************************************************************************************
** 函数名称:	void UARTInit (eUARTNUM UARTNum)     
** 全局变量: 	无
** 作   者:    滕欣欣
** 日   期:    2004年5月02日
** 描    述:	UART初始化
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描  述: 		
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************
*/
void UARTInit (eUARTNUM UARTNum)
{
	INT32U	temp;								//设置管脚连接
	temp	= PINSEL0;
	temp	= temp&0xFFFFFFF0;
	PINSEL0	= temp |0x05;

	UARTLCR(UARTNum).DLABAcceEn	= 1;			//设置通讯波特率,先把DLAB置"1"

	UARTDLM(UARTNum).DLM	= 0x00; 			//根据(UARTDLM UARTDLL) = Fclk/(16*baud),计算的出在6*11.0592Mhz主频下
	UARTDLL(UARTNum).DLL	= 0x18;				//要的到 115200 波特率的分频值为 0x24

	UARTLCR(UARTNum).DLABAcceEn	= 0;			//DLAB置"0"

	UARTLCR(UARTNum).WordLen	= 3;			//设置数据位为8
	UARTLCR(UARTNum).Stop		= 0;			//停止位位"1"
	UARTLCR(UARTNum).ParityEnable	= 0;		//无奇偶校验
	U0FCR = 0x01;								//使用FIFO并设定触发深度为1字节
	UARTIER(UARTNum).ERxDA		= 1;			//使能接收中断
	UARTIER(UARTNum).ETHRE		= 1;
}

/*
*********************************************************************************************************
** 函数名称:	void	UARTSend(INT32U Len,INT8U *Buf)    
** 全局变量: 	无
** 作   者:    滕欣欣
** 日   期:    2004年5月02日
** 描    述:	UART数据发送程序
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描  述: 		
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************
*/
void	UARTSend(eUARTNUM UARTNum,INT32U Len,INT8U *Buf)
{
	INT32U 		i,j,k;
	OS_FLAGS	FlagVal;
	INT8U		FlagErr;
	INT8U 		*p =Buf;
	i= Len/16;
	j=Len%16;
	FlagVal = OSFlagPost (fl_SysStatue, UART_SB_AVAIL, OS_FLAG_CLR, &FlagErr);	
	while(i--> 0)
	{
		for(k=0;k<16;k++)
		{
			UARTTHR(UARTNum).WritedData=(*p++);
		}
	FlagVal = OSFlagPend (fl_SysStatue, 
						  UART_SB_AVAIL , 
						  OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME,
						  0,
						  &FlagErr );
	}
	for(k=0;k<j;k++)
	{
		UARTTHR(UARTNum).WritedData =(*p++);
	}
	FlagVal = OSFlagPend (fl_SysStatue, 
						  UART_SB_AVAIL , 
						  OS_FLAG_WAIT_SET_ANY,
						  0,
						  &FlagErr );
	FlagVal = OSFlagPost (fl_SysStatue, UART_SEND_OK, OS_FLAG_SET, &FlagErr);
}

/*
************************************************************************************************************************
**函数原型	:  	void UARTRcv(eUARTNUM UARTNum,INT32U Len,INT8U *Buf)
**参数说明	:  	Len		-->>	接收字符长度;<=16;
				Buf		-->>	解收数据的缓冲区首址
**返回	值	:	无
**说	明	:	本函数用于UART0接收数据,应用FIFO
************************************************************************************************************************
*/
void UARTRcv(eUARTNUM UARTNum,INT32U Len,INT8U *Buf)
{
	INT32U i,j;
	if(Len >16)
	{
		i=16;
	}
	else
	{
		i=Len;
	}
	for(j=0;j<i;j++)
	{
		*(Buf+j) = UARTRBR(UARTNum).WritedData;	
	}
}
/*
*********************************************************************************************************
** 函数名称:	void UARTxISR (void)     
** 全局变量: 	无
** 作   者:    滕欣欣
** 日   期:    2004年5月02日
** 描    述:	UART中断服务程序
**-------------------------------------------------------------------------------------------------------
** 修改人: 	滕欣欣
** 日 期:	2004年8月17日
** 描  述: 	改为在中断程序中进行数据链路的判断接收	
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************
*/
void 	UART0ISR (void)
{
	INT8U 		IIR, temp, i;
	INT8U		FlagErr;
	OS_FLAGS	FlagVal;
	OS_ENTER_CRITICAL();
    while(((IIR = U0IIR) & 0x01) == 0)
    {                                            /* 有中断未处理完 */
        switch (IIR & 0x0e)
        {
            case 0x02:                           /* THRE中断    */
        		FlagVal = OSFlagPost (fl_SysStatue, UART_SB_AVAIL, OS_FLAG_SET, &FlagErr);
                break;
            case 0x04:                           /* 接收数据可用 */
			    switch (UARTRcvCounter)
				{
					case 0:
						SRBuf[0] = U0RBR;		//接收帧头0x12,不是0x12则丢弃,(1字节)
						if (SRBuf[0] == 0x12)
							UARTRcvCounter++;
						break;
						
					case 1:						//接收CAN通道号(1字节)
						SRBuf[1] = U0RBR;
						UARTRcvCounter++;
						break;
						
					case 2:						//接收帧信息(1字节)
						SRBuf[2] = U0RBR;
						U0FCR = 0x41;
						UARTRcvCounter++;
						break;
						
					case 3:						//接收帧ID(4字节)
						for (i = 0; i<4; i++)
						{
							SRBuf[3 + i ] = U0RBR;
						}
						U0FCR = 0x81;
						UARTRcvCounter++;
						break;
						
					case 4:						//接收帧数据(8字节)
						for (i = 0; i<8; i++)
						{
							SRBuf[7 + i] = U0RBR;
						}
						U0FCR = 0x01;
						UARTRcvCounter++;
						break;
						
					case 5:						//接收发送命令(1字节)
						SRBuf[15] = U0RBR;
						U0FCR = 0x01;
						UARTRcvCounter++;
						break;
						
					case 6:						//接收校验字节(1字节)
						SRBuf[16] = U0RBR;
						U0FCR = 0x01;
						UARTRcvCounter = 0;
						FlagVal = OSFlagPost (fl_SysStatue, UART_DATA_OK, OS_FLAG_SET, &FlagErr);
						break;		
				}
                break;
            case 0x06:                                  /* 接收线状态   */
                temp = U0LSR;
                break;
            case 0x0c:                                  /* 字符超时指示 */
                UARTRcvCounter = 0;
				FlagVal = OSFlagPost (fl_SysStatue, UART_DATA_OK, OS_FLAG_CLR, &FlagErr);
                break;
            default :
                break;
        }
    }
    OS_EXIT_CRITICAL();
	VICVectAddr = 0;
}

/*
**********************************************************************************************************
**                            End Of File
**********************************************************************************************************
*/

⌨️ 快捷键说明

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