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