📄 uart0.c
字号:
//========================================================================//
// 文件名: UART0.c
// 作 者: xinqiang Zhang(小丑) (email: xinqiang@Mzdesign.com.cn)
// 日 期: 2008/01/04
// 描 述: UART0模块的应用代码
//
// 参 考:
// 版 本:
// 2008/01/04 First version Mz Design
//========================================================================//
#include "LPC22xx.H" /* LPC22xx definitions */
#include "type.h"
#include "target.h"
#include "irq.h"
#include "uart0.h"
//DWORD UART0Status;
//BYTE UART0TxEmpty = 1;
BYTE UART0_Tx_Buf[BUFSIZE]; //发送数据缓存区
DWORD UART0_Tx_Index=0; //当前发送数据的索引
BYTE UART0_Tx_flag=0; //数据包发送标识
DWORD UART0_Tx_Counter=0; //实际发送的数据包中的数据个数
BYTE UART0_Rx_Buf[BUFSIZE]; //接收数据缓存区
BOOL UART0_Rx_flag=FALSE; //数据包接收完成标识,当然是在采用数据包形式的数据传输时才使用
DWORD UART0_Rx_Counter=0; //接收数据缓冲区中的数据个数
//DWORD UART0Count = 0;
//========================================================================//
// 函数: void UART0Handler (void)
// 描述: UART0中断服务程序
// 参数: 无
// 返回: 无
// 备注:
// 版本:
// 2008/01/05 First version
//========================================================================//
void UART0Handler (void) __irq
{
BYTE IIRValue, LSRValue;
BYTE Dummy;
DWORD i=0;
IENABLE; //中断嵌套使能
IIRValue = U0IIR; //读取UART0中断标识
IIRValue &= 0x0e; //仅保留有效的中断标识位
if ( IIRValue == IIR_RLS ) //接收线状态 Receive Line Status
{
LSRValue = U0LSR; //读取线状态,同时会清零线状态
if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) ) //如果发生了任意一个错误则处理如下
{
Dummy = U0RBR; //读数据接收缓冲寄存器会清除中断标识
IDISABLE; //中断嵌套禁止
VICVectAddr = 0; // Acknowledge Interrupt
return;
}
if ( LSRValue & LSR_RDR ) //接收数据OK Receive Data Ready
{
Dummy = U0RBR;
if(UART0_Rx_Counter>=BUFSIZE)
{
for(i=0;i<BUFSIZE-1;i++)
UART0_Rx_Buf[i] = UART0_Rx_Buf[i+1];
UART0_Rx_Buf[BUFSIZE-1] = Dummy;
}
else UART0_Rx_Buf[UART0_Rx_Counter++] = Dummy;
UART0_Rx_flag = TRUE;
}
}
else if ( IIRValue == IIR_RDA ) //接收数据可用 Receive Data Available
{
Dummy = U0RBR;
if(UART0_Rx_Counter>=BUFSIZE)
{
for(i=0;i<BUFSIZE-1;i++)
UART0_Rx_Buf[i] = UART0_Rx_Buf[i+1];
UART0_Rx_Buf[BUFSIZE-1] = Dummy;
}
else UART0_Rx_Buf[UART0_Rx_Counter++] = Dummy;
UART0_Rx_flag = TRUE;
}
else if ( IIRValue == IIR_CTI ) //数据包接收超时 Character timeout indicator
{ //实际上就是使能FIFO时,在接收的队列当中的有效数据>=1时,在3.5~4.5个字符周期
//之内没有发生FIFO的动作,则产生该中断
Dummy = U0RBR; //读数据以清中断
}
else if ( IIRValue == IIR_THRE )//发送移位寄存器空,即上一次发送完成并准备好了下一次发送 THRE, transmit holding register empty
{
LSRValue = U0LSR; //检查状态寄存器,看是否在U0THR当中有有效数据存在
if ( LSRValue & LSR_THRE )
{ //可以发送
if(UART0_Tx_Index<UART0_Tx_Counter)
{
U0THR = UART0_Tx_Buf[UART0_Tx_Index++];
// U1IER &= ~0x02;//
}
else
{
UART0_Tx_flag = 0; //当前发送状态标识清零
}
}
}
IDISABLE;
VICVectAddr = 0; // Acknowledge Interrupt
}
//========================================================================//
// 函数: void UART0Init(DWORD baudrate)
// 描述: UART0初始化函数
// 参数: baudrate 要设置的波特率
// 返回: 无
// 备注:
// 版本:
// 2008/01/05 First version
//========================================================================//
void UART0Init(DWORD baudrate)
{
DWORD Fdiv;
PINSEL0 &= ~0x0000000f; //Enable RX0 TX0 port of UART0
PINSEL0 |= 0x00000005;
U0LCR = 0x83; //设置8位数据模式,一个停止位,无奇偶校验
Fdiv = ( Fpclk / 16 ) / baudrate ;
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
install_irq( UART0_INT, (void *)UART0Handler );
U0LCR &= ~0x80;
// U0FCR |= 0x01;
// U0FCR |= 0x40;
U0IER = 0x07; //打开UART0的中断
}
//========================================================================//
// 函数: void UART0Send(BYTE *BufferPtr, DWORD Length )
// 描述: UART0数据包发送函数
// 参数: BufferPtr 要发送的数据的首地址
// Length 要发送的数据的个数
// 返回: 无
// 备注:
// 版本:
// 2008/01/05 First version
//========================================================================//
void UART0Send(BYTE *BufferPtr, DWORD Length )
{
while(UART0_Tx_flag); //等待发送完毕
if(Length<=BUFSIZE)
{
//装载数据包的数据至发送缓冲区
for(UART0_Tx_Counter=0;UART0_Tx_Counter< Length;UART0_Tx_Counter++)
UART0_Tx_Buf[UART0_Tx_Counter] = *BufferPtr++;
UART0_Tx_Index = 0; //索引清零
UART0_Tx_flag = 1; //发送标识置1
U0THR = UART0_Tx_Buf[UART0_Tx_Index++];
}
else return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -