微控制器UART中斷應用中TXE和TC的順序

2021-07-12 07:19:24 字數 1887 閱讀 5336

今天回顧之前寫過的一些程式,發現了當時乙個比較有意思的修改記錄,想了會才回憶起當時的具體意圖,記錄下來備忘,也分享給看到的朋友們。

案例是以stm32f107晶元為主控的乙個環境汙染物監測裝置,在裡面用到485通訊,因485晶元需要通過控制管腳設定傳送和接受狀態,所以就要求對uart的控制要有足夠的精準度,否則會發生發不出去或收不回來的情況,尤其是在做資訊互動的時候,於是用到了中斷。

在平常的uart應用中,使用中斷的話,大多使用txe(傳送暫存器空中斷)的方式來進行傳送管理,因為平常一般不涉及通道傳送接收狀態的設定,所以這種方式可以最大效率的利用uart,只要傳送暫存器空閒,就可以立刻傳送資料出去,也是網上眾多例程通用的方法。

if(usart_getitstatus(usart1, usart_it_txe) != reset)

else

// clear interrupt flag

usart_clearitpendingbit(usart1, usart_it_txe);

}

但在案例的應用中,涉及到了485通道收發控制,就必須要求在所有資料傳送完之後將控制管腳置位,來接收從機的應答。這個時機必需精準,置位早了會導致資料無法傳送完全,置位晚了又會導致接收資料不完全(應答的前面的位元組丟失)。因此肯定不能在txe中斷中進行判斷置位,因為txe(傳送暫存器空中斷)發生的時機其實是微控制器將傳送暫存器的資料buf完全轉移至傳送數列中去的時機,並非傳送完成的時機,如果這時就將管腳置位的話,必然導致最後乙個位元組的最後幾位以及校驗位停止位這一部分的資料不能正常傳送,也就是置位早了。

所以經過考慮,開啟了tc(傳送完成中斷)來對資料完全傳送完畢進行偵測,完全傳送完畢後進行置位。

if(usart_getitstatus(usart1, usart_it_txe) != reset)

else

// clear interrupt flag

usart_clearitpendingbit(usart1, usart_it_txe);

}if(usart_getitstatus(usart1, usart_it_tc) != reset)

// clear interrupt flag

usart_clearitpendingbit(usart1, usart_it_tc);

}

但在實際測試中發現,這樣的結構並不能解決問題。

經過跟蹤測試發現,是在通訊程序中,txe和tc同屬於uart中斷,當中斷發生時,必需從中斷入口跳轉至uart中斷處理函式,然後才能根據txe和tc的狀態位來分析判斷當前中斷是由txe產生的還是tc產生的。而且,由於txe和tc之間是前後迴圈發生的(例如:位元組1 txe→位元組1 tc →位元組2 txe→位元組2 tc ...),所以當程式進入到中斷處理函式中,有可能會發現txe和tc(上乙個位元組的傳送完成)狀態位都是置位的,這就會導致當傳送到最後乙個位元組時,程式誤以為已經傳送完畢而直接對485通道進行轉換,使最後乙個位元組資料無法發出的問題。

當時因為趕進度,沒有再做進一步的探索,如將txe和tc的處理順序掉轉,是否能解決問題,而是採取了更加穩妥的方式,關閉txe中斷,使用tc中斷來作為發射下乙個位元組資料的判斷依據,犧牲了一點效率,但保證了程式的穩定性。

if(usart_getitstatus(usart1, usart_it_tc) != reset)

else

}

今天在回顧這段程式時,已然忘了當初所針對的問題,直覺的認為用txe會提公升一定的效率,經過回憶才算想起來為什麼這麼做,因此記錄下來,省得後面再忘了。

回頭有時間,應該再去做一下測試,將上面tc和txe的處理順序掉轉,看能否再進一步的把效率提高。

經過測試,將tc和txe的處理順序掉轉,程式執行測試ok,這樣就能夠進一步提高傳送效率。

微控制器中斷的應用

51微控制器 p3.2 引腳為int0 中斷 p3.3引腳為int1 中斷 按鈕 p3.2 p3.3 按鈕低電平觸發 while pb0 0 delay include define seg p0 定義七節顯示器接至port 0 sbit led p2 0 定義led燈接至p2.0 sbit com...

微控制器(微控制器)的中斷系統及應用

2.中斷暫存器 3.中斷處理流程 4.最重要的事 中斷是指 處理器cpu正在處理某件事情的時候,外部發生了某一事件 如定時器計時已到 請求cpu迅速去處理,cpu暫停當前的工作,轉去處理所發生的事件,處理完以後,再回到原來被中斷的地方,繼續原來的工作。實現這種功能的部件稱為中斷系統。它由4個與中斷有...

51微控制器 中斷

一 中斷的概念 cpu在處理某一事件a時,發生了另一事件b請求cpu迅速去處理 中斷發生 cpu暫時中斷當前的工作,轉去處理事件b 中斷響應和中斷服務 待cpu將事件b處理完畢後,再回到原來事件a被中斷的地方繼續處理事件a 中斷返回 這一過程稱為中斷 二 中斷源 在51微控制器中有5個中斷源 中斷號...