找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6889|回复: 13
收起左侧

求问单片机串口中断一个问题,关于TI RI设置

[复制链接]
ID:523537 发表于 2019-6-9 15:02 | 显示全部楼层 |阅读模式
/*******************************串口中断函数问题*********************************/
单片机串口中断函数的触发是因为TI=1;或者RI = 1;所以我想问下我写的下面的程序是怎么回事?
void UART_SER() interrupt 4
{
        uchar temp;
        if(RI)
        {
                RI = 0;
                temp = SBUF;
                SBUF = temp;
                /*下面两个语句就是SendByte(uchar dat)的功能*/
                while(!TI);
                TI = 0;
        }
}

上面的程序在单片机和电脑进行串口通讯时的程序,首先这个程序烧近单片机是有用的,没有丢位,但是我对程序执行有疑问。当单片机收到一个8位的数据时,RI = 1进入中断程序,RI置0,把接收缓存寄存器SBUF存储的数据存到temp里面,然后再把temp存储到发送缓存寄存器SBUF里面,最后等数据发送完TI=1,我的问题就是TI=1那么不就又出发了中断然后又进入了中断函数里面,但是TI没法置0,那么就是死循环了,但是为什么实际操作却可以完整无损的收发数据呢?
回复

使用道具 举报

ID:523537 发表于 2019-6-10 10:43 | 显示全部楼层
wulin 发表于 2019-6-10 06:37
每个串行口的数据缓冲器由2个互相独立的接收、发送缓冲器构成,可以同时发送和接收数据。发送缓冲器只能写 ...

您前面说的是SBUF公用同一个字节地址,但是两个SBUF物理地址是不同的,这一点我明白的。我想说的是在EA=1;ES=1;的条件下,无论是RI=1还是TI=1都会触发串口中断,所以您前面写的“既然串口中断已经响应,RI必然是1,此判断多余”也有可能是TI=1触发了串口中断。在我的指导书籍里写了“若CPU允许中断,都要进入中断服务程序,但是CPU实现并不能区分是TI还是RI请求中断,只有进入中断服务程序后,通过查询来区分,然后进入相应的中断处理”。
   但是在我写的这个中断程序中,RI=1然后进入中断函数,然后把接收串行数据缓冲器中的数据SBUF转移到发送串行数据缓存器SBUF中,然后等待TI=1,但是TI=1后不会又触发这个串口中断函数,我思考了下觉得应该是这样,RI=1和TI=1触发的中断函数属于同级别的,没有优先级上的区别,所以要按照先来后到的原则,那么TI=1后向CPU申请的中断不会被正在执行RI=1触发的中断函数CPU响应,所以我这个帖子提出的问题:中断函数的循环触发就不存在了,这样一来确实只有RI=1这一个条件来触发中断。
回复

使用道具 举报

ID:523537 发表于 2019-6-10 10:53 | 显示全部楼层
yzwzfyz 发表于 2019-6-10 08:14
RI、TI只是标记,它并不完全控制中断的发生,中断受以下条件限制:
1、EA=0,不中断
2、ES=0,不中断

您说的1,2,4,5点我记住了,关于您第三点我的想法是RI=1和TI=1触发的中断函数属于同级别的,没有优先级上的区别,所以要按照先来后到的原则,那么TI=1后向CPU申请的中断不会被正在执行RI=1触发的中断函数CPU响应,除非CPU处理完了RI=1出发的中断函数返回断点,否则CPU不会理睬TI=1触发的中断请求。您觉得我这个解释是对的吗?
回复

使用道具 举报

ID:523537 发表于 2019-6-10 10:54 | 显示全部楼层
yzwzfyz 发表于 2019-6-10 08:17
这些手册上都有,学会查资料。
了解以上才能对中断有所认识。

嗯嗯,我自己也是刚开始学,很多地方都没开窍,对着源程序和指导书看有时也不太明白,所以就来论坛多问问了,多谢大佬的指点
回复

使用道具 举报

ID:523537 发表于 2019-6-10 10:54 | 显示全部楼层
qing132 发表于 2019-6-10 09:03
RI、TI只是标记,它并不完全控制中断的发生,中断受以下条件限制:
1、EA=0,不中断
2、ES=0,不中断

哎,小老弟别复制粘贴水经验啊
回复

使用道具 举报

ID:523537 发表于 2019-6-10 22:56 | 显示全部楼层
yzwzfyz 发表于 2019-6-10 17:53
"您说的1,2,4,5点我记住了,关于您第三点我的想法是RI=1和TI=1触发的中断函数属于同级别的,没有优先级 ...

嗯嗯,您说的很透彻,正是因为TI和RI同级别,处理RI=1触发的中断程序中把TI也置0了,所以CPU处理完RI=1触发的中断程序返回断点后也不会再触发中断,谢谢大佬的详细解释!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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