找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6922|回復: 13
打印 上一主題 下一主題
收起左側

求問單片機串口中斷一個問題,關于TI RI設置

[復制鏈接]
跳轉到指定樓層
樓主
ID:523537 發(fā)表于 2019-6-9 15:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/*******************************串口中斷函數(shù)問題*********************************/
單片機串口中斷函數(shù)的觸發(fā)是因為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;
        }
}

上面的程序在單片機和電腦進行串口通訊時的程序,首先這個程序燒近單片機是有用的,沒有丟位,但是我對程序執(zhí)行有疑問。當單片機收到一個8位的數(shù)據(jù)時,RI = 1進入中斷程序,RI置0,把接收緩存寄存器SBUF存儲的數(shù)據(jù)存到temp里面,然后再把temp存儲到發(fā)送緩存寄存器SBUF里面,最后等數(shù)據(jù)發(fā)送完TI=1,我的問題就是TI=1那么不就又出發(fā)了中斷然后又進入了中斷函數(shù)里面,但是TI沒法置0,那么就是死循環(huán)了,但是為什么實際操作卻可以完整無損的收發(fā)數(shù)據(jù)呢?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

來自 2#
ID:213173 發(fā)表于 2019-6-10 06:37 | 只看該作者
每個串行口的數(shù)據(jù)緩沖器由2個互相獨立的接收、發(fā)送緩沖器構成,可以同時發(fā)送和接收數(shù)據(jù)。發(fā)送緩沖器只能寫入而不能讀出,接收緩沖器只能讀出而不能寫入,因而兩個緩沖器可以共用一個地址碼,SBUF實際是兩個物理寄存器。
void UART_SER() interrupt 4
{
        uchar temp;
//        if(RI)/*既然串口中斷已經(jīng)響應,RI必定是1,此判斷多余
//        {
                RI = 0;//軟件清0
                temp = SBUF;//讀取
                SBUF = temp;//發(fā)送

                while(!TI);//等待發(fā)送完成,硬件置位中斷請求標志為1,并不是發(fā)生了中斷響應
                TI = 0;//軟件清0
//        }
}
回復

使用道具 舉報

來自 3#
ID:123289 發(fā)表于 2019-6-10 08:14 | 只看該作者
RI、TI只是標記,它并不完全控制中斷的發(fā)生,中斷受以下條件限制:
1、EA=0,不中斷
2、ES=0,不中斷
3、已經(jīng)響應了中斷,在未遇到RETI指令之前,不中斷。(即中斷返回。你的問題,屬于這一種)
4、更高級的中斷在響應執(zhí)行中,不中斷。
5、RI、TI被人工清0后,即中斷源被取消,自然也不會中斷。
……
回復

使用道具 舉報

地板
ID:123289 發(fā)表于 2019-6-10 08:17 | 只看該作者
這些手冊上都有,學會查資料。
了解以上才能對中斷有所認識。
回復

使用道具 舉報

5#
ID:557636 發(fā)表于 2019-6-10 09:03 | 只看該作者
yzwzfyz 發(fā)表于 2019-6-10 08:14
RI、TI只是標記,它并不完全控制中斷的發(fā)生,中斷受以下條件限制:
1、EA=0,不中斷
2、ES=0,不中斷

RI、TI只是標記,它并不完全控制中斷的發(fā)生,中斷受以下條件限制:
1、EA=0,不中斷
2、ES=0,不中斷
3、已經(jīng)響應了中斷,在未遇到RETI指令之前,不中斷。(即中斷返回。你的問題,屬于這一種)
4、更高級的中斷在響應執(zhí)行中,不中斷。
5、RI、TI被人工清0后,即中斷源被取消,自然也不會中斷。
回復

使用道具 舉報

6#
ID:523537 發(fā)表于 2019-6-10 10:43 | 只看該作者
wulin 發(fā)表于 2019-6-10 06:37
每個串行口的數(shù)據(jù)緩沖器由2個互相獨立的接收、發(fā)送緩沖器構成,可以同時發(fā)送和接收數(shù)據(jù)。發(fā)送緩沖器只能寫 ...

您前面說的是SBUF公用同一個字節(jié)地址,但是兩個SBUF物理地址是不同的,這一點我明白的。我想說的是在EA=1;ES=1;的條件下,無論是RI=1還是TI=1都會觸發(fā)串口中斷,所以您前面寫的“既然串口中斷已經(jīng)響應,RI必然是1,此判斷多余”也有可能是TI=1觸發(fā)了串口中斷。在我的指導書籍里寫了“若CPU允許中斷,都要進入中斷服務程序,但是CPU實現(xiàn)并不能區(qū)分是TI還是RI請求中斷,只有進入中斷服務程序后,通過查詢來區(qū)分,然后進入相應的中斷處理”。
   但是在我寫的這個中斷程序中,RI=1然后進入中斷函數(shù),然后把接收串行數(shù)據(jù)緩沖器中的數(shù)據(jù)SBUF轉移到發(fā)送串行數(shù)據(jù)緩存器SBUF中,然后等待TI=1,但是TI=1后不會又觸發(fā)這個串口中斷函數(shù),我思考了下覺得應該是這樣,RI=1和TI=1觸發(fā)的中斷函數(shù)屬于同級別的,沒有優(yōu)先級上的區(qū)別,所以要按照先來后到的原則,那么TI=1后向CPU申請的中斷不會被正在執(zhí)行RI=1觸發(fā)的中斷函數(shù)CPU響應,所以我這個帖子提出的問題:中斷函數(shù)的循環(huán)觸發(fā)就不存在了,這樣一來確實只有RI=1這一個條件來觸發(fā)中斷。
回復

使用道具 舉報

7#
ID:523537 發(fā)表于 2019-6-10 10:53 | 只看該作者
yzwzfyz 發(fā)表于 2019-6-10 08:14
RI、TI只是標記,它并不完全控制中斷的發(fā)生,中斷受以下條件限制:
1、EA=0,不中斷
2、ES=0,不中斷

您說的1,2,4,5點我記住了,關于您第三點我的想法是RI=1和TI=1觸發(fā)的中斷函數(shù)屬于同級別的,沒有優(yōu)先級上的區(qū)別,所以要按照先來后到的原則,那么TI=1后向CPU申請的中斷不會被正在執(zhí)行RI=1觸發(fā)的中斷函數(shù)CPU響應,除非CPU處理完了RI=1出發(fā)的中斷函數(shù)返回斷點,否則CPU不會理睬TI=1觸發(fā)的中斷請求。您覺得我這個解釋是對的嗎?
回復

使用道具 舉報

8#
ID:523537 發(fā)表于 2019-6-10 10:54 | 只看該作者
yzwzfyz 發(fā)表于 2019-6-10 08:17
這些手冊上都有,學會查資料。
了解以上才能對中斷有所認識。

嗯嗯,我自己也是剛開始學,很多地方都沒開竅,對著源程序和指導書看有時也不太明白,所以就來論壇多問問了,多謝大佬的指點
回復

使用道具 舉報

9#
ID:523537 發(fā)表于 2019-6-10 10:54 | 只看該作者
qing132 發(fā)表于 2019-6-10 09:03
RI、TI只是標記,它并不完全控制中斷的發(fā)生,中斷受以下條件限制:
1、EA=0,不中斷
2、ES=0,不中斷

哎,小老弟別復制粘貼水經(jīng)驗啊
回復

使用道具 舉報

10#
ID:207421 發(fā)表于 2019-6-10 11:44 來自手機 | 只看該作者
什么叫完整無損哦,你1ms每次連續(xù)發(fā)送一個20個長度字符串試試,再看看接收發(fā)送數(shù)據(jù)計數(shù)有沒有誤差。 數(shù)據(jù)發(fā)送與TI有關系,發(fā)送的時候與中斷沒關系。  仿真一下,你就知道了。
回復

使用道具 舉報

11#
ID:558624 發(fā)表于 2019-6-10 15:05 | 只看該作者
董董 發(fā)表于 2019-6-10 10:43
您前面說的是SBUF公用同一個字節(jié)地址,但是兩個SBUF物理地址是不同的,這一點我明白的。我想說的是在EA=1 ...

你這么說,RI和TI算一個級別,確實有道理,感覺解釋清楚了
回復

使用道具 舉報

12#
ID:123289 發(fā)表于 2019-6-10 17:53 | 只看該作者
"您說的1,2,4,5點我記住了,關于您第三點我的想法是RI=1和TI=1觸發(fā)的中斷函數(shù)屬于同級別的,沒有優(yōu)先級上的區(qū)別,所以要按照先來后到的原則,那么TI=1后向CPU申請的中斷不會被正在執(zhí)行RI=1觸發(fā)的中斷函數(shù)CPU響應,除非CPU處理完了RI=1出發(fā)的中斷函數(shù)返回斷點,否則CPU不會理睬TI=1觸發(fā)的中斷請求。您覺得我這個解釋是對的嗎?"

RI中斷后,被響應。這時TI又來了:
你已經(jīng)響應了中斷,所以不存在TI再中斷,但記住這時TI=1。
當你完成了RI的處理后,退出中斷服務程序后,這時由于TI=1,所以中斷會再次發(fā)生,重新進入中斷響應!
如果你在RI的處理后,在退出中斷服務程序之前,清除了TI=0,則TI不會產(chǎn)生中斷。

RI與TI是串行中斷的兩個發(fā)生源,它倆一樣,共用同一個中斷入口。如果兩個同時發(fā)生,只要你不清除標記(留下任意一個,或兩個都留),則中斷返回后,會又進入中斷!所以中斷響應后,你要記住清除標記。
做一個就清一個,這樣不會出問題。不要做一個RI處理,卻將TI清了,就會遺漏處理TI。
回復

使用道具 舉報

13#
ID:523537 發(fā)表于 2019-6-10 22:56 | 只看該作者
yzwzfyz 發(fā)表于 2019-6-10 17:53
"您說的1,2,4,5點我記住了,關于您第三點我的想法是RI=1和TI=1觸發(fā)的中斷函數(shù)屬于同級別的,沒有優(yōu)先級 ...

嗯嗯,您說的很透徹,正是因為TI和RI同級別,處理RI=1觸發(fā)的中斷程序中把TI也置0了,所以CPU處理完RI=1觸發(fā)的中斷程序返回斷點后也不會再觸發(fā)中斷,謝謝大佬的詳細解釋!
回復

使用道具 舉報

14#
ID:1145390 發(fā)表于 2025-3-12 22:56 | 只看該作者
最近剛開始自學51單片機,學到串口通信,我和樓主一樣產(chǎn)生了這個RI,TI中斷的問題。非常感謝樓主19年發(fā)的這個帖子,能讓25年的我找到問題的解答。。六年過去了,想必樓主現(xiàn)在也是個嵌入式大佬吧
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表