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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:523537 發表于 2019-6-9 15:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/*******************************串口中斷函數問題*********************************/
單片機串口中斷函數的觸發是因為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,那么就是死循環了,但是為什么實際操作卻可以完整無損的收發數據呢?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

來自 2#
ID:213173 發表于 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
//        }
}
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

5#
ID:557636 發表于 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后,即中斷源被取消,自然也不會中斷。
回復

使用道具 舉報

6#
ID:523537 發表于 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這一個條件來觸發中斷。
回復

使用道具 舉報

7#
ID:523537 發表于 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觸發的中斷請求。您覺得我這個解釋是對的嗎?
回復

使用道具 舉報

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

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

使用道具 舉報

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

哎,小老弟別復制粘貼水經驗啊
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

12#
ID:123289 發表于 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。
回復

使用道具 舉報

13#
ID:523537 發表于 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觸發的中斷程序返回斷點后也不會再觸發中斷,謝謝大佬的詳細解釋!
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美亚洲日本 | 一区二区三区国产精品 | 瑟瑟激情 | 国产精品视频一区二区三区四区国 | 91在线网| 日韩2020狼一二三 | 欧美一区二区在线播放 | 午夜看电影在线观看 | 国产91亚洲精品一区二区三区 | 91精品国产乱码久久久久久久久 | 欧美综合自拍 | 久久久久久久久久久久久久av | 伊人一区 | 91精品国产91久久久久久 | 激情一区二区三区 | 亚洲国产成人精品在线 | 久久亚洲国产 | 日本欧美大片 | 日韩在线视频一区 | 亚洲精品在线视频 | www久久久 | 日本一区二区高清不卡 | 日韩在线一区视频 | 国产精品久久久久一区二区三区 | 999久久久| 日韩中文字幕网 | 国产精品一区二区福利视频 | 国产精品三级久久久久久电影 | 成人a视频片观看免费 | 欧美xxxx性 | 国产免费一区 | 日韩一区不卡 | 亚洲成人免费视频 | 成av在线| www.狠狠干 | 国产成人一区二区三区电影 | 精品不卡 | 一级片视频免费 | 天天干天天爱天天爽 | 一道本视频 | 欧美日韩在线精品 |