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;
}
文章评论(0条评论)
登录后参与讨论