[ZLG-ARM] 串口0中断接受

[复制链接]
 楼主| skaler 发表于 2007-11-7 13:54 | 显示全部楼层 |阅读模式
#include&nbsp;&quot;config.h&quot;<br />#define&nbsp;ledcon&nbsp;0xf0000000<br />#define&nbsp;uart_bps&nbsp;&nbsp;115200<br /><br /><br />&nbsp;uint8&nbsp;rcv_data[8];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//UART0接受数据缓冲区<br />&nbsp;volatile&nbsp;uint8&nbsp;rcv_new;&nbsp;&nbsp;&nbsp;&nbsp;//接受新数据标志<br />/******************************<br />delay()<br />*******************************/<br />void&nbsp;delayns(uint32&nbsp;dly)<br />{<br />&nbsp;//&nbsp;uint32&nbsp;i;<br />&nbsp;&nbsp;for(;dly&gt0;dly--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;}<br />&nbsp;<br />/*<br />&nbsp;uart0_int()<br />*/<br />void&nbsp;uart0_init(void)<br />{<br />&nbsp;&nbsp;uint16&nbsp;fdiv;<br />&nbsp;&nbsp;U0LCR=0x83;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//8bit&nbsp;enable&nbsp;除数<br />&nbsp;&nbsp;fdiv=(Fpclk/16)/uart_bps;<br />&nbsp;&nbsp;U0DLM=fdiv/256;<br />&nbsp;&nbsp;U0DLL=fdiv%256;<br />&nbsp;&nbsp;U0LCR=0x03;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//8bit&nbsp;disable&nbsp;除数<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br /><br />&nbsp;<br />#if&nbsp;1<br />void&nbsp;&nbsp;&nbsp;__irq&nbsp;IRQ_UART0(void)&nbsp;&nbsp;&nbsp;&nbsp;//uart0接受中断<br />{<br />&nbsp;uint8&nbsp;i;<br />&nbsp;if((U0IIR&0x0f)==0x04)&nbsp;&nbsp;//判断UART0接受数据可用标志<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;rcv_new=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcv_data=U0RBR;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;VICVectAddr=0;<br />&nbsp;}<br />#endif<br /><br />#if&nbsp;0<br />void&nbsp;uart0_rcvbyte(void)<br />{<br />&nbsp;uint8&nbsp;i;<br />&nbsp;while((U0LSR&0x01)==0);<br />&nbsp;&nbsp;rcv_new=1;<br />&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcv_data=U0RBR;<br />&nbsp;}<br />#endif<br /><br />int&nbsp;main&nbsp;(void)<br />{//&nbsp;add&nbsp;user&nbsp;source&nbsp;code&nbsp;<br />&nbsp;&nbsp;&nbsp;uint8&nbsp;i;<br />&nbsp;&nbsp;&nbsp;char&nbsp;disp_buf[30];<br />&nbsp;&nbsp;&nbsp;volatile&nbsp;uint32&nbsp;aAA;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;PINSEL0=0x00000005;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置IO连接到UART0&nbsp;&nbsp;&nbsp;,p014为io<br />&nbsp;PINSEL2=PINSEL2&0xfffffff7;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P1管脚选择设置&nbsp;&nbsp;&nbsp;&nbsp;,p16:25为IO<br />&nbsp;//选中电子开关<br />&nbsp;IO0DIR=0x4000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//p014&nbsp;output<br />&nbsp;IO1DIR=0x00e00000;&nbsp;&nbsp;//p121:23&nbsp;output<br />&nbsp;IO0CLR=0x4000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//p014&nbsp;output&nbsp;L<br />&nbsp;IO1CLR=0x00e00000;&nbsp;&nbsp;//p121:23&nbsp;output&nbsp;L选中电子开关X3Y3,及J4<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;uart0_init();<br />#if&nbsp;1<br />&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;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 /><br />&nbsp;VICIntSelect=0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//VIC_uart0中断初始化<br />&nbsp;VICVectCntl0=0x20|6;<br />&nbsp;VICVectAddr0&nbsp;=&nbsp;(int)IRQ_UART0;<br />&nbsp;VICIntEnable=1&lt&lt6;&nbsp;<br />#endif&nbsp;&nbsp;&nbsp;<br />//uart0_rcvbyte();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;IO2DIR=ledcon;<br />&nbsp;&nbsp;&nbsp;T0PR=0;<br />&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(rcv_new==1)&nbsp;&nbsp;&nbsp;//接受中断等待<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buf=rcv_data;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />问题:<br />&nbsp;&nbsp;&nbsp;我用的模板是周立功的ARM&nbsp;EXecutable&nbsp;image&nbsp;for&nbsp;lpac2200,并把修改设置系统模式堆栈处的代码为“MSRCPSR_c,&nbsp;#0x5f”也改了,即使能IRQ&nbsp;中断。<br />&nbsp;&nbsp;&nbsp;1)这个程序在接受数据时进不了中断,不知道问题出在哪里?<br />&nbsp;&nbsp;&nbsp;(在LPC2214的RXT0脚上用示波器能检测到我发送的数据(数据&gt=8位),但是就是芯片里中断不处理。)<br />&nbsp;&nbsp;&nbsp;2)我用查询方式时不管发送什么数据,都能收到两次,但是这个数据与我发的数据不一样。<br />&nbsp;&nbsp;&nbsp;(比如说发送12345678,第一次接受为1F#D22#3,第二次接受34567888,“#”表示乱码)
WangArm 发表于 2007-11-7 23:35 | 显示全部楼层

你这程序写的大有问题

1&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;uart0_rcvbyte(void)<br />{<br />uint8&nbsp;i;<br />while((U0LSR&0x01)==0);<br />&nbsp;&nbsp;rcv_new=1;<br />&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcv_data=U0RBR;<br />}<br />触发点与中断有关,在查询接收下U0LSR&0x01只能表示有数据,但不能表示有多少个数据,所以在查询接收下有误.<br />2<br />&nbsp;进不了中断,你可以在调试的方式下看一年CPSR的I位置位没有,U0IIR置位没有,VICIntEnable正确配置没有,如果都正确,就没有问题.<br />3<br />可以先将程序简化,分开调试,这样程序看起来不方便,也容易出错.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

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