/************************************************************************<br />使用UART1与PC通讯,禁止MODEM, ARM CORE: LPC2132<br />自环测试,BPS=115200<br />************************************************************************/<br />#include "config.h"<br /><br />/************************************************************************<br />全局变量或常量定义区<br />error: 差错标志位<br />rev_buf: 接收中断缓冲区<br />rev_flag: 接收中断标志<br /><br />*************************************************************************/<br />UINT8 error;<br />UINT8 rev_buf[10];<br />UINT8 rev_flag;<br /><br />/***********************************************************************<br />UART1 Configure Sub Routine<br />BPS = Fclk/U1DLM_U1DLL/16 <br /><br />*************************************************************************/<br />void UART1_CFG(void)<br />{<br /> U1LCR = 0x83; //8位字长,1bit停止位偶校验<br /> U1DLM = 0x0; //波特率为115200BPS<br /> U1DLL = 0x06; //设置UART1波特率为Pclk/U1DLL/16<br /> U1FCR = 0x81; //使能RX,TX FIFO,触发点位8BYTE<br /> U1LCR = 0x03; //切换寄存器访问<br /> U1IER = 0x07; //使能RBR,THRE,RX线状态中断<br /> <br /><br />}<br />/**********************************************************************<br />UART1中断服务程序<br />在超时或接收中断中不能用: U1THR = 0XFF;<br /> U1THR = 0XFF;<br />启动发送中断,因为发送中断优先级最低;<br />所以应该设置标志位,在中断外启动发送中断<br />state: 状态变量缓存<br />i: 接收发送字节数<br />无参无返回类型<br />***********************************************************************/<br />void __irq UART1_ISR(void)<br />{<br /> UINT8 state;<br /> static UINT8 i;<br /> state = U1IIR; //清除中断,必须读取UART1中断标识<br /> state &= 0x0F;<br /> <br /> switch (state) <br /> {<br /> case 0x06: <br /> { //接收差错<br /> error = 1;<br /> break;<br /> }<br /> <br /> case 0x04: //接收中断<br /> {<br /> for(i=0;i<8;i++)<br /> *(rev_buf+i) = U1RBR;<br /> break;<br /> <br /> <br /> }<br /> <br /> case 0x0C: //超时中断<br /> { <br /> *(rev_buf+i) = U1RBR; <br /> i++;<br /> *(rev_buf+i) = U1RBR;<br /> i = 0;<br /> rev_flag = 1;<br /> break;<br /> <br /> <br /> }<br /> <br /> case 0x02: //发送中断<br /> if(i<10)<br /> {<br /> U1THR = *(rev_buf+i);<br /> i++;<br /> break;<br /> }<br /> <br /> }<br /> VICVectAddr = 0; //复位IRQ地址寄存器<br /><br />}<br /><br />/************************************************************************<br />IO configure Function<br /><br />************************************************************************/<br />void IO_CFG(void)<br />{<br /> PINSEL2 = 0x4;<br /> IO1DIR |= 0x03FE0000; //配置LED<br /> PINSEL0 |= 0x00050000; //配置UART11,TX,RX<br /> IO0DIR = 1<<7; //配置BEEP<br /> IO1SET |= 0x03FE0000;<br /> IO0SET |= 1<<7;<br /> <br />}<br />/************************************************************************<br />Sub Routines,初始化VIC机制,使能IRQ中断,UART1中断分配在SLOT0,<br />指定ISR相应地址,VICVectorAdr0<br /><br />*************************************************************************/<br />void VIC_ini(void)<br />{<br /> IRQEnable();<br /> VICVectCntl0 = 0x27;<br /> VICIntEnClr &= ~(1<<7);<br /> VICIntSelect &= ~(1<<7); //UART1分配为IRQ中断<br /> VICVectAddr0 = (UINT32)UART1_ISR; //Map to Slot0<br /> //U1THR = 0xFF; //在使能发送中断前必须写入发送FIFO两个字节<br /> //U1THR = 0xFF;<br /> VICIntEnable |= 1<<7; //使能UART1中断<br /> <br /><br />}<br />/*************************************************************************<br />Main Routine<br />初始化系统,差错控制<br />*************************************************************************/<br />int main(void)<br />{ <br /> IO_CFG();<br /> UART1_CFG();<br /> VIC_ini();<br /> <br /> while(1)<br />//判断是否有传输差错并激活蜂鸣器<br /> if(error)<br /> {<br /> error = 0;<br /> IO0CLR = 1<<7;<br /> }<br />//判断接收中断是否结束并启动发送中断<br /> else if(rev_flag)<br /> {<br /> rev_flag = 0;<br /> U1THR = 0xFF;<br /> U1THR = 0xFF;<br /> }<br /> <br /> return 0;<br /> <br />}<br /> <br /> |
|