📄 uart0app.c
字号:
/****************************************Copyright (c)**************************************************
** 广州周立功单片机发展有限公司
** 研 究 所
** 产品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: UART0APP.C
**创 建 人: 刘养海
**最后修改日期: 2004年2月25日
**描 述: 定义LPC21xx\LPC22xx中UART0应用层函数
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 刘养海
** 版 本: v1.0
** 日 期: 2004年2月25日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define _UART0APP_GLOBAL_
//文件引用
#include "config.h"
#include "global.h"
//#define Fpclk 11059200
/*********************************************************************************************************
**--------------技巧说明------------------------------------------------------------------------------
** 在文件中定义了用于UART0实际应用层操作的函数
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*
************************************************************************************************************************
**函数原型 : void Delay(UINT32 i)
**参数说明 : i;软件Delay
**返回 值 : 无
**说 明 : 本函数用于简单的延时
*****
*******************************************************************************************************************
*/
void Delay(UINT32 i)
{
while(i--);
}
//用下面的有限状态机实现
/*
-->0--$--1
1--A--2--6 char--0 炮塔角度传感器
... ...
A 炮塔角度传感器8
B 炮塔电源
C 火控制接口装置33
D 光电对抗设备
E 工矿采集设备
F 毫米波信道机50
G GPS定位设备
H 惯性导航设备
I 车载电源(直流)35
J 车载电源(交流)9
*/
#if 0
#define A_LEN 8
#define B_LEN 0
#define C_LEN 33
#define D_LEN 0
#define E_LEN 50
#define F_LEN 0
#define G_LEN 79
#define H_LEN 0
#define I_LEN 35
#define J_LEN 9
void __irq IRQ_UART0(void)
{
if( (0x04==(U0IIR&0x0F)) && (CanSendFlag == 0))
switch(UartStatus)
{
case 0:
RcvCounter=0;
if((UINT8)uU0RBR.Word == 0x24)
{
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
UartStatus++;
}
HC595_SendDat(DISP_TAB[0]);
break;
case 1:
HC595_SendDat(DISP_TAB[1]);
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
DeviceID = (UINT8)uU0RBR.Word;
UartStatus = DeviceID - 63; //因为63='A'-2
break;
case 2:// A 炮塔角度传感器
HC595_SendDat(DISP_TAB[2]);
if(RcvCounter < A_LEN-1)
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
else
{
if((UINT8)uU0RBR.Word == 0x0A )
{
SRBuf[A_LEN-1]=0x0A;
CanSendFlag =1; //检验一下报尾,使能CAN发送
}
UartStatus=0;
}
break;
case 3:// B 炮塔电源
break;
case 4:// C 火控制接口装置
if(RcvCounter < C_LEN)
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
else
{
if((UINT8)uU0RBR.Word == 0x0A );
{
SRBuf[C_LEN-1]=0x0A;
CanSendFlag =1; //检验一下报尾,使能CAN发送
}
UartStatus=0;
}
break;
case 5:// D 光电对抗设备
break;
case 6:// E 工矿采集设备
if(RcvCounter < E_LEN)
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
else
{
if((UINT8)uU0RBR.Word == 0x0A )
{
SRBuf[E_LEN-1]=0x0A;
CanSendFlag =1; //检验一下报尾,使能CAN发送
}
UartStatus=0;
}
break;
case 7:// F 毫米波信道机
break;
case 8:// G GPS定位设备
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
if((UINT8)uU0RBR.Word == 'P' )
UartStatus=12;
else
{
UartStatus=0;
RcvCounter = 0;
}
break;
case 12:// GP GPS定位设备
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
if((UINT8)uU0RBR.Word == 'G' )
UartStatus=13;
else
{
UartStatus=0;
RcvCounter = 0;
}
break;
case 13:// GPG GPS定位设备
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
if((UINT8)uU0RBR.Word == 'G' )
UartStatus=14;
else
{
UartStatus=0;
RcvCounter = 0;
}
break;
case 14:// GPGG GPS定位设备
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
if((UINT8)uU0RBR.Word == 'A' )
UartStatus=15;
else
{
UartStatus=0;
RcvCounter = 0;
}
break;
case 15:// GPGGA GPS定位设备
if(RcvCounter < G_LEN)
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
else
{
if((UINT8)uU0RBR.Word == 0x0A )
{
SRBuf[G_LEN-1]=0x0A;
CanSendFlag =1; //检验一下报尾,使能CAN发送
}
UartStatus=0;
}
break;
case 9:// H 惯性导航设备
break;
case 10://I 车载电源(直流)
if(RcvCounter < I_LEN)
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
else
{
if((UINT8)uU0RBR.Word == 0x0A )
{
SRBuf[I_LEN-1]=0x0A;
CanSendFlag =1; //检验一下报尾,使能CAN发送
}
UartStatus=0;
}
break;
case 11://J 车载电源(交流)
if(RcvCounter < J_LEN)
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
else
{
if((UINT8)uU0RBR.Word == 0x0A )
{
SRBuf[J_LEN-1]=0x0A;
CanSendFlag =1; //检验一下报尾,使能CAN发送
}
UartStatus=0;
}
break;
default:
tmp = (UINT8)uU0RBR.Word;
UartStatus=0;
CanSendFlag =0;
RcvCounter = 0;
break;
}
VICVectAddr = 0x00; // 中断处理结束
}
/*
************************************************************************************************************************
**函数原型 : void InitUart0(UINT32 BPS)
**参数说明 : BPS -->> BandRate;
LCR -->> U0LCR 寄存器;
FCR -->> UOFCR 寄存器;
**返回 值 : 无
**说 明 : 本函数用于硬件初始化UART0
************************************************************************************************************************
*/
void InitUart0(UINT32 BPS)
{
PCONP |= (0x01 << 3) ;
PINSEL0 &= ~((UINT32)0x0F);
PINSEL0 |= ((UINT32)0x05);
//设定波特率
U0LCR =0x80;
U0DLL=Fpclk/(16*BPS)&0x000000ff;
U0DLM=(Fpclk/(16*BPS)) >>8;
uU0LCR.Bits.DLAB_BIT =0x00;
//在此加入自己的初始化代码
U0LCR =0x03;
U0FCR =0x01;//0xC1;
U0IER = 0x01; //允许接收中断
/* 设置中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr0 = (int)IRQ_UART0; // 设置UART0向量地址
VICIntEnable = 0x00000040; // 使能UART0中断
}
#endif
/*
************************************************************************************************************************
**函数原型 : void Uart0Send(UINT32 Len,UINT8 *Buf)
**参数说明 : Len -->> 发送字符长度;
Buf -->> 要发送数据的缓冲区首址
**返回 值 : 无
**说 明 : 本函数用于UART0发送数据,应用FIFO,非发送中断方式
************************************************************************************************************************
*/
void Uart0Send(UINT32 Len,UINT8 *Buf)
{
UINT32 i,j,k;
UINT8 *p =Buf;
i= Len/16;
j=Len%16;
while(i--)
{
for(k=0;k<16;k++)
{
uU0THR.Word=(UINT32)(*p++);
}
while(0 == (U0LSR &0x40));
}
for(k=0;k<j;k++)
{
uU0THR.Word=(UINT32)(*p++);
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -