📄 uart.c
字号:
/*****************************************************************************************
* 模块名称: 串口通讯模块
* 模块描述: 串口通讯模快,选择uart0作为通讯口
* 创建人 : hlb
* 创建日期: 2008-4-8
******************************************************************************************
* 修改人 :
* 修改日期:
*****************************************************************************************/
#include <LPC22xx.h>
#include "Public.h"
#include "Uart.h"
#include "Queue.h"
#include <string.h>
__irq void Uart_RcvTask(void);
/*****************************************************************************************
* 接收缓冲区定义
*****************************************************************************************/
#define RCVBUF_SIZE 20
typedef struct
{
U8 D[RCVBUF_SIZE];
U32 Idx;
}TRcvBuf;
static TRcvBuf UartBuf;
/*****************************************************************************************
* 函数名称: void Uart_Init(S32 Baud, S32 DataBit, S32 ODD, S32 StopBit)
* 函数描述: 串口初始化
* 参数描述: Baud 波特率, DataBit 数据位,ODD 奇偶校验 0 禁止校验 1 奇校验 2 偶校验
* StopBit 停止位
*****************************************************************************************/
void Uart_Init(U32 Baud, U32 DataBit, S32 ODD, U32 StopBit)
{
U16 Fdiv;
PINSEL0 = (PINSEL0 & 0xFFFFFFF0) | 0x5; //选择引脚为串口
//IO0DIR = IO0DIR | 0x1; //TxD,P0.0 定义为输出
//IO0DIR = IO0DIR & 0xFFFFFFFD; //RxD,P0.1 定义为输入
U0LCR = 0x83; //字长度
if (StopBit ==1)
{
U0LCR = U0LCR & 0xFFFFFFFB; //一个停止位
}
else
{
U0LCR = U0LCR | 0x00000004; //两个停止位
}
if (ODD == 0) //禁止校验
{
U0LCR = U0LCR & 0xFFFFFFF7; //禁止奇偶校验
}
else if (ODD == 1) //奇校验
{
U0LCR = U0LCR | 0x00000008; //使能奇偶校验
U0LCR = U0LCR & 0xFFFFFFCF; //奇校验
}
else //偶校验
{
U0LCR = U0LCR | 0x00000008; //使能奇偶校验
U0LCR = (U0LCR | 0x00000030) & 0xFFFFFFDF; //偶校验
}
Fdiv = (GD.Fpclk / 16) / Baud;
U0DLM = (U8)(Fdiv >> 8);
U0DLL = (U8)(Fdiv & 0x0FF);
U0FCR = 0x7;
U0LCR = U0LCR & 0x7F; //禁止访问除数锁存寄存器
memset(&UartBuf, 0, sizeof(TRcvBuf));
VICIntSelect = VICIntSelect & (~(1 << 6)); //Uart0中断分配为IRQ中断
VICIntEnable = VICIntEnable | (1 << 6); //允许Uart0中断
VICVectAddr1 = (U32)Uart_RcvTask;
VICVectCntl1 = 0x20 | 0x6; //中断Uart0分配给中断优先级为0的中断槽
U0IER = 0x1; //使能Uart0接受中断
}
/*****************************************************************************************
* 函数名称: void Uart_SendByte(Byte Data)
* 函数描述: 发送一个字节
*****************************************************************************************/
void Uart_SendByte(U8 data)
{
U0THR = data; //发送数据
while ((U0LSR & 0x40) == 0); //等待数据发送完毕
}
/*****************************************************************************************
* 函数名称: Byte Uart_ReceiveByte(void)
* 函数描述: 发送一个字节
*****************************************************************************************/
U8 Uart_ReceiveByte(void)
{
U8 rcv_data;
while ((U0LSR & 0x01) == 0); //等待数据
rcv_data = U0RBR;
return (rcv_data);
}
/*****************************************************************************************
* 函数名称: void Uart_SendStr(U8 const * str)
* 函数描述: 发送一个字节
*****************************************************************************************/
void Uart_SendStr(U8 const * str)
{
while (TRUE)
{
if (*str == '\0') break;
Uart_SendByte(*str++);
}
}
/*****************************************************************************************
* 函数名称: void Uart_RcvISR(void)
* 函数描述: Uart0接受中断服务程序
*****************************************************************************************/
__irq void Uart_RcvTask(void)
{
static U8 rcv_data;
if ((U0IIR & 0x0F) == 0x4)
{
if ((U0LSR & 0x1) == 1)
{
rcv_data = U0RBR;
if (rcv_data == '@')
{
UartBuf.Idx = 0;
UartBuf.D[UartBuf.Idx++] = rcv_data;
}
else if (rcv_data == '#')
{
if (UartBuf.Idx < RCVBUF_SIZE - 1)
{
UartBuf.D[UartBuf.Idx++] = rcv_data;
UartBuf.D[UartBuf.Idx] = 0;
Queue_Put(&CommQueue, &UartBuf.D[0], UartBuf.Idx+1);
}
}
else
{
if (UartBuf.Idx < RCVBUF_SIZE)
{
UartBuf.D[UartBuf.Idx++] = rcv_data;
}
}
}
}
VICVectAddr = 0x0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -