久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 求問單片機串口中斷一個問題,關于TI RI設置 [打印本頁]

作者: 董董    時間: 2019-6-9 15:02
標題: 求問單片機串口中斷一個問題,關于TI RI設置
/*******************************串口中斷函數問題*********************************/
單片機串口中斷函數的觸發是因為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,那么就是死循環了,但是為什么實際操作卻可以完整無損的收發數據呢?

作者: wulin    時間: 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
//        }
}
作者: yzwzfyz    時間: 2019-6-10 08:14
RI、TI只是標記,它并不完全控制中斷的發生,中斷受以下條件限制:
1、EA=0,不中斷
2、ES=0,不中斷
3、已經響應了中斷,在未遇到RETI指令之前,不中斷。(即中斷返回。你的問題,屬于這一種)
4、更高級的中斷在響應執行中,不中斷。
5、RI、TI被人工清0后,即中斷源被取消,自然也不會中斷。
……
作者: yzwzfyz    時間: 2019-6-10 08:17
這些手冊上都有,學會查資料。
了解以上才能對中斷有所認識。
作者: qing132    時間: 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后,即中斷源被取消,自然也不會中斷。
作者: 董董    時間: 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這一個條件來觸發中斷。
作者: 董董    時間: 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觸發的中斷請求。您覺得我這個解釋是對的嗎?
作者: 董董    時間: 2019-6-10 10:54
yzwzfyz 發表于 2019-6-10 08:17
這些手冊上都有,學會查資料。
了解以上才能對中斷有所認識。

嗯嗯,我自己也是剛開始學,很多地方都沒開竅,對著源程序和指導書看有時也不太明白,所以就來論壇多問問了,多謝大佬的指點
作者: 董董    時間: 2019-6-10 10:54
qing132 發表于 2019-6-10 09:03
RI、TI只是標記,它并不完全控制中斷的發生,中斷受以下條件限制:
1、EA=0,不中斷
2、ES=0,不中斷

哎,小老弟別復制粘貼水經驗啊
作者: lwh999995    時間: 2019-6-10 11:44
什么叫完整無損哦,你1ms每次連續發送一個20個長度字符串試試,再看看接收發送數據計數有沒有誤差。 數據發送與TI有關系,發送的時候與中斷沒關系。  仿真一下,你就知道了。
作者: L1BB    時間: 2019-6-10 15:05
董董 發表于 2019-6-10 10:43
您前面說的是SBUF公用同一個字節地址,但是兩個SBUF物理地址是不同的,這一點我明白的。我想說的是在EA=1 ...

你這么說,RI和TI算一個級別,確實有道理,感覺解釋清楚了
作者: yzwzfyz    時間: 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。

作者: 董董    時間: 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觸發的中斷程序返回斷點后也不會再觸發中斷,謝謝大佬的詳細解釋!
作者: Y_i__X_i    時間: 2025-3-12 22:56
最近剛開始自學51單片機,學到串口通信,我和樓主一樣產生了這個RI,TI中斷的問題。非常感謝樓主19年發的這個帖子,能讓25年的我找到問題的解答。。六年過去了,想必樓主現在也是個嵌入式大佬吧




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 韩国精品在线观看 | 欧美寡妇偷汉性猛交 | 亚洲天堂一区二区 | 亚洲一区二区三区四区五区中文 | 国产成人一区二区三区久久久 | 国产成人免费视频网站高清观看视频 | 亚洲视频一区二区三区四区 | 亚洲成年在线 | 麻豆91精品91久久久 | 亚洲国产精品一区二区三区 | 一区二区在线 | 免费看91| 日本免费视频在线观看 | 久久久成人精品 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 国产高清视频在线 | 日韩欧美在线观看视频 | 久久99精品国产 | 一区二区三区高清在线观看 | 欧美一区二区三区国产精品 | 亚洲欧美日韩在线不卡 | 黄色毛片免费视频 | av一二三区 | 在线观看的av | 日本精a在线观看 | 夜夜操天天干 | 99热在线观看精品 | 天天干成人网 | 日一区二区 | 日韩成人高清 | 亚洲综合日韩精品欧美综合区 | 欧美在线一级 | 国产精品xxxx | 欧美一二三区 | 中文在线播放 | 欧美成人专区 | 国产精品久久777777 | 国产日韩中文字幕 | 视频一区二区三区在线观看 | 精品91久久久 | 国产高潮av|