单片机串行通信中的中断
当发完一帧数据时,TI置位,CPU要去执行中断,请问这时CPU到这个中断中干嘛,好像没什么事,而且程序中也没写中断函数,另外TI要软件清零,如果还没等cpu处理玩这个中断...
当发完一帧数据时,TI置位,CPU要去执行中断,请问这时CPU到这个中断中干嘛,好像没什么事,而且程序中也没写中断函数,
另外TI要软件清零,如果还没等cpu处理玩这个中断,就软件清零了,怎么办啊 展开
另外TI要软件清零,如果还没等cpu处理玩这个中断,就软件清零了,怎么办啊 展开
3个回答
展开全部
1,我们一般发送的数据都用查询法,因为发送是主动的,当然也可以用中断法,当然要明白数据传输原理,发送数据原理,当数据送入SBUF后,就开始数据发送,当发送完后,硬件将TI置1,一般我们通过查询TI是否是1来判断数据发送是否完毕,你说的程序中也没写中断函数,是人家没有用中断方式,用的是查询方式,这样会合理些,在中断函数中令TI=0,也没有什么意思,当然可以在函数中处理下别的.
2 用查询法,就是等TI=1,后你才能去清零,如果TI不是1,永远不能执行到软件清零这句,如果用中断函数也是要等TI为1,用查询法查询TI是否1法很合理,如果用延时等TI是1,在中断函数来将TI=0;也可以,但延时要合理,必须大于整个发送时间,一般一个字节需要10bit的时间.
3 一般接收会用中断函数,因为接收是被动,用中断法会很稳,用查询法也可以,但高密度接收时,会出错,因为cpu还在执行别的程序,如果很长,即使你的RI已经是1了,但没有执行到,就只能等,就会丢失很多发来的数据.
2 用查询法,就是等TI=1,后你才能去清零,如果TI不是1,永远不能执行到软件清零这句,如果用中断函数也是要等TI为1,用查询法查询TI是否1法很合理,如果用延时等TI是1,在中断函数来将TI=0;也可以,但延时要合理,必须大于整个发送时间,一般一个字节需要10bit的时间.
3 一般接收会用中断函数,因为接收是被动,用中断法会很稳,用查询法也可以,但高密度接收时,会出错,因为cpu还在执行别的程序,如果很长,即使你的RI已经是1了,但没有执行到,就只能等,就会丢失很多发来的数据.
更多追问追答
追问
比如接受到了一帧数据,RI=1了,中断了,cpu是不是就去处理这个中断了呢?但是具体干了什么呢?把SBUF里的东西弄走,为下一帧接受做准备?
当RI=1时,一般我们编程的下一步就是RI=0,这样是不是就可以接下一帧数据了,那么下一帧数据会不会把前一帧数据覆盖呢?后一帧到来时cpu把前一帧数据怎么处理了?
有点乱啊,新手,麻烦了,
追答
1,外来的数据送入SBUF完毕后,硬件将RI置1,触发中断,我们可以用中断函数来处理,将SBUF数据取走,也可以查询中断标识位RI是否是1,取走数据,将RI=0,等待下一帧数据来临.
2当RI=0后才能有一帧数据来临,若本次中断函数里的内容没处理完,即使这时RI=1了,cpu也得处理完本次中断,才能进入下次中断,不可能覆盖前一帧数据的.
展开全部
置位就是表示要CPU去干什么,只要CPU去干了这个置位就没用了,因为已经在干了。中断只是优先级比较高的程序,程序不是没有写,而是已经包含进去了,只是你自己不用写而已
更多追问追答
追问
比如接受到了一帧数据,RI=1了,中断了,cpu是不是就去处理这个中断了呢?但是具体干了什么呢?把SBUF里的东西弄走,为下一帧接受做准备?
当RI=1时,一般我们编程的下一步就是RI=0,这样是不是就可以接下一帧数据了,那么下一帧数据会不会把前一帧数据覆盖呢?后一帧到来时cpu把前一帧数据怎么处理了?
有点乱啊,新手,麻烦了,
追答
响应中断时CPU做现场保护,然后跳转到中断代码,执行完再现场恢复,继续执行之前的代码,可以简单理解为一件紧急的事情来了,你先把手头的事情放一边,去处理紧急的事情,处理完了再回头来干你之前干的事。中断时只是保持中断前的所有执行状态,包括寄存器等等,中断完了再恢复。同时理解一点,中断并不是没事干,中断也有执行代码,只是你不用编写而已,你可以查看CPU的文档,看看CPU在中断时都干了什么。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
发送数据时你不使用中断,而只在接收时使用中断就是了。一般都这样使用的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询