📄 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; //使能接收中断
}
/*
*********************************************************************************************************
** 函数名称: void UARTSend(INT32U Len,INT8U *Buf)
** 全局变量: 无
** 作 者: 滕欣欣
** 日 期: 2004年5月02日
** 描 述: UART数据发送程序
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************
*/
void UARTSend(eUARTNUM UARTNum,INT32U Len,INT8U *Buf)
{
INT32U i,j,k;
INT8U *p =Buf;
i= Len/16;
j=Len%16;
while(i--> 0)
{
for(k=0;k<16;k++)
{
UARTTHR(UARTNum).WritedData=(*p++);
}
while(!(U0LSR&0x20));
}
for(k=0;k<j;k++)
{
UARTTHR(UARTNum).WritedData =(*p++);
}
while(!(U0LSR&0x20));
}
/*
************************************************************************************************************************
**函数原型 : 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)
{
INT32U i;
//产生的时超时中断,则丢弃这一帧
if (0x04 != (0x0f&U0IIR))
{
UARTRcvCounter = 0;
UARTRcvNewData = 0;
U0FCR = 0x01;
goto ExitUartInt;
}
//正常的接收中断处理,假如中间有任何一步不符合帧结构,则丢弃这一帧
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;
OSTaskResume (0x02); //全部正确接收后唤醒任务
break;
}
ExitUartInt:
VICVectAddr = 0;
}
/*
**********************************************************************************************************
** End Of File
**********************************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -