📄 uart.c
字号:
#include "lpc21xx.h"
#define Fpclk 11059200/4
#define UART_BPS 4800 /* 串口通信波特率 */
#define LN 128
int RcvNew;
enum OptCodeType {PUSH,POP,CLR,CHECK};
/*********************************************************************************************************
** Function name: int SentFIFO(int OptCode,char OptNum)
** Descriptions: FIFO函数,用作发送缓存
** input parameters: OptCode (PUSH POP CLR CHECK OTHER)
OptNum (DATA NUll NULL NULL NULL)
** Returned value: int (0/1 0/DATA 1 Long 0 )
** output parameters: 无
*********************************************************************************************************/
int SentFIFO(int OptCode,char OptNum)
{
#define FIFO_Size 128
static char FIFO[FIFO_Size],ptIN,ptOUT;
switch(OptCode)
{
case PUSH :
if(ptOUT==((ptIN+1)%FIFO_Size)) return 0 ;
else
{
FIFO[ptIN]=OptNum;
ptIN=(ptIN+1)%FIFO_Size;
return 1;
}
case POP :
if(ptIN==ptOUT) return(0);
else
{
OptNum=FIFO[ptOUT];
ptOUT=(ptOUT+1)%FIFO_Size;
return(OptNum);
}
case CLR :
ptOUT=ptIN;
return 1;
case CHECK:
if(ptOUT>ptIN) return(ptOUT-ptIN);
else return (ptIN-ptOUT);
default:
return 0;
}
}
/*********************************************************************************************************
** Function name: int RevFIFO(int OptCode,char OptNum)
** Descriptions: FIFO函数,用作接收缓存
** input parameters: OptCode (PUSH POP CLR CHECK OTHER)
OptNum (DATA NUll NULL NULL NULL)
** Returned value: int (0/1 0/DATA 1 Long 0 )
** output parameters: 无
*********************************************************************************************************/
int RcvFIFO(int OptCode,char OptNum)
{
#define FIFO_Size 128
static char FIFO[FIFO_Size],ptIN,ptOUT;
switch(OptCode)
{
case PUSH :
if(ptOUT==((ptIN+1)%FIFO_Size)) return 0 ;
else
{
FIFO[ptIN]=OptNum;
ptIN=(ptIN+1)%FIFO_Size;
return 1;
}
case POP :
if(ptIN==ptOUT) return(0);
else
{
OptNum=FIFO[ptOUT];
ptOUT=(ptOUT+1)%FIFO_Size;
return(OptNum);
}
case CLR :
ptOUT=ptIN;
return 1;
case CHECK:
if(ptOUT>ptIN) return(ptOUT-ptIN);
else return (ptIN-ptOUT);
default:
return 0;
}
}
/*********************************************************************************************************
** Function name: AutoSent(void)
** Descriptions: 串口发送缓冲区送到THER
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void AutoSent(void)
{
int i;
for(i=0;i<8;i++)
if(!SentFIFO(CHECK,0)) { return;}
else U0THR=SentFIFO(POP,0);
}
/*********************************************************************************************************
** Function name: UART0_IRQ
** Descriptions: 串口中断服务函数
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void UART0_IRQ (void) __irq
{
int i,flag=U0IIR ;
switch (flag & 0x0e) /* 判断中断标志 */
{ /* 接收数据中断 */
case 0x04:
for (i= 0;i < 8;i++) /* 连续接收8个字节 */
RcvFIFO(PUSH,U0RBR);
break;
case 0x0C: /* 字符超时中断 */
while ((U0LSR & 0x01) == 0x01) /* 判断数据是否接收完毕 */
RcvFIFO(PUSH,U0RBR);
break;
case 0x02:
AutoSent();
break;
default:
break;
}
VICVectAddr = 0x00;
}
/*********************************************************************************************************
** Function name: UARTInit
** Descriptions: 串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为9600
** input parameters: uiDly 值越大,延时时间越长
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void UARTInit (void)
{
const int uiFdiv=((Fpclk / 16) / UART_BPS); /* 设置波特率*/
PINSEL0 = PINSEL0 & (~0x0F);
PINSEL0 = PINSEL0 | 0x05; /* 设置I/O连接到UART */
U0LCR = 0x83; /* 允许设置波特率 */
U0DLM = uiFdiv / 256;
U0DLL = uiFdiv % 256;
U0LCR = 0x03; /* 锁定波特率 */
U0FCR = 0x81; /* 使能FIFO,设置8个字节触发点 */
U0IER = 0x07; /* 使能接收中断 */
VICIntSelect = 0x00000000; /* 设置所有中断为向量中断 */
VICVectCntl0 = 0x20 | 0x06; /* 设置串口中断为最高优先级 */
VICVectAddr0 = (int)UART0_IRQ; /* 设置向量地址 */
VICIntEnable = 1 << 0x06; /* 使能串口中断 */
}
/*********************************************************************************************************
** Function name: UART0SendStr
** Descriptions: 向串口发送一个字符
** input parameters: varChar 要发送的字符串指针
** output parameters: 无
** Returned value: 无
***************************************************************************************8****************/
void UART0SendByte (char varChar)
{
SentFIFO(PUSH,varChar); /* 写入数据 */
if(U0LSR&0x40) /* 数据空,重写数据 */
AutoSent();
}
/*********************************************************************************************************
** Function name: UART0SendStr
** Descriptions: 向串口发送字符串
** input parameters: Str 要发送的字符串指针
** output parameters: 无
** Returned value: 无
***************************************************************************************8****************/
void UART0SendStr(char const *Str)
{ int flag;
while( *Str)
{ /* 发送字符串,以字符串结束符结束*/
flag=SentFIFO(PUSH,*Str++);
if(!flag) break;
}
if(U0LSR&0x20)
AutoSent();
}
/*********************************************************************************************************
** Function name: main
** Descriptions: 串口0中断方式通信
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
int main (void)
{
char i;
UARTInit (); /* 串口初始化 */
VICIntSelect = 0x00000000; /* 设置所有中断为向量中断 */
VICVectCntl0 = 0x20 | 0x06; /* 设置串口中断为最高优先级 */
VICVectAddr0 = (int)UART0_IRQ; /* 设置向量地址 */
VICIntEnable = 1 << 0x06; /* 使能串口中断 */
UART0SendStr ("===================Hello! ZhiHui Chengjiang=======================\n");
UART0SendStr ("ARM: I'm ready now,sent me the massage!\n");
while (1)
{
if(RcvFIFO(CHECK,0))
{
i=RcvFIFO(POP,0);
if(i)
UART0SendByte(i); /* 向串口发送数据 */ */
}
}
return 0;
}
/*********************************************************************************************************
End Of File
**********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -