[ZLG-ARM] 串口中断求助

[复制链接]
 楼主| honghhh 发表于 2007-12-21 11:08 | 显示全部楼层 |阅读模式
我想用串口0读取电度表(1200的波特率),并且希望每收到1字节数据就中断一次。这样便于对所收到的数据进行分析和处理。但我的串口中断程序每中断一次,所读到的数据有好几个字节不等。搞了半天不知道原因在哪里,请那位帮我分析一下。谢谢!<br />我的串口0的初始化如下:<br />uint16&nbsp;&nbsp;&nbsp;&nbsp;Fdiv;<br />U0LCR&nbsp;=&nbsp;0x83;<br />Fdiv=(Fpclk/16)/UART_BPS;<br />U0DLM&nbsp;=&nbsp;Fdiv/256;<br />U0DLL&nbsp;=&nbsp;Fdiv&nbsp;%&nbsp;256;<br />U0LCR&nbsp;=&nbsp;0x1B;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />U0FCR&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;允许FIFO,并设置触发点为1字节*/<br />VICIntSelect&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置所有的通道为IRQ中断*/<br />VICVectCntl1&nbsp;=&nbsp;0x20&nbsp;|&nbsp;0x06;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;UART0分配到IRQ&nbsp;slot1*/<br />VICVectAddr1&nbsp;=&nbsp;(uint32)IRQ_UART0;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置UART0向量地址*/<br />VICIntEnable&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;0x06)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;使能UART0中断*/<br />下面是我的中断处理程序:<br />uint8&nbsp;&nbsp;&nbsp;&nbsp;Uart0;&nbsp;&nbsp;&nbsp;&nbsp;<br />rcv_new0&nbsp;=&nbsp;1;<br />if&nbsp;((U0IIR&nbsp;&&nbsp;0x0F)&nbsp;==&nbsp;0x04)&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;rcv_buf0[l_0]&nbsp;=&nbsp;U0RBR;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取FIFO的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;l_0&nbsp;=&nbsp;l_0+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart0&nbsp;=&nbsp;U0IIR;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;中断处理结束<br />
kernel99 发表于 2007-12-21 12:28 | 显示全部楼层

这种情况应该是正常的

&nbsp;&nbsp;&nbsp;&nbsp;虽然设置&nbsp;&nbsp;U0FCR&nbsp;=&nbsp;0x01;&nbsp;&nbsp;/*&nbsp;允许FIFO,并设置触发点为1字节*/<br />但电度表还是按1200的波特率发数据,同时你用的芯片的UxRSR通过RxD接收有效字符,并把这些字符传送至UxRBR,等待CPU访问.<br />&nbsp;&nbsp;&nbsp;&nbsp;虽然每接收一个字节就中断,但是UxRBR可能就有几个字节数据的存在!
zlgarm 发表于 2007-12-21 15:32 | 显示全部楼层

honghhh 您好!

&nbsp;&nbsp;&nbsp;&nbsp;你可以把出口设置为快速中断形式,加快CPU的响应时间,试试~<br />还有,楼主你用了其它的中断了吗?如果那样的话可能导致CPU响应延时.<br />&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;By&nbsp;zlgarm_syg
Renx 发表于 2007-12-21 16:08 | 显示全部楼层

具体的发送形式是怎样的?

具体的发送形式是怎样的?<br />是隔段时间发送多个数据还是其他什么情况?隔多久?
 楼主| honghhh 发表于 2007-12-22 10:15 | 显示全部楼层

串口中断求助

昨天有事情没来得及看帖。由于这是读电度表的程序,所以我发给电度表的数据是连续发送的14个字节(按照电度表的645协议)。调试程序的时候,我是在中断处理里面设定的断点。也就是说,当串口第一次产生中断时,就会停下来的。这时我发现一个奇怪的现象:用单步调试时,它居然是一直不退出中断而是把我希望得到的18个字节全部读完后才退出来。我想是不是说在这个过程中单片机已经多次收到数据中断信号,并且单片机也已经把中断次数记录起来。然后在中断处理程序里面,也相应的进行多次处理呢?
caijd8205 发表于 2007-12-26 11:00 | 显示全部楼层

单步时,FIFO不停止接收的

&nbsp;&nbsp;在单步调试程序时,虽然程序停在了断点的地方,但是UART控制器并没有停,所以你程序停下来时,UART控制器会继续接收总线上的数据并存放到FIFO中。在你退出中断服务程序后,因又接收到数据触发过中断,所以会再次进入中断服务程序。
Renx 发表于 2007-12-26 11:43 | 显示全部楼层

呵呵

这就难怪了!<br />串口是有多个中断的(LPC2000系列ARM),拿接收部分来说,就有线状态中断、接收数据可用、接收超时等。<br />这里应该是超时中断在起作用了。CTI(超时)中断是当接收FIFO包含至少1个字符并且在接收3.5~4.5字符的时间内没有对接收FIFO进行任何操作时产生,你这里使用断点,进行单步调试,那么就有可能是超时中断“作怪”了。<br />还有一种情况就是说产生线状态中断,在接收FIFO中的数据都是“错”的,它也会“不停”的产生中断,当然这种情况很小,你之前也说了,得到了你想要的数据,可能性很小,但也不是没有可能,具体还与你的发送和接收设置有关。<br /><br />各芯片厂家出的东西在很多地方也会不一样,所以还要看具体的情况,还有我想问下,你具体用的平台是什么?UART是控制器自带的还是单独的UART芯片,型号是什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

26

帖子

0

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

15

主题

26

帖子

0

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