[ZLG-ARM] 周立功开发板的bsp程序写的太滥了,下面是我改进的

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

太长

&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;addrOffset;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;addrOffset&nbsp;=&nbsp;prio&nbsp;*&nbsp;4;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(volatile&nbsp;unsigned&nbsp;long&nbsp;*)(VICVectAddrBase&nbsp;+&nbsp;addrOffset)&nbsp;=&nbsp;(unsigned&nbsp;long)lpIsr;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(volatile&nbsp;unsigned&nbsp;long&nbsp;*)(VICVectCntlBase&nbsp;+&nbsp;addrOffset)&nbsp;=&nbsp;0x20&nbsp;|&nbsp;intNo;
 楼主| hxdlj 发表于 2007-4-23 09:03 | 显示全部楼层

楼上的兄弟果真厉害

能否留个MSN或者QQ。
 楼主| hxdlj 发表于 2007-4-23 09:20 | 显示全部楼层

我把uart.c又重新改了一下

#include&nbsp;&quot;includes.h&quot;<br />#include&nbsp;&quot;Uart.h&quot;<br /><br />/*********************************************<br />*Function&nbsp;:uart0非嵌套IRQ中断服务程序<br />*Create&nbsp;By:shannon<br />**********************************************/<br />void&nbsp;IRQUart0(void)&nbsp;__irq<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;receBuf[0]=&nbsp;U0RBR;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO1SET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;(receBuf[0]&nbsp;+&nbsp;16));<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0;//向量中断结束<br />}<br /><br />/*********************************************<br />*Function&nbsp;:uart0初始化程序<br />*Create&nbsp;By:shannon<br />**********************************************/<br />uint8&nbsp;Uart0Init(UARTMODE&nbsp;*set)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;bak;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;addrOffset;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pinmap.pin.p00&nbsp;=&nbsp;GP000TXD0;<br />&nbsp;&nbsp;&nbsp;&nbsp;pinmap.pin.p01&nbsp;=&nbsp;GP001RXD0;<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;pinmap.PinSel[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;VICIntSelect&nbsp;&&nbsp;~(1&nbsp;&lt&lt&nbsp;(UART0_PRI&nbsp;-&nbsp;1));//设置相应的中断为IRQ中断<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />#if&nbsp;(UART0_PRI&nbsp;&gt&nbsp;0&nbsp;&&&nbsp;UART0_PRI&nbsp;&lt&nbsp;17)//1到16,0未用&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;addrOffset&nbsp;=&nbsp;(UART0_PRI&nbsp;-&nbsp;1)*&nbsp;4;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(volatile&nbsp;uint32&nbsp;*)(VICVectAddrBase&nbsp;+&nbsp;addrOffset)&nbsp;=&nbsp;(uint32)IRQUart0;//设置中断服务程序地址&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(volatile&nbsp;uint32&nbsp;*)(VICVectCntlBase&nbsp;+&nbsp;addrOffset)&nbsp;=&nbsp;0x20&nbsp;|&nbsp;UART0_INT;//分配中断<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;UART0_INT;&nbsp;&nbsp;//使能中断<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((set-&gtdatabit&nbsp;&gt&nbsp;8)&nbsp;||&nbsp;(set-&gtdatabit&nbsp;&lt&nbsp;5))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(ERR);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((set-&gtstopbit&nbsp;==&nbsp;0)&nbsp;||&nbsp;(set-&gtstopbit&nbsp;&gt&nbsp;2))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(ERR);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(set-&gtparity&nbsp;&gt&nbsp;2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(ERR);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;0x80;//DLAB&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;bak&nbsp;=&nbsp;(Fpclk&nbsp;&gt&gt&nbsp;4)/(set-&gtbaudrate);<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLM&nbsp;=&nbsp;bak&nbsp;&gt&gt&nbsp;8;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLL&nbsp;=&nbsp;bak&nbsp;&&nbsp;0xff;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;bak&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;bak&nbsp;=&nbsp;set-&gtdatabit&nbsp;-&nbsp;5;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(set-&gtstopbit&nbsp;==&nbsp;2)&nbsp;bak&nbsp;|=&nbsp;0x04;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(set-&gtparity&nbsp;!=&nbsp;NONE)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bak&nbsp;|=&nbsp;0x08;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set-&gtparity--;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;bak&nbsp;|=&nbsp;set-&gtparity&nbsp;&lt&lt&nbsp;4;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;bak;//设置串口数据格式<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(set-&gtrxinten)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U0IER&nbsp;=&nbsp;0x01;//接收中断使能<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(1);<br />}<br /><br />//查询发送单个字节<br />void&nbsp;Uart0Send(uint8&nbsp;dat)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;U0THR&nbsp;=&nbsp;dat;<br />&nbsp;&nbsp;&nbsp;&nbsp;while((U0LSR&nbsp;&&nbsp;0x40)&nbsp;==&nbsp;0);//移位寄存器和发送保持均为空<br />}<br />//查询发送多个字节<br />void&nbsp;Uart0SendBytes(uint8&nbsp;*ptr,uint8&nbsp;num)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;num;&nbsp;num&nbsp;&gt&nbsp;0;&nbsp;i--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U0THR&nbsp;=&nbsp;*ptr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((U0LSR&nbsp;&&nbsp;0x40)&nbsp;==&nbsp;0);//移位寄存器和发送保持均为空<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />//查询发送字符串<br />void&nbsp;Uart0SendStr(uint8&nbsp;*ptr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(*ptr){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U0THR&nbsp;=&nbsp;*ptr;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((U0LSR&nbsp;&&nbsp;0x40)&nbsp;==&nbsp;0);//移位寄存器和发送保持均为空<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}
pengdeyou 发表于 2007-4-23 10:27 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

40

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部