原创 LPC2132 UART1测试程序

2007-10-14 16:31 5803 6 6 分类: MCU/ 嵌入式

LPC2132 UART1测试程序


LPC213X系列的片子,串口UART1用起来似乎不是很顺,有网友说是有bug, 下面是UART1的测试程序,


程序接收从PC发送的数据,然后从UART1 重新发送给PC,验证UART1是否正常工作,程序如下.


/************************************************************************
使用UART1与PC通讯,禁止MODEM, ARM CORE: LPC2131
自环测试,BPS=115200
************************************************************************/
#include "config.h"


/************************************************************************
全局变量或常量定义区
error:  差错标志位
rev_buf: 接收中断缓冲区
rev_flag: 接收中断标志


*************************************************************************/
UINT8 error;
UINT8 rev_buf[10];
UINT8 rev_flag;


/***********************************************************************
UART1 Configure Sub Routine
BPS = Fclk/U1DLM_U1DLL/16


*************************************************************************/
void UART1_CFG(void)
{
 U1LCR = 0x83;    //8位字长,1bit停止位偶校验
 U1DLM = 0x0;    //波特率为115200BPS
 U1DLL = 0x06;    //设置UART1波特率为Pclk/U1DLL/16
 U1FCR = 0x81;    //使能RX,TX FIFO,触发点位8BYTE
 U1LCR = 0x03;    //切换寄存器访问
 U1IER = 0x07;    //使能RBR,THRE,RX线状态中断
 


}
/**********************************************************************
UART1中断服务程序
在超时或接收中断中不能用: U1THR = 0XFF;
        U1THR = 0XFF;
启动发送中断,因为发送中断优先级最低;
所以应该设置标志位,在中断外启动发送中断
state: 状态变量缓存
i:  接收发送字节数
无参无返回类型
***********************************************************************/
void __irq UART1_ISR(void)
{
 UINT8 state;
 static UINT8 i;
 state = U1IIR;      //清除中断,必须读取UART1中断标识
    state &= 0x0F;
 
 switch (state) 
 {
  case 0x06:  
    {          //接收差错
     error = 1;
     break;
    }
  
  case 0x04:       //接收中断
    {
     for(i=0;i<8;i++)
     *(rev_buf+i) = U1RBR;
     break;
     
     
    }
   
  case 0x0C:       //超时中断
    { 
      *(rev_buf+i) = U1RBR; 
     i++;
     *(rev_buf+i) = U1RBR;
     i = 0;
     rev_flag = 1;
     break;
     
          
    }
   
  case 0x02:       //发送中断
    if(i<10)
    {
     U1THR = *(rev_buf+i);
        i++;
        break;
        }
       
    }
 VICVectAddr = 0;       //复位IRQ地址寄存器


}


/************************************************************************
IO configure Function


************************************************************************/
void IO_CFG(void)
{
 PINSEL2 = 0x4;
 IO1DIR |= 0x03FE0000;    //配置LED
 PINSEL0 |= 0x00050000;    //配置UART11,TX,RX
 IO0DIR = 1<<7;      //配置BEEP
 IO1SET |= 0x03FE0000;
 IO0SET |= 1<<7;
 
}
/************************************************************************
Sub Routines,初始化VIC机制,使能IRQ中断,UART1中断分配在SLOT0,
指定ISR相应地址,VICVectorAdr0


*************************************************************************/
void VIC_ini(void)
{
 IRQEnable();
 VICVectCntl0 = 0x27;
 VICIntEnClr &= ~(1<<7);
 VICIntSelect &= ~(1<<7);   //UART1分配为IRQ中断
 VICVectAddr0 = (UINT32)UART1_ISR;        //Map to Slot0
 //U1THR = 0xFF;      //在使能发送中断前必须写入发送FIFO两个字节
 //U1THR = 0xFF;
 VICIntEnable |= 1<<7;    //使能UART1中断
 


}
/*************************************************************************
Main Routine
初始化系统,差错控制
*************************************************************************/
int main(void)

 IO_CFG();
 UART1_CFG();
 VIC_ini();
 
 while(1)
//判断是否有传输差错并激活蜂鸣器
 if(error)
 {
  error = 0;
  IO0CLR = 1<<7;
 }
//判断接收中断是否结束并启动发送中断
 else if(rev_flag)
 {
  rev_flag = 0;
  U1THR = 0xFF;
  U1THR = 0xFF;
 }
  
 return 0;
  
}
 
 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条