打印
[ZLG-ARM]

誰能告诉我这段UART程序出什么问题了?

[复制链接]
1949|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
on_raptor|  楼主 | 2007-6-10 11:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序是在keil编译的,现在问题是:
串口发送第一个字符给2141,返回正常
第二次发送有的时候突然返回应该返回的后,不断地返回0x1
有的时候死机.再发也没有反应

Vic初始化部份:
void VIC_INIT2(void)
{
VICVectCntl1=0x26;
VICVectAddr1 = (INT32U)UART_Handler;
VICIntEnable =VICIntEnable | 0x40;
}
UART初始化部份
void Init_UART0(INT32U bps)
{      
    INT16U Fdiv;
    
    PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05;   

    U0LCR = 0x80;                             
    Fdiv = (Fpclk / 16) / bps;                
    U0DLM = Fdiv / 256;                            
    U0DLL = Fdiv % 256;                        
    U0LCR = 0x03;                             
                                   
    U0IER = 0x1;                              
    U0FCR = 0x0;                              
}

UART中断部份
void UART_Handler(void)
{
INT8U dat;
VICVectAddr=0x0;
if (4==(U0IIR & 0xf))
     {
    dat=U0RBR;
    UART0_SendByte(dat);
    }
     UART0_SendByte(0xcd);
     UART0_SendByte(U0LSR);
     UART0_SendByte(U0IER);
     UART0_SendByte(U0IIR);
}
字节回送部份
void UART0_SendByte(INT8U data)
{
U0THR=data;
while((U0LSR & 0x20)==0);
}

相关帖子

沙发
汽车电子| | 2007-6-10 11:58 | 只看该作者

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

  到我的网站看看,完整的样例

使用特权

评论回复
板凳
on_raptor|  楼主 | 2007-6-10 12:00 | 只看该作者

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

问题是第一次正常后面不正常才奇怪啊!

使用特权

评论回复
地板
HotPower| | 2007-6-10 13:40 | 只看该作者

让发送也中断起来~~~

使用特权

评论回复
5
on_raptor|  楼主 | 2007-6-10 16:46 | 只看该作者

不行

现在看起来问题更复杂了。软件仿真显示第二次中断出口的时候R14已经指向UART0_SendByte上面了。但是新修改的程序不可能在没有新数据的情况下调用UART0_SendByte.

使用特权

评论回复
6
hotpower| | 2007-6-10 23:20 | 只看该作者

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

使用特权

评论回复
7
armecos| | 2007-6-11 06:53 | 只看该作者

中断问题

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

使用特权

评论回复
8
on_raptor|  楼主 | 2007-6-11 21:58 | 只看该作者

受教了.谢谢

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

使用特权

评论回复
9
armecos| | 2007-6-12 05:02 | 只看该作者

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

    因为你一进入处理程序就应答,还没撤除中断源,又一次引发同样的中断。

    FIFO有超时功能,不必担心每次发送字符数量不一致,如果FIFO里有字符但没达到门限,一段时间后(超时)也会引发中断的。

    更详细全面的说明还有范例、调试环境等只在ecos增值包里有,当然不只是这么一个简单的UART了。

使用特权

评论回复
10
HotPower| | 2007-6-12 21:59 | 只看该作者

软串口调试软件

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

11

帖子

0

粉丝