进入串口中断的条件是RI置1或TI置1吗?
1个回答
展开全部
#include <reg51.h>
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xF4;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI); //同理TI没有置1说明继续发送 置1了表示发送完成
TI = 0;
}
void main(void)
{
InitUART();
}
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0; //这里表明接收如果没有自动置1说明还在接收 置1了表示接收完成
//add your code here!
}
else
TI = 0;
}
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xF4;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI); //同理TI没有置1说明继续发送 置1了表示发送完成
TI = 0;
}
void main(void)
{
InitUART();
}
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0; //这里表明接收如果没有自动置1说明还在接收 置1了表示接收完成
//add your code here!
}
else
TI = 0;
}
追问
那么进入串口中断的条件到底是置1所致,还是只要检测到串口有数据接收或发送就进入串口中断,不管接收或者发送是否完成TI和RI是否置1都会进入串口中断??
追答
那2个是单片机CPU自动完成的 不需要人工干预 但是进入到中断以后 你需要人为的置0 否则下次进不了中断, 自动置1是根据你定义的串口参数 停止位什么的判断的 这个在单片机里面体现不出来
串口有发送和接收两种不同的情况,不论是发送还是接收,只要发送或接收完一帧,都会置位串口中断标志位(发送就置位TI,接收则置位RI),所以=1表示的是两个标志位只要有一个为1(即是两种情况有一种发生)且此时系统允许串口中断,则会转向中断服务程序,在服务程序里判断中断是TI/RI哪个为1触发的,相应的做出处理,如可以把缓冲区的数据读出来等;
如果没有开中断,则通过检测TI/RI是否为1来检测发送或者接收结束否,这两个标志位无论是中断法还是查询法都只能使用软件清零(接收完了人工置0)。
总结一下上面的图:即是表示要触发串口中断,首先要TI/RI其中有一个为1,其次串口中断ES要允许,紧接着总中断为EA要为1,满足这些条件就能触发串口中断,然后根据串口的中断优先级控制位PS到中断服务程序所在地址处执行程序。
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询