找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5982|回复: 12
收起左侧

求问单片机串口中断一个问题,关于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:213173 发表于 2019-6-10 06:37 | 显示全部楼层
每个串行口的数据缓冲器由2个互相独立的接收、发送缓冲器构成,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码,SBUF实际是两个物理寄存器。
void UART_SER() interrupt 4
{
        uchar temp;
//        if(RI)/*既然串口中断已经响应,RI必定是1,此判断多余
//        {
                RI = 0;//软件清0
                temp = SBUF;//读取
                SBUF = temp;//发送

                while(!TI);//等待发送完成,硬件置位中断请求标志为1,并不是发生了中断响应
                TI = 0;//软件清0
//        }
}
回复

使用道具 举报

ID:123289 发表于 2019-6-10 08:14 | 显示全部楼层
RI、TI只是标记,它并不完全控制中断的发生,中断受以下条件限制:
1、EA=0,不中断
2、ES=0,不中断
3、已经响应了中断,在未遇到RETI指令之前,不中断。(即中断返回。你的问题,属于这一种)
4、更高级的中断在响应执行中,不中断。
5、RI、TI被人工清0后,即中断源被取消,自然也不会中断。
……
回复

使用道具 举报

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

使用道具 举报

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

RI、TI只是标记,它并不完全控制中断的发生,中断受以下条件限制:
1、EA=0,不中断
2、ES=0,不中断
3、已经响应了中断,在未遇到RETI指令之前,不中断。(即中断返回。你的问题,属于这一种)
4、更高级的中断在响应执行中,不中断。
5、RI、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:207421 发表于 2019-6-10 11:44 来自手机 | 显示全部楼层
什么叫完整无损哦,你1ms每次连续发送一个20个长度字符串试试,再看看接收发送数据计数有没有误差。 数据发送与TI有关系,发送的时候与中断没关系。  仿真一下,你就知道了。
回复

使用道具 举报

ID:558624 发表于 2019-6-10 15:05 | 显示全部楼层
董董 发表于 2019-6-10 10:43
您前面说的是SBUF公用同一个字节地址,但是两个SBUF物理地址是不同的,这一点我明白的。我想说的是在EA=1 ...

你这么说,RI和TI算一个级别,确实有道理,感觉解释清楚了
回复

使用道具 举报

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

RI中断后,被响应。这时TI又来了:
你已经响应了中断,所以不存在TI再中断,但记住这时TI=1。
当你完成了RI的处理后,退出中断服务程序后,这时由于TI=1,所以中断会再次发生,重新进入中断响应!
如果你在RI的处理后,在退出中断服务程序之前,清除了TI=0,则TI不会产生中断。

RI与TI是串行中断的两个发生源,它俩一样,共用同一个中断入口。如果两个同时发生,只要你不清除标记(留下任意一个,或两个都留),则中断返回后,会又进入中断!所以中断响应后,你要记住清除标记。
做一个就清一个,这样不会出问题。不要做一个RI处理,却将TI清了,就会遗漏处理TI。
回复

使用道具 举报

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 单片机教程网

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