📄 uart.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 + -