[ZLG-ARM] 帮忙看看:UART利用RDA中断接收16字节数据的程序

[复制链接]
3047|0
 楼主| hedynasty 发表于 2008-12-31 10:21 | 显示全部楼层 |阅读模式
UART0设置触发深度8,&nbsp;但是要接收16个字节,&nbsp;用两次&nbsp;的8个字节中断接收,<br /><br />想要完成:用串口助手发送16字节数据给串口,串口接收到数据然后将数据再发送回串口助手显示<br /><br />运行结果:如发送8字节数据则可以正常返回发送的数据,如发送16字节数据则返回的数据与串口助手发送的数据不一样。&nbsp;<br /><br />代码如下(根据周工书上的程序改的):<br /><br />#include&nbsp;&nbsp;&quot;config.h&quot;&nbsp;<br /><br /><br />/*&nbsp;定义串口模式设置数据结构&nbsp;*/<br />typedef&nbsp;&nbsp;struct&nbsp;&nbsp;UartMode<br />{&nbsp;&nbsp;uint8&nbsp;datab;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;字长度,5/6/7/8<br />&nbsp;&nbsp;&nbsp;uint8&nbsp;stopb;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;停止位,1/2<br />&nbsp;&nbsp;&nbsp;uint8&nbsp;parity;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;奇偶校验位,0为无校验,1奇数校验,2为偶数校验<br />}&nbsp;&nbsp;UARTMODE;<br /><br /><br />uint8&nbsp;&nbsp;rcv_buf[16];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;UART0数据接收缓冲区<br />volatile&nbsp;uint8&nbsp;&nbsp;rcv_new;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;接收新数据标志<br /><br /><br />uint8&nbsp;tail=0;<br />/****************************************************************************<br />*&nbsp;名称:IRQ_UART0()<br />*&nbsp;功能:串口UART0接收中断。<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:无<br />****************************************************************************/<br />void&nbsp;&nbsp;&nbsp;__irq&nbsp;IRQ_UART0(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;if(&nbsp;0x04==(U0IIR&0x0F)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcv_new&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置接收到新的数据标志<br />&nbsp;&nbsp;&nbsp;//else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while((U0LSR&0x01)!=0)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcv_buf[tail]&nbsp;=&nbsp;U0RBR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取FIFO的数据,并清除中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail%=16;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;中断处理结束&nbsp;&nbsp;&nbsp;<br />}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />/****************************************************************************<br />*&nbsp;名称:SendByte()<br />*&nbsp;功能:向串口UART0发送字节数据。<br />*&nbsp;入口参数:data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要发送的数据<br />*&nbsp;出口参数:无<br />****************************************************************************/<br />void&nbsp;&nbsp;SendByte(uint8&nbsp;data)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U0THR&nbsp;=&nbsp;data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送数据<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br /><br />/****************************************************************************<br />*&nbsp;名称:ISendBuf()<br />*&nbsp;功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:无<br />****************************************************************************/<br />void&nbsp;&nbsp;ISendBuf(void)<br />{&nbsp;&nbsp;uint8&nbsp;&nbsp;i;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt16;&nbsp;i++)&nbsp;SendByte(rcv_buf);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;head=tail;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(&nbsp;(U0LSR&0x40)==0&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;等待数据发送<br />}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />/****************************************************************************<br />*&nbsp;名称:UART0_Ini()<br />*&nbsp;功能:初始化串口0。设置其工作模式及波特率。<br />*&nbsp;入口参数:baud&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;波特率<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;模式设置(UARTMODE数据结构)<br />*&nbsp;出口参数:返回值为1时表示初化成功,为0表除参数出错<br />****************************************************************************/<br />uint8&nbsp;&nbsp;UART0_Ini(uint32&nbsp;baud,&nbsp;UARTMODE&nbsp;set)<br />{&nbsp;&nbsp;uint32&nbsp;&nbsp;bak;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;参数过滤&nbsp;*/<br />&nbsp;&nbsp;&nbsp;if(&nbsp;(0==baud)||(baud&gt115200)&nbsp;)&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;if(&nbsp;(set.datab&lt5)||(set.datab&gt8)&nbsp;)&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;if(&nbsp;(0==set.stopb)||(set.stopb&gt2)&nbsp;)&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;if(&nbsp;set.parity&gt4&nbsp;)&nbsp;return(0);<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;设置串口波特率&nbsp;*/<br />&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;0x80;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;DLAB位置1<br />&nbsp;&nbsp;&nbsp;bak&nbsp;=&nbsp;(Fpclk&gt&gt4)/baud;<br />&nbsp;&nbsp;&nbsp;U0DLM&nbsp;=&nbsp;bak&gt&gt8;<br />&nbsp;&nbsp;&nbsp;U0DLL&nbsp;=&nbsp;bak&0xff;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;/*&nbsp;设置串口模式&nbsp;*/<br />&nbsp;&nbsp;&nbsp;bak&nbsp;=&nbsp;set.datab-5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置字长度<br />&nbsp;&nbsp;&nbsp;if(2==set.stopb)&nbsp;bak&nbsp;|=&nbsp;0x04;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;判断是否为2位停止位&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;if(0!=set.parity)&nbsp;{set.parity&nbsp;=&nbsp;set.parity-1;&nbsp;bak&nbsp;|=&nbsp;0x08;}<br />&nbsp;&nbsp;&nbsp;bak&nbsp;|=&nbsp;set.parity&lt&lt4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置奇偶校验<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;bak;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;return(1);<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />/****************************************************************************<br />*&nbsp;名称:main()<br />*&nbsp;功能:初始化串口,并等待接收到串口数据。<br />*&nbsp;说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。<br />****************************************************************************/<br />int&nbsp;&nbsp;main(void)<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//uint8&nbsp;i;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;UARTMODE&nbsp;&nbsp;uart0_set;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;0x00000005;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置I/O连接到UART0<br />&nbsp;&nbsp;&nbsp;rcv_new&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;uart0_set.datab&nbsp;=&nbsp;8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;8位数据位<br />&nbsp;&nbsp;&nbsp;uart0_set.stopb&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;1位停止位<br />&nbsp;&nbsp;&nbsp;uart0_set.parity&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;奇校验<br />&nbsp;&nbsp;&nbsp;UART0_Ini(4800,&nbsp;uart0_set);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;初始化串口模式<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;U0FCR&nbsp;=&nbsp;0x81;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能FIFO,并设置触发点为8字节<br />&nbsp;&nbsp;&nbsp;U0IER&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;允许RBR中断,即接收中断<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;/*&nbsp;设置中断允许&nbsp;*/<br />&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置所有通道为IRQ中断<br />&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;0x26;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;UART0中断通道分配到IRQ&nbsp;slot&nbsp;0,即优先级最高<br />&nbsp;&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(int)IRQ_UART0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置UART0向量地址<br />&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;0x00000040;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能UART0中断<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;等待中断<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(1==rcv_new)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U0IER=0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcv_new&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISendBuf();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U0IER=0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return(0);<br />}<br /><br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

458

帖子

0

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