|
//下面是Uart.h程序<br />#ifndef __UART_H<br />#define __UART_H<br /><br />#ifndef NONE <br />#define NONE (0)<br />#endif<br /><br />#ifndef EVEN <br />#define EVEN (2)<br />#endif<br /><br />#ifndef ODD <br />#define ODD (1)<br />#endif<br /><br />typedef struct <br />{<br /> uint32 baudrate;//波特率<br /> uint8 databit; //字长度,5/6/7/8可选<br /> uint8 stopbit; //停止位,1/2位可选<br /> uint8 parity; //奇偶校验位,0:无校验,1:奇校验,2,偶校验<br /> uint8 rxinten; //接收中断允许,0禁止,1使能中断接收<br />}UARTMODE;<br /><br />uint8 Uart0Init(UARTMODE *set);<br />//查询发送单个字节<br />void Uart0Send(uint8 dat);<br />//查询发送多个字节<br />void Uart0SendBytes(uint8 *ptr,uint8 num);<br />//查询发送字符串<br />void Uart0SendStr(uint8 *ptr);<br /><br />uint8 Uart1Init(UARTMODE *set);<br />//查询发送单个字节<br />void Uart1Send(uint8 dat);<br />//查询发送多个字节<br />void Uart1SendBytes(uint8 *ptr,uint8 num);<br />//查询发送字符串<br />void Uart1SendStr(uint8 *ptr);<br /><br />#endif<br /><br />/***********************************************************/<br />//下面是Uart.c程序<br />#include "includes.h"<br />#include "Uart.h"<br /><br />/*********************************************<br />*Function :uart0非嵌套IRQ中断服务程序<br />*Create By:shannon<br />**********************************************/<br />void IRQUart0(void) __irq<br />{<br /> receBuf[0]= U0RBR;<br /> IO1SET = (1 << (receBuf[0] + 16));<br /> VICVectAddr = 0;//向量中断结束<br />}<br /><br />/*********************************************<br />*Function :uart0初始化程序<br />*Create By:shannon<br />**********************************************/<br />uint8 Uart0Init(UARTMODE *set)<br />{<br /> uint32 bak;<br /> <br /> pinmap.pin.p00 = GP000TXD0;<br /> pinmap.pin.p01 = GP001RXD0;<br /> PINSEL0 = pinmap.PinSel[0];<br /> VICIntSelect = VICIntSelect & ~(1 << (UART0_PRI - 1));//设置相应的中断为IRQ中断<br />#if UART0_PRI == 1<br /> VICVectCntl0 = 0x20 | UART0_INT;//分配中断<br /> VICVectAddr0 = (uint32)IRQUart0;//设置中断服务程序地址<br /> VICIntEnable = 1 << UART0_INT; //使能中断<br />#elif (UART0_PRI == 2)<br /> VICVectCntl1 = 0x20 | UART0_INT;<br /> VICVectAddr1 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 3<br /> VICVectCntl2 = 0x20 | UART0_INT;<br /> VICVectAddr2 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 4<br /> VICVectCntl3 = 0x20 | UART0_INT;<br /> VICVectAddr3 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 5<br /> VICVectCntl4 = 0x20 | UART0_INT;<br /> VICVectAddr4 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 6<br /> VICVectCntl5 = 0x20 | UART0_INT;<br /> VICVectAddr5 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 7<br /> VICVectCntl6 = 0x20 | UART0_INT;<br /> VICVectAddr6 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 8<br /> VICVectCntl7 = 0x20 | UART0_INT;<br /> VICVectAddr7 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 9<br /> VICVectCntl8 = 0x20 | UART0_INT;<br /> VICVectAddr8 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 10<br /> VICVectCntl9 = 0x20 | UART0_INT;<br /> VICVectAddr9 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 11<br /> VICVectCntl10 = 0x20 | UART0_INT;<br /> VICVectAddr10 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 12<br /> VICVectCntl11 = 0x20 | UART0_INT;<br /> VICVectAddr11 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 13<br /> VICVectCntl12 = 0x20 | UART0_INT;<br /> VICVectAddr12 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 14<br /> VICVectCntl13 = 0x20 | UART0_INT;<br /> VICVectAddr13 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 15<br /> VICVectCntl14 = 0x20 | UART0_INT;<br /> VICVectAddr14 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#elif UART0_PRI == 16<br /> VICVectCntl15 = 0x20 | UART0_INT;<br /> VICVectAddr15 = (uint32)IRQUart0;<br /> VICIntEnable = 1 << UART0_INT; <br />#endif<br /> <br /> if ((set->databit > 8) || (set->databit < 5))<br /> return(ERR);<br /> if ((set->stopbit == 0) || (set->stopbit > 2))<br /> return(ERR);<br /> if (set->parity > 2)<br /> return(ERR);<br /><br /> U0LCR = 0x80;//DLAB = 1;<br /> bak = (Fpclk >> 4)/(set->baudrate);<br /> U0DLM = bak >> 8;<br /> U0DLL = bak & 0xff;<br /><br /> bak = 0;<br /> bak = set->databit - 5;<br /> if (set->stopbit == 2) bak |= 0x04;<br /> if (set->parity != NONE)<br /> {<br /> bak |= 0x08;<br /> set->parity--;<br /> }<br /> bak |= set->parity << 4;<br /> U0LCR = 0;<br /> U0LCR = bak;//设置串口数据格式<br /> if (set->rxinten)<br /> U0IER = 0x01;//接收中断使能<br /><br /> return (1);<br />}<br /><br />//查询发送单个字节<br />void Uart0Send(uint8 dat)<br />{<br /> U0THR = dat;<br /> while((U0LSR & 0x40) == 0);//移位寄存器和发送保持均为空<br />}<br />//查询发送多个字节<br />void Uart0SendBytes(uint8 *ptr,uint8 num)<br />{<br /> uint8 i;<br /> <br /> for (i = num; num > 0; i--)<br /> {<br /> U0THR = *ptr;<br /> while((U0LSR & 0x40) == 0);//移位寄存器和发送保持均为空<br /> ptr++;<br /> }<br /> <br />}<br />//查询发送字符串<br />void Uart0SendStr(uint8 *ptr)<br />{<br /> while (*ptr){<br /> U0THR = *ptr; <br /> while((U0LSR & 0x40) == 0);//移位寄存器和发送保持均为空<br /> ptr++;<br /> }<br />}<br /><br /><br /><br />我只需要更改UART0_PRI宏的值就可以实现优先级的改变。pinmap.pin.p00 结构体改变引脚的功能也非常方便,如果哪个兄弟希望共同学习arm的可以加我的MSN:hxdlj@hotmail.com。 |
|