📄 uart.c
字号:
/*
****************************************Copyright (c)**************************************************
** 广州周立功单片机发展有限公司
** 研 究 所
** CAN开发组
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: UART.H
**创 建 人: 滕欣欣
**最后修改日期: 2004年5月01日
**描 述: UART的基本操作函数
**
********************************************************************************************************
*/
#define _UART_GLOBAL_
#include "..\..\src\config.h"
/*
**************************************
定义配置常量
**************************************
*/
#define UART0Int 1
#define UART0Int_Vec 1
#define UART1Int 0
#define UART1Int_Vec 0
/*
*********************************************************************************************************
** 函数名称: void UARTInit (eUARTNUM UARTNum)
** 全局变量: 无
** 作 者: 滕欣欣
** 日 期: 2004年5月02日
** 描 述: UART初始化
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************
*/
void UARTInit (eUARTNUM UARTNum)
{
INT32U i; //设置管脚连接
i = PINSEL0;
i = i&0xFFFFFFF0;
PINSEL0 = i |0x05;
UARTLCR(UARTNum).DLABAcceEn = 1; //设置通讯波特率,先把DLAB置"1"
UARTDLM(UARTNum).DLM = 0x00; //根据(UARTDLM UARTDLL) = Fclk/(16*baud),计算的出在4*11.0592Mhz主频下
UARTDLL(UARTNum).DLL = 0x18; //要的到 115200 波特率的分频值为 0x18
UARTLCR(UARTNum).DLABAcceEn = 0; //DLAB置"0"
UARTLCR(UARTNum).WordLen = 3; //设置数据位为8
UARTLCR(UARTNum).Stop = 0; //停止位位"1"
UARTLCR(UARTNum).ParityEnable = 0; //无奇偶校验
U0FCR = 0x01;
UARTIER(UARTNum).ERxDA = 1; //使能接收中断
if (UARTNum == UART0)
{
#if UART0Int
#if UART0Int_Vec
VICVectCntl6 = 0x20|6;
VICVectAddr6 = (INT32U)UART0ISR;
#endif
VICDefVectAddr = (INT32U)CANIntPrg;
VICIntEnable = 1<<6;
#endif
}
else
{
#if UART1Int
#if UART0Int_Vec
VICVectCntl7 = 0x20|7;
VICVectAddr7 = (INT32U)UART1ISR;
#endif
VICDefVectAddr = (INT32U)NVectorInt;
VICIntEnable = 1<<7;
#endif
}
}
/*
*********************************************************************************************************
** 函数名称: 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中断服务程序
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************
*/
void UART0ISR (void)
{
INT32U i;
if (0x04 != (0x0f&U0IIR))
{
UARTRcvCounter = 0;
UARTRcvNewData = 0;
U0FCR = 0x01;
goto ExitUartInt;
}
switch (UARTRcvCounter)
{
case 0:
SRBuf[0] = U0RBR;
if (SRBuf[0] == 0x12)
UARTRcvCounter++;
goto ExitUartInt;
case 1:
SRBuf[1] = U0RBR;
UARTRcvCounter++;
goto ExitUartInt;
case 2:
SRBuf[2] = U0RBR;
U0FCR = 0x41;
UARTRcvCounter++;
goto ExitUartInt;
case 3:
for (i = 0; i<4; i++)
{
SRBuf[3 + i ] = U0RBR;
}
U0FCR = 0x81;
UARTRcvCounter++;
goto ExitUartInt;
case 4:
for (i = 0; i<8; i++)
{
SRBuf[7 + i ] = U0RBR;
}
U0FCR = 0x01;
UARTRcvCounter++;
goto ExitUartInt;
case 5:
SRBuf[15 ] = U0RBR;
U0FCR = 0x01;
UARTRcvCounter++;
goto ExitUartInt;
case 6:
SRBuf[16 ] = U0RBR;
U0FCR = 0x01;
UARTRcvCounter = 0;
UARTRcvNewData = 1;
goto ExitUartInt;
}
ExitUartInt:
VICVectAddr = 0;
}
/*
**********************************************************************************************************
** End Of File
**********************************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -