/************************************************************************ 使用UART1与PC通讯,禁止MODEM, ARM CORE: LPC2132 自环测试,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; } |