打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
TI标志位和RI的作用是?
不管你什么芯片,一般中断开关分两成,其中一个是总中断开关,控制整个芯片所有可屏蔽中断,如果关掉,那么串口,定时器等等所有的都不能产生中断。其他中断使能一般只管理一种中断的使用,你说的TI和RI,估计是指串口的发送中断和接收中断,TI表示发送中断,如果使能,当数据串口发送出去之后,会产生发送中断,就用TI来控制中断使能,同理,RI表示接收中断,如果使能,则串口接到一个字节数据就会产生一个中断请求。

 说的好详细,意思是发送出去一个字节就会触发TI,接受一个就会触发RI吗?我见有的地方说什么TI不能软件修改?还有,基础哈,顺便问一下使能是。。。。

修改:刚才说错了,是TI和RI会置1然后触发中断。。。

是的
如果使用发送中断,那么先要设置使能发送中断的使能位,然后使能总中断,关联中断服务函数与中断向量,所谓中断向量就是产生中断时,对应的中断编号,假设发送中断的中断号是N,那么使能了发送中断之后,中断入口会跳到N指向的入口,如果入口函数是已经自己设置,那么就会执行设置的处理函数。处理函数明确的知道一个字节已经发出去了,可以判断发下一个字节或停止发送。大部分芯片在中断处理函数中要清除TI标志位,为下一次中断做准备,如果不清除TI,会一直产生中断,导致代码不能正常运行。通常,中断标志位TI是可以修改,除非一些特别的芯片,但我没见过。中断使能位可能是TE或其他的名称,我之前看错了。
在不实用操作系统时,用C语言表达就是:

一般的查询方式,不开中断,很常用,但效率低下
....
while(1)
{
    if ( TI ){  //发送完成,也可能是另外一个发送完成标志,看是什么芯片
         if( TxLen > 0){   //需要发送的数据还没发完
              SendNextByet();  //发下一字节
              TxLen--;             //总字节数减一
         }
         CLR_TI;   //清除发送完成标志
    }
}

中断方式,芯片效率较高
中断服务函数Tx_ISR一定要关联到发送中断对应的中断向量
void Tx_ISR(void)
{
         if( TxLen > 0){   //需要发送的数据还没发完
              SendNextByet();  //发下一字节
              TxLen--;             //总字节数减一
         }
         CLR_TI;   //清除发送完成标志
}

int main(void)
{
    ChipInit();   //芯片初始化
    Uart0Init();     //初始化串口
    EnableTx0Interrupt();  //使能发送中断
    EnableInterrupt();   //使能总中断

    while(1)
    {
         do_somthing();  //干其他的事情,如果发送完成,自然会跳到Tx_ISR去处理,主循环
    }
    return 0;
}

接收中断原来是一样的,处理方式也基本一样
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
串口通信的使用
单片机技术C51串口输出输入函数
单片机串口通信编程注意事项
STC15系列4个串口的使用库函数
linux串口编程 非规范模式 read()问题
通信教程 | 串口丢数据常见的原因
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服