天嵌 ARM开发社区

 找回密码
 注册
查看: 5239|回复: 5

串口中断的疑惑

[复制链接]
esniaw 发表于 2012-4-29 16:10:08 | 显示全部楼层 |阅读模式



我想用串口来接收PC机的数据,接收到数据后点亮LED1,然后把接收到的数据通过UART0发送回去。
开发板的串口接收和发送用的都是中断方式。
用ADS编译出来BIN文件,下载到开发板后,重新上电,在PC的SecureCRT上按下a,开发板上的LED1被点亮了,PC机也显示了a。
问题是:如果PC上按键速度太快(连续按键)的话,只有第一次的按键可以点亮LED1(PC机也收到了开发板的反馈),以后在PC机上再按任何按键都没有反应了--LED1不亮,PC机也收不到反馈。
谁知道原因的话,麻烦告知,谢谢了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
cepoly 发表于 2012-4-29 18:23:57 | 显示全部楼层
本帖最后由 cepoly 于 2012-4-29 18:35 编辑

void __irq Uart0_Isr(void)
{
        unsigned char buf ;

        if(rSUBSRCPND & (1 << 1))//发送中断
        {
                rSUBSRCPND |= 1 << 1 ;
        }

        if(rSUBSRCPND & (1 << 0))//接收中断
        {
                buf = rURXH0 ;
                rSUBSRCPND |= 1 << 0 ;//清除接收中断
                rUTXH0 = buf ;
                Led1_On() ; Delay1s();  Led1_Off() ;
        }
        
        rSRCPND |= 1 << 28 ;
        rINTPND |= 1 << 28 ;
}
这里出现问题。。。

你的程序里面没有用到串口控制led灯 ,你的程序是这样的,如果串口接收到数据,无论是什么数据,它就进入
Led1_On() ; Delay1s();  Led1_Off() ; 打开灯,这样灯一直都是 Led1_On() ; Delay1s();  Led1_Off() ;

                buf = rURXH0 ;
                rSUBSRCPND |= 1 << 0 ;//清除接收中断
                rUTXH0 = buf ;
                Led1_On() ; Delay1s();  Led1_Off() ;
这里写的不好。。。因为你 buf = rURXH0 ; 接收到数据 ,你就清除接收中断  ,等待下次接收, rUTXH0 = buf ; 还来不及接收,buf里的数据又更新了。。。所以按得快就出现以上情况。。。总之这个程序不是很好 字符串是通不过的。。。。
 楼主| esniaw 发表于 2012-4-29 22:56:25 | 显示全部楼层
        if(rSUBSRCPND & (1 << 0))//接收中断
     {
                 buf = rURXH0 ;
                 rUTXH0 = buf ;
                 Led1_On() ; Delay1s();  Led1_Off() ;
                 rSUBSRCPND |= 1 << 0 ;//清除接收中断
         }
这样改了之后,还是有同样的问题。
 楼主| esniaw 发表于 2012-5-5 18:38:12 | 显示全部楼层
找到问题了:s3c2440收到串口数据后,点亮LED1,在执行Delay1s();过程中,收到了下一个字符,但是buf = rURXH0 ;已经执行过了,所以新的数据会留在rURXH0寄存器中,并置位rSUBSRCPND寄存器中的接收中断标志位,但是随后执行的rSUBSRCPND = 1 << 0 ;会把这个标志位清除掉,然后清除rSRCPND和rINTPND退出ISR;这样的话,第二次的串口中断就被(错误的)清除掉了,rURXH0中的数据没有被读取,导致后面的串口接收线RXDn线上的数据不能进入,从而不会再进入串口ISR的接收中断处理了。

谢谢cepoly的回复:)
jing007520 发表于 2012-6-13 10:53:46 | 显示全部楼层
esniaw 发表于 2012-5-5 18:38
找到问题了:s3c2440收到串口数据后,点亮LED1,在执行Delay1s();过程中,收到了下一个字符,但是buf = rUR ...

你好,我看你的程序应该是用的王小强出版的arm处理器裸机开发实战那本书上的吧?这本书貌似很多程序都有问题,不知道是不是我调试的问题还是怎么的?
 楼主| esniaw 发表于 2012-7-8 10:23:18 | 显示全部楼层
jing007520 发表于 2012-6-13 10:53
你好,我看你的程序应该是用的王小强出版的arm处理器裸机开发实战那本书上的吧?这本书貌似很多程序都有问 ...

是王小强的那本书,我用的是光盘里exercise目录下的文件。
直接用好像是有些问题,要改nand.h这个文件:
#define CMD_READ                        0x00        //  Read
#define CMD_READ1                        0x01        //  Read1
#define CMD_READ2                        0x50        //  Read2
#define CMD_READ3                        0x30        //  Read3---这里是针对K9F2G08UOB而言的,页内没有分为两部分,所以用这个指令即可;
改成
#define CMD_READ                        0x00        //  Read
#define CMD_READ1                        0x00        //  Read1
#define CMD_READ2                        0x30        //  Read2
#define CMD_READ3                        0x30        //  Read3---这里是针对K9F2G08UOB而言的,页内没有分为两部分,所以用这个指令即可;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-8 01:01 , Processed in 1.031250 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表