完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
你得说清楚是哪个单片机的哪个寄存器的TI和RI啊?一般单片的datasheet都有详尽的说明的。
|
|
|
|
不管你什么芯片,一般中断开关分两成,其中一个是总中断开关,控制整个芯片所有可屏蔽中断,如果关掉,那么串口,定时器等等所有的都不能产生中断。其他中断使能一般只管理一种中断的使用,你说的TI和RI,估计是指串口的发送中断和接收中断,TI表示发送中断,如果使能,当数据串口发送出去之后,会产生发送中断,就用TI来控制中断使能,同理,RI表示接收中断,如果使能,则串口接到一个字节数据就会产生一个中断请求。
|
|
|
|
楼上的讲解真好!!!鼓掌
|
|
|
|
本帖最后由 Administrator-M 于 2015-4-14 18:13 编辑
说的好详细,意思是发送出去一个字节就会触发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; } 接收中断原来是一样的,处理方式也基本一样 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
787 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
755 浏览 0 评论
850 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1534 浏览 0 评论
1239 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12059 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 12:40 , Processed in 0.470541 second(s), Total 50, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号