📄 uartapp.c
字号:
/****************************************Copyright (c)**************************************************
** 河南恩湃电力技术有限公司
** 测 控 部
**
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: UARTAPP.C
**创 建 人:
**最后修改日期:
**描 述: 定义LPC21xx\LPC22xx中UART应用层函数
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define _UART0APP_GLOBAL_
//文件引用
#include "config.h"
//#define Fpclk 11059200
/*********************************************************************************************************
**--------------技巧说明------------------------------------------------------------------------------
** 在文件中定义了用于UART0实际应用层操作的函数
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*
************************************************************************************************************************
**函数原型 : void Delay(UINT32 i)
**参数说明 : i;软件Delay
**返回 值 : 无
**说 明 : 本函数用于简单的延时
*****
*******************************************************************************************************************
*/
UINT8 rcv_bufa[20]; // UART0数据接收缓冲区
uint8 rcv_count;
UINT8 rcv_new; // 接收新数据标志
uint8 uart1test;
uint8 uartstep;
extern uint8 Locoal_Addr;
extern void printstr(char *codec,uint8 com);
extern void two_send(uint8 tt,uint8 com);
/****************************************************************************
* 名称:SendByte()
* 功能:向串口UART0发送字节数据。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void SendByte(UINT8 data)
{
IO1CLR = LED3;
U0THR = data; // 发送数据
while(0 == (U0LSR &0x40));
IO1SET = LED3;
}
/****************************************************************************
* 名称:Uart1SendByte()
* 功能:向串口UART1发送字节数据。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void Uart1SendByte(UINT8 data)
{
IO1CLR = LED3;
U1THR = data; // 发送数据
while(0 == (U1LSR &0x40));
IO1SET = LED3;
}
/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void ISendBuf(void)
{ UINT8 i;
for(i=0; i<8; i++) SendByte(rcv_buf[i]);
while( (U1LSR&0x20)==0 ); // 等待数据发送
}
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud 波特率
* set 模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初始化成功,为0表示参数出错
****************************************************************************/
UINT8 UART0_Ini(UINT32 baud, UARTMODE set)
{ UINT32 bak;
/* 参数过滤 */
if( (0==baud)||(baud>115200) ) return(0);
if( (set.datab<5)||(set.datab>8) ) return(0);
if( (0==set.stopb)||(set.stopb>2) ) return(0);
if( set.parity>4 ) return(0);
/* 设置串口波特率 */
U0LCR = 0x80; // DLAB位置1
bak = (Fpclk>>4)/baud;
U0DLM = bak>>8;
U0DLL = bak&0xff;
/* 设置串口模式 */
bak = set.datab-5; // 设置字长度
if(2==set.stopb) bak |= 0x04; // 判断是否为2位停止位
if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}
bak |= set.parity<<4; // 设置奇偶校验
U0LCR = bak;
return(1);
}
/***************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
***************************************************************************/
void UART1_Ini(UINT32 baud)
{ UINT16 Fdiv;
U1LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / baud; // 设置波特率
U1DLM = Fdiv / 256;
U1DLL = Fdiv % 256;
U1LCR = 0x03;
}
/***************************************************************************
* 名称:UART1sentbyte
* 功能:发送一字节数据
***************************************************************************/
void UART1_SendByte(UINT8 data)
{ U1THR = data; // 发送数据
while( (U1LSR&0x40)==0 ); // 等待数据发送完毕
}
/****************************************************************************
* 名称:HC595_SendDat()
* 功能:向74HC595发送一字节数据
* 入口参数:dat 要发送的数据
* 出口参数:无
* 说明:发送数据时,高位先发送。
****************************************************************************/
/*void HC595_SendDat(UINT8 dat)
{ UINT8 i;
IO0CLR = SPI_CS; // SPI_CS = 0
for(i=0; i<8; i++) // 发送8位数据
{ IO0CLR = SPI_CLK; // SPI_CLK = 0*/
/* 设置SPI_DATA输出值 */
/* if( (dat&0x80)!=0 ) IO0SET = SPI_DATA;
else IO0CLR = SPI_DATA;
dat <<= 1;
IO0SET = SPI_CLK; // SPI_CLK = 1
}
IO0SET = SPI_CS; // SPI_CS = 1,输出显示数据
}*/
/* 数码管显示字模表(0-F) */
/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
/*
void __irq IRQ_UART0(void)
{ //uint8 i;
if( 0x04==(U0IIR&0x0F) )
{
IO1CLR = LED3;
rcv_bufa[rcv_count] = U0RBR;
if(uart1test==0xdd)
Uart1SendByte(rcv_bufa[rcv_count]);
if(rcv_count < 20)
rcv_count++;
else
rcv_count=0;
rcv_new = 1;// 设置接收到新的数据标志
IO1SET = LED3;
}
VICVectAddr = 0x00; // 中断处理结束
}
*/
void __irq IRQ_UART0(void)
{
uint8 i;
if( 0x04==(U0IIR&0x0F) )
{
IO1CLR = LED3;
i = U0RBR;
//two_send(i,2);
//Uart1SendByte(',');
switch(uartstep)
{
case 0: if(i==0xfb)
{
uartstep=1;
//rcv_count=0;
}
rcv_count=0;
break;
case 1: if(i==0x91)
{
uartstep=2;
}
else
{
uartstep=0;
}
rcv_count=0;
break;
case 2: if(i==0xfb)
{
uartstep=3;
}
else
{
uartstep=0;
}
break;
case 3: if(i==0x91)
{
uartstep=4;
}
else
{
uartstep=0;
}
break;
case 4: if(i==0xfb)
{
uartstep=5;
}
else
{
uartstep=0;
}
break;
case 5: if(i==0x91)
{
uartstep=6;
}
else
{
uartstep=0;
}
rcv_count=0;
break;
case 6: rcv_bufa[rcv_count] = i;
rcv_count++;
//two_send(rcv_count,2);
//Uart1SendByte(',');
if(rcv_count>=10)
{
if(rcv_bufa[1]==Locoal_Addr)
{
rcv_new = 1;// 设置接收到新的数据标志
rcv_count=0;
uartstep=0;
}
else
{
rcv_count=0;
uartstep=0;
}
}
break;
default:
rcv_count=0;
uartstep=0;
break;
}
if(uart1test==0xdd)
Uart1SendByte(rcv_bufa[rcv_count]);
IO1SET = LED3;
}
VICVectAddr = 0x00; // 中断处理结束
}
uint8 uart1count=0;
uint8 uart1buf[10];
void __irq IRQ_UART1(void)
{
//UINT8 i;
if( 0x04==(U1IIR&0x0F) )
{
IO1CLR = LED3;
uart1buf[uart1count]=U1RBR;
if(uart1buf[uart1count]==0x0d)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -