| 
 
| //下面是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。 | 
 |