原创 LPC2131学习笔记之串口通讯(中断方式)

2009-11-17 12:50 2815 4 4 分类: MCU/ 嵌入式


https://static.assets-stash.eet-china.com/album/old-resources/2009/11/17/6de2e431-8cf5-4fe9-9f5d-80b1a2c9767d.rar
                                LPC2131学习笔记之串口通讯(中断方式)


** Descriptions:  UART0通讯实验,中断方式,使用FIFO。
********************************************************************************************************/
#include "config.h"


/* 定义串口模式设置数据结构 */
typedef struct UartMode
{
 uint8 datab;  // 字长度,5/6/7/8可选
 uint8 stopb;  // 停止位,1/2可选
 uint8 parity;  // 奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UARTMODE;


uint8 rcv_buf[8];  // UART0数据接收缓冲区
volatile uint8 rcv_new; // 接收新数据标志


/*
*********************************************************************************************************
** 函数名称 :IRQ_UART0()
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_UART0 (void)
{
 uint8 i;
 
 if ((U0IIR & 0x0F) == 0x04) 
  rcv_new = 1;   // 设置接收到新的数据标志
 for (i=0; i<8; i++)
 {
  rcv_buf = U0RBR;  // 读取FIFO的数据,并清除中断 
 }
 VICVectAddr = 0x00;   // 中断处理结束
}


/*
*********************************************************************************************************
** 函数名称 :UART0_SendByte()
** 函数功能 :向串口0发送1字节数据
** 入口参数 :dat 要发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendByte (uint8 dat)
{
 U0THR = dat; // 要发送的数据
}


/*
*********************************************************************************************************
** 函数名称 :UART0_SendBuf()
** 函数功能 :向串口发送8字节数据
** 入口参数 :dat 要发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendBuf (void)
{
 uint8 i;
 
 for (i=0; i<8; i++)
  UART0_SendByte(rcv_buf);
 while ((U0LSR & 0x20) == 0); // 等待数据发送完毕
}


/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud 波特率
**     set 模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功,  0-初始化失败
*********************************************************************************************************
*/
int8 UART0_Init (uint32 baud, UARTMODE set)
{
 uint32 bak;
 
 /* 参数过滤 */
 if ((baud ==0 ) || (baud > 115200)) return (0);
 if ((set.datab <5) || (set.datab > 8)) return (0);
 if ((set.stopb == 0) || (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 (set.stopb == 2) bak |= 0x04; // 判断是否为2位停止位
 
 if (set.parity != 0)
 {
  set.parity = set.parity - 1;
  bak |= 0x08;
 }
 bak |= set.parity << 4;    // 设置奇偶校验
 
 U0LCR = bak;
 
 return (1);
}



/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。
** 调试说明 :需要PC串口显示终端软件如EasyARM.exe。
*********************************************************************************************************
*/
int main (void)
{
 UARTMODE set;


 set.datab  = 8;
 set.stopb  = 1;
 set.parity = 0;
 
 rcv_new = 0;
 
 PINSEL0 = 0x00000005;    // 设置I/O连接到UART0
 
 UART0_Init(115200, set);   // 串口初始化
 U0FCR = 0x81;      // 使能FIFO,并设置触发点为8字节
 U0IER = 0x01;      // 允许RBR中断,即接收中断
 
 IRQEnable();      // 使能IRQ中断
 /* 使能UART0中断 */
 VICIntSelect = 0x00000000;   // 设置所有的通道为IRQ中断
 VICVectCntl0 = 0x20 | 0x06;   // UART0分配到IRQ slot0,即最高优先级
 VICVectAddr0 = (uint32)IRQ_UART0; // 设置UART0向量地址
 VICIntEnable = 1 << 0x06;   // 使能UART0中断


 while (1)
 {
  if (rcv_new == 1)
  { 
   rcv_new =0;
   UART0_SendBuf();
  }
 }
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条