經過跟他深入溝通,了解到stm32f031跟外界有uart資料通訊並開啟了rxne接收中斷,還有對外的ad取樣動作,通過定時器定時觸發ad轉換,並開啟了adc1的轉換完成中斷。ad觸發間隔為2秒。再就是些其它對外的gpio操作的東西。他陳述當波特率低於9600,甚至更低時就很難遇到丟包的現象,只要當波特率達到115200甚至更高時,就比較容易丟包,經常丟乙個兩個不等,波特率越高越容易丟。
客戶給usart1的時鐘源配置的是48m系統時鐘。按理說,stm32f0晶元的uart的波特率跑個200k是很輕鬆的事。讓他用示波器在晶元rx腳監測外界傳輸過來的訊號,當外界傳送方的波特率即使在200k左右時波形還是很乾淨漂亮,看來不存在訊號畸變的問題。
因為他談到開啟了uart rx中斷和adc的eoc中斷,我懷疑他的中斷優先順序配置可能有問題。察看其**後,發現關於uarttx/rx中斷與adc的eoc中斷優先順序一樣的 。
看到這裡,基本算是找到原因了,只待進一步驗證。
外界不定期通過uart傳送資料給mcu,當它收到乙個資料本該通過rx中斷請求去讀取資料時,如果此刻碰上adc的eoc中斷服務程式剛剛開始或正在執行途中,由於二者優先順序一樣,那uart的rx 中斷就得至少等待adc中斷服務程式繼續執行到彈棧前的時間。若在這個等待期間內uart又收到了第二個資料甚至更多,那就會發生溢位導致資料丟失。
那為什麼會只是偶爾發生而且波特率高更容易發生呢?這也不難理解。
波特率高意味著傳送速度快,相應的每個字元的傳送時間就短,即收到乙個字元後,下乙個字元來得也快。而每次的adc的中斷程式執行時間是相對固定的,最糟糕的情形就是產生uart rx中斷請求時碰到eoc中斷服務程式剛剛開始,這樣等待時間最長。在uart接收到資料等待adc中斷釋放cpu期間,新的資料來得越快,丟資料的機率就越高。當然了,不是每次都是碰到那個最糟糕的情形,最好的情形就是碰上adc中斷服務程式剛好執行完畢。
反過來講,如果uart傳輸波特率比較低,意味著單個字元傳輸時間相對比較長。碰到adc中斷服務程式先得到響應情況下,或許等人家執行完了再來取「待取走」的資料還來得及,尤其不在最糟糕的情形下。
當該工程師將uart rx中斷優先順序配置為高於adc的中斷優先順序後就再沒那個麻煩了。
順便說說上面那紅色語句「等待adc中斷繼續執行直到彈棧前」。
這句紅色的話意思是說,在上面情況下,uart中斷請求等待eoc中斷執行到執行pop之前的時刻就可得到響應而去執行uart rx中斷服務程式,並不急著執行eoc中斷的pop彈棧動作,隨之的uart中斷服務程式也無需壓棧操作,uart中斷程式執行完畢後再回來做彈棧動作,然後回到主迴圈的中斷處接著執行。這就是平常所說的咬尾中斷。不難看出,這樣可以大大提公升中斷響應速度。具體到本案,這個咬尾操作一定程度上減少了丟碼機會。
既然提到了咬尾中斷,可能很多人聽說過晚到中斷。所謂晚到中斷,簡單點說就是低優先順序中斷服務程式正在壓棧或剛壓棧完畢時發生更高優先順序的中斷請求,高優先順序中斷不再做push壓棧操作,等到低優先順序中斷壓棧完畢即直接執行高優先順序中斷服務程式,隨後再返回來接著執行低優先順序中斷服務程式,之後再做pop彈棧操作。
前面提到的stm32f0 的兩個中斷優先順序相同情況下,都是假定中斷請求在時間上錯開了的情況。如果二者同時到達,那cpu先響應哪乙個呢?就看二者在中斷向量表的序號,誰的序號小就先響應誰。
另外,玩過cortex m3/m4核心mcu的人,比方stm32f1,stm32f2,stm32f3,stm32f4等晶元的人可能會發現,cortex m0 核心的mcu的中斷管理跟其它cortex m3/m4核心的在中斷優先順序管理上是有差異的。
m3/m4的mcu在中斷優先順序做分組管理,分搶占優先順序和響應優先順序。只有強佔優先順序高的中斷請求才可以打斷低搶占優先順序的中斷服務程式;搶占優先順序相同的情況下,高響應優先順序的中斷請求頂多可以優先獲得響應權。而m0核心晶元的中斷優先順序不再做分組管理,誰的優先順序高就優先響應並可打斷低優先順序的中斷服務程式。
當在系統裡開啟多個中斷事件時,要合理安排各中斷源的優先順序,有些時候可能還需精心安排。對於初學者,因為中斷優先順序問題處理不當而導致麻煩的情況時有發生。再就是對於中斷服務程式,如果不是必需,**盡量精簡,不要累贅,能放到中斷外部處理的就盡量放到外部去。
stm32中斷優先順序
cm3 核心支援 256 個中斷,stm32 並沒有使用 cm3 核心的全部只用了它的一部分。stm32 有 84 個中斷,包括 16 個核心中斷和 68 個可遮蔽中斷,stm32f103 系列上面只有 60 個 107 系列才有 68 個 下面針對stm32f103 系列說明。與 nvic 相關的...
stm32中斷優先順序 STM32中斷系統
stm32 中斷非常強大,幾乎每個外設都可以產生中斷,因此這裡我們單獨使用一章來介紹它,為後面介紹外設中斷做鋪墊。學習本章可以參考 stm32f10x中文參考手冊 9 中斷和事件章節,cortex m3 權威指南 中文 chpt08 nvic與中斷控制章節。中斷概念 在學習 51 微控制器時,我們就...
STM32 中斷 優先順序設定
stm32中斷 優先順序設定 記性老差,前邊熟悉的東西,轉眼又忘了。今又翻開以前的筆記,重溫記錄如下 參考 記不清楚了 一 中斷優先順序概念 stm32 cortex m3 中有兩個優先順序的概念 搶占式優先順序和響應優先順序,有人把響應優先順序稱作 亞優先順序 或 副優先順序 每個中斷源都需要被指...