[ZLG-ARM] 誰能告诉我这段UART程序出什么问题了?

[复制链接]
2998|9
 楼主| on_raptor 发表于 2007-6-10 11:51 | 显示全部楼层 |阅读模式
程序是在keil编译的,现在问题是:<br />串口发送第一个字符给2141,返回正常<br />第二次发送有的时候突然返回应该返回的后,不断地返回0x1<br />有的时候死机.再发也没有反应<br /><br />Vic初始化部份:<br />void&nbsp;VIC_INIT2(void)<br />{<br />VICVectCntl1=0x26;<br />VICVectAddr1&nbsp;=&nbsp;(INT32U)UART_Handler;<br />VICIntEnable&nbsp;=VICIntEnable&nbsp;|&nbsp;0x40;<br />}<br />UART初始化部份<br />void&nbsp;Init_UART0(INT32U&nbsp;bps)<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT16U&nbsp;Fdiv;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;(PINSEL0&nbsp;&&nbsp;0xfffffff0)&nbsp;|&nbsp;0x05;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Fdiv&nbsp;=&nbsp;(Fpclk&nbsp;/&nbsp;16)&nbsp;/&nbsp;bps;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLM&nbsp;=&nbsp;Fdiv&nbsp;/&nbsp;256;&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;U0DLL&nbsp;=&nbsp;Fdiv&nbsp;%&nbsp;256;&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;U0LCR&nbsp;=&nbsp;0x03;&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;&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;U0IER&nbsp;=&nbsp;0x1;&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;U0FCR&nbsp;=&nbsp;0x0;&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 />}<br /><br />UART中断部份<br />void&nbsp;UART_Handler(void)<br />{<br />INT8U&nbsp;dat;<br />VICVectAddr=0x0;<br />if&nbsp;(4==(U0IIR&nbsp;&&nbsp;0xf))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;dat=U0RBR;<br />&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendByte(dat);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendByte(0xcd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendByte(U0LSR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendByte(U0IER);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendByte(U0IIR);<br />}<br />字节回送部份<br />void&nbsp;UART0_SendByte(INT8U&nbsp;data)<br />{<br />U0THR=data;<br />while((U0LSR&nbsp;&&nbsp;0x20)==0);<br />}<br />
汽车电子 发表于 2007-6-10 11:58 | 显示全部楼层

天啊,你在中断里有这么多查询发送?

&nbsp;&nbsp;到我的网站看看,完整的样例
 楼主| on_raptor 发表于 2007-6-10 12:00 | 显示全部楼层

这只是调试的时候发送的。

问题是第一次正常后面不正常才奇怪啊!
HotPower 发表于 2007-6-10 13:40 | 显示全部楼层

让发送也中断起来~~~

  
 楼主| on_raptor 发表于 2007-6-10 16:46 | 显示全部楼层

不行

现在看起来问题更复杂了。软件仿真显示第二次中断出口的时候R14已经指向UART0_SendByte上面了。但是新修改的程序不可能在没有新数据的情况下调用UART0_SendByte.
hotpower 发表于 2007-6-10 23:20 | 显示全部楼层

哈哈~~~本来这个程序就"违反体育道德"~~~

  
armecos 发表于 2007-6-11 06:53 | 显示全部楼层

中断问题

&nbsp;&nbsp;&nbsp;&nbsp;你应答中断前没有清除中断,导致反复陷入中断,不是死机,而是一直在那里反复中断,出不来了。<br />&nbsp;&nbsp;&nbsp;&nbsp;你的调试方法不对,中断调试需要工具,不能自己调试自己,这个问题拿工具一调,马上发现问题。当你用串口打印调试串口时,如果发生反复陷入错误,那你将什么调试信息也看不到。<br />&nbsp;&nbsp;&nbsp;&nbsp;你的中断应答放在那个位置的确效率很高,不过你没做必要处理,还是错误的。<br />&nbsp;&nbsp;&nbsp;&nbsp;为什么不一次读取多个字节呢?<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;基于中断的UART串口程序效率很高,但你写的框架实在......,好的框架应该自动枚举串口,能自动识别普通串口和MODEM串口,能自动识别各种版本的16C55x工业标准,能编译时配置是否需要RAM缓冲区及其大小(带缓冲区的自动基于中断驱动),一次缓冲多个字节(带超时功能),收发都基于中断,中断配置不应手动填写,而应抽象出若干API自动完成。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;www.armecos.com上有《ecos增值包》出售,里面有串口和中断的范例,能够解决你的问题,只不过不是针对21XX的,仍然向你推荐增值包的原因主要是你这样写明显是没有正确思路、对中断也没有概念,还缺乏调试手段。
 楼主| on_raptor 发表于 2007-6-11 21:58 | 显示全部楼层

受教了.谢谢

其实还是条件所限啊!(哭~~~~~~)<br />关于一次读取多个字节的问题,实际上是因为每次发送字符长度不是一致的.用FIFO的话,天知道它什么时候才中断?<br />关于API的问题,其实我手上有很完整功能的版本。但是学习本来就应该自己看手册写嘛!<br />最想问的问题:<br />您说“应答中断前没有清除中断,”但是我已经清除VICVectAddr了?<br />“不过你没做必要处理,还是错误的。”所指的应该是没有区分中断原因吧?如果我只要处理一种中断原因,也要用低效的&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(IIR&nbsp;&&nbsp;0x0f)<br />吗?<br />谢谢
armecos 发表于 2007-6-12 05:02 | 显示全部楼层

把VICVectAddr=0x0;挪到最后试试,最好有调试手段。

&nbsp;&nbsp;&nbsp;&nbsp;因为你一进入处理程序就应答,还没撤除中断源,又一次引发同样的中断。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;FIFO有超时功能,不必担心每次发送字符数量不一致,如果FIFO里有字符但没达到门限,一段时间后(超时)也会引发中断的。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;更详细全面的说明还有范例、调试环境等只在ecos增值包里有,当然不只是这么一个简单的UART了。
HotPower 发表于 2007-6-12 21:59 | 显示全部楼层

软串口调试软件

  <br /> 相关链接:<a href='http://www.**/blog/hotpower/14048/message.aspx'>http://www.**/blog/hotpower/14048/message.aspx</a>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

11

帖子

0

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