<br />#include <LPC213x.h><br />/*调用此函数库前要先设置好波特率和VPB频率*/<br />#define UARTBaudrate 9600 /*波特率*/<br />#define Fpclk 11059200/4 /*VPB频率*/ <br />/*ReceivedData为接收到的数据,RecNewData为接收数据标志位,RecNewData为"1"是表示有新数据<br />,为"0"时没有新数据*/<br />unsigned char ReceivedData = 0,RecNewData = 0;<br />/*IRQ中断开关,Flag>0时开中断,Flag=0时关中断*/<br />void EnableIRQ(unsigned char Flag)<br />{<br /> unsigned int temp = 0;<br /> if(Flag)<br /> {<br /> __asm<br /> {<br /> MRS temp, SPSR<br /> BIC temp, temp, #0x80<br /> MSR SPSR_c, temp<br /> /*MOVS PC, LR */<br /> }<br /> }<br /> else<br /> {<br /> __asm<br /> {<br /> MRS temp, SPSR<br /> ORR temp, temp, #0x80<br /> MSR SPSR_c, temp<br /> /*MOVS PC, LR */<br /> }<br /> }<br />}<br /><br />/*IRQ中断开关,Flag>0时开中断,Flag=0时关中断*/<br />void EnableFIQ(unsigned char Flag)<br />{<br /> unsigned int temp = 0;<br /> if(Flag)<br /> {<br /> __asm<br /> {<br /> MRS temp, SPSR<br /> BIC temp, temp, #0x40<br /> MSR SPSR_c, temp<br /> /*MOVS PC, LR */<br /> }<br /> }<br /> else<br /> {<br /> __asm<br /> {<br /> MRS temp, SPSR<br /> ORR temp, temp, #0x40<br /> MSR SPSR_c, temp<br /> /*MOVS PC, LR */<br /> }<br /> }<br />}<br />/*<br />*********************************************************************************************************<br />** 函数名称 :UART0_Init()<br />** 功能 :串口初始化,8位数据,1位停止位,无奇偶校验,<br />*********************************************************************************************************<br />*/<br />void UART0_Init (void)<br />{<br /> unsigned short Fdiv;<br /> /*UART线控制寄存器,设置数据长度,停止位,奇偶校验,除数锁存访问位等<br /> 此处设置为:8位数据,1位停止位,无奇偶校验,允许设置波特率*/<br /> U0LCR = 0x83;<br /> /*Fpclk为VPB时钟频率(外围器件时钟频率),为处理器时钟频率的1/4,1/2或全速,<br /> 由寄存器VPBDIV决定,默认为1/4;Fdiv为UART除数锁存值*/ <br /> Fdiv = (Fpclk / 16) / UARTBaudrate;<br /> /*设置波特率*/ <br /> U0DLM = Fdiv / 256;<br /> U0DLL = Fdiv % 256;<br /> /*8位数据,1位停止位,无奇偶校验,不允许设置波特率*/<br /> U0LCR = 0x03;<br /> /*将IO口连接到UART0*/<br /> PINSEL0 |= 0x00000005;<br />}<br />/*<br />*********************************************************************************************************<br />** 函数名称 :UART0_SendByte()<br />** 功能 :以查询方式从串口发送一字节出去,并等待,发送结束后退出<br /><br />*********************************************************************************************************<br />*/<br />void UART0_SendByte (unsigned char dat)<br />{<br /> U0THR = dat;<br /> /*U0LSR,UART线状态寄存器,等待,当发送完一个字节后结束等待*/<br /> while ((U0LSR & 0x40) == 0); <br />}<br />/*<br />*********************************************************************************************************<br />** 函数名称 :IRQ_UART0()<br />** 功能 :UART0接收、发送中断函数<br />*********************************************************************************************************<br />*/<br />void IRQ_UART0 (void) __irq <br />{<br /><br /> UART0_SendByte (0x11);<br /> /*发送完一字节,再发送0xF1*/<br /> if (U0IIR & 0x02)<br /> {<br /> <br /> UART0_SendByte (0xF1) ;<br /> <br /> } <br /> /*接收到一字节*/<br /> if (U0IIR & 0x04)<br /> {<br /> ReceivedData = U0RBR;<br /> RecNewData = 1;<br /> <br /> } <br /> <br /> /*结束中断,重新设置向量值*/<br /> VICVectAddr = 0x00; <br />}<br /> <br /><br />main (void)<br />{<br /> <br /> UART0_Init();<br /> /*使能FIFO,中断触发点为一个字节*/<br /> U0FCR = 0x01;<br /> /*允许接收和发送中断*/<br /> U0IER = 0x03; <br /> /*使能中断*/ <br /> EnableIRQ(1);<br /> /*设置所有中断分配为IRQ中断*/<br /> VICIntSelect = 0x00000000; <br /> /*将UART0中断分配到0通道(向量IRQ中的最高优先级)*/<br /> VICVectCntl0 = 0x20 | 0x06; <br /> /*设置中断服务程序地址*/<br /> VICVectAddr0 = (unsigned int)IRQ_UART0; <br /> /* 使能UART0中断*/<br /> VICIntEnable = 1 << 0x06; <br /> <br /> UART0_SendByte (0xAB);<br /> while (1)<br /> { <br /> if (RecNewData)<br /> { <br /> UART0_SendByte (0xAC);<br /> RecNewData = 0;<br /> UART0_SendByte (ReceivedData);<br /> }<br /> }<br /> <br />}<br />用查询方式可以正常运用UART0,用中断模式后进入不了ISR,向各位请教。编译环境为keil MDKARM 3.04 |
|