<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一個隱秘的串口中斷BUG案例分享

嵌入式USB開發 ? 來源:嵌入式USB開發 ? 作者:嵌入式USB開發 ? 2023-09-19 14:05 ? 次閱讀

本文轉自公眾號,歡迎關注
https://mp.weixin.qq.com/s/uzaGLFTDBAn8wyR84yaiIw

一. 前言

本文分享一個STM32L4平臺串口驅動比較隱秘的BUG,分享的目的不在結論本身,而在于問題的分析過程,和如何形成標準,形成checklist,避免類似問題,以及在嵌入式開發中的思想。

二.問題描述

在某個項目代碼時發現以下問題, 串口中斷處理函數中,只對IDLE和RXNE標志進行了處理,而對溢出標志沒有處理。 根據手冊描述如果使能接收非空中斷即RXNEIE=1時,則有ORE標識溢出時也會進入中斷,該標志需要手動清除,如果不清除則會反復進入中斷。項目中是使能接收非空中斷的即RXNEIE=1。

圖片

圖片

三.問題驗證

在中斷服務函數中打斷點,然后串口調試助手輸入1個字符,進入中斷處理函數

圖片

此時ORE為0,RXN=1表示收到數據無溢出。

然后串口調試助手中輸入多個數據,然后再運行程序。

圖片

再次進入中斷,此時ORE置位,由于沒有對ORE標志清除,所以會一直進中斷,導致程序運行異常。

四.修改

對ORE標志進行清除,一般的清除時序是讀SR再讀DR 再寫1清除ORE標志。

圖片

再進行上述測試,ORE在每次中斷后都會清除,不再會出現該情況。

圖片

圖片

正確的處理應該如下:即只要有任何標志則清除相應的標志。

圖片

五.總結

1.中斷服務函數一般要清除所有的標志,而不是只清除自己關心的標志。但是要考慮可能會清掉別人沒有處理掉的標志,所以具體問題具體分析。

2.中斷服務函數清標志一定要按照手冊要求時序,有些是寫0清除,有些是寫1清除,有些是先讀狀態寄存器再讀數據寄存器清除等等。

3.一定要考慮異常,一般情況下沒有異常不代表任何情況沒有異常,溫度等環境改變則可能偶然的異常變為必然的錯誤。

4.一定要測試異常,實際該問題可以測試。比如結合仿真器白盒測試,也可以比如模擬RX引腳一直拉低模擬異常,生成任意PWM波形到RX引腳模擬干擾數據,模擬大負載等進行黑盒測試。

5.如果串口是先初始化使能,然后啟動Freertos時才使能中斷,那么使能中斷前可能就已經有溢出ORE錯誤了。這個問題是隨機的,出現概率小,一出現就會導致系統不能啟動的假象,如果RX引腳浮空,或者上電瞬間有干擾,或者高低溫等環境因素改變導致RX引腳出現干擾數據的概率增加,則可能導致每次啟動都失敗原項目從代碼注釋來看初始化位置修改過了,應該就是遇到過這個問題改的,但是系統啟動前還進行了一大段外設初始化也需要考慮除了串口外其他外設是否有該問題。

6.不排除該問題與之前的接上串口導致不能啟動等問題相關,并且有高溫等可能更容易出現的情況,實際高溫應該跟波特率無關,而可能是高溫更容易產生干擾數據等。

7.對于使用RTOS的系統,不要在OsStart之前初始化驅動使能外設,因為一般OsStart之前都是不使能中斷的,OsStart之前使能外設則再使能中斷的一剎那可能會出現未預料的中斷導致異常。

從原項目代碼注釋來看應該是遇到過這個問題后面改了,使能接收改到了初始化任務中。

圖片

但是從原項目代碼來看main函數之后,系統啟動之前還是進行了太多的處理,甚至進行了文件系統的操作等,這種處理比較危險,建議除了系統啟動必要的初始化其他的都放在初始化任務重初始化。

圖片

如系統啟動前只進行底層系統必要初始化然后創建shell任務,其他初始化都在shell任務中進行。

圖片

7.解決問題一定要找到根本原因而不是消除現象,比如上述問題原來項目其實發現有問題但是都是在修改串口初始化位置消除現象,而沒有去找根本原因。這在嵌入式開發中是大忌。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5006

    文章

    18440

    瀏覽量

    292146
  • 中斷
    +關注

    關注

    5

    文章

    885

    瀏覽量

    41082
  • 串口
    +關注

    關注

    14

    文章

    1504

    瀏覽量

    74752
  • 函數
    +關注

    關注

    3

    文章

    4117

    瀏覽量

    61507
  • BUG
    BUG
    +關注

    關注

    0

    文章

    154

    瀏覽量

    15602
收藏 人收藏

    評論

    相關推薦

    用stm32cubemx的串口中斷接收時,過段時間串口中斷不進了怎么解決?

    小時多串口中斷進不去了,我用兩根線掛在總線上在電腦上用串口助手監聽收發的數據,發送和應答的過程還在持續,其他功能也都正常只是cubemx的程序認為沒有收到數據。很難定位是哪里的問題。
    發表于 04-17 06:48

    外部中斷串口中斷問題

    目標 :今天試著編寫了 兩外部中斷 分別往串口發a和b串口接收
    發表于 04-28 09:59

    51單片機串口中斷使用總結

    51單片機串口中斷使用總結,有程序,可以參考。
    發表于 03-28 10:00 ?13次下載

    第6章單片機定時器串口中斷(20150709213857)

    第6章單片機定時器串口中斷(20150709213857)
    發表于 12-15 22:28 ?6次下載

    串口中斷丟失數據問題

    關于51單片機,串口中斷發送與接收出現數據丟失問題串口中斷的接收器具有雙緩沖結構,即在從接收寄存器中讀出前一個已收到的字節之前,便能接收第2個字節,如果第2個字節已經接收完畢,第1個字節還沒有被讀出
    發表于 02-17 00:13 ?3217次閱讀

    15W4K-4串口中斷收發程序免費下載

    51黑論壇_15W4K-4串口中斷收發
    發表于 04-15 08:00 ?12次下載
    15W4K-4<b class='flag-5'>串口中斷</b>收發程序免費下載

    單片機學習教程之外部中斷和定時器及串口中斷的資料和程序說明

    本文檔的主要內容詳細介紹的是單片機學習教程之外部中斷和定時器及串口中斷的資料和程序說明。CPU收到中斷請求,停下正在處理的工作A,去處理事件B,處理完后繼續回到中斷的地方繼續執行事件A
    發表于 04-18 17:27 ?5次下載
    單片機學習教程之外部<b class='flag-5'>中斷</b>和定時器及<b class='flag-5'>串口中斷</b>的資料和程序說明

    STM32串口中斷 DMA接收的幾點注意地方

    STM32串口中斷、DMA接收的幾點注意地方
    的頭像 發表于 03-04 13:57 ?2w次閱讀

    IAP15F2K61S2串口中斷快速編程問題

    在講串口中斷問題之前,需要明白串口中斷內容包括哪些部分,我概括為主要3個部分:串口中斷的初始化,串口中斷函數入口函數設置,
    發表于 11-23 17:36 ?10次下載
    IAP15F2K61S2<b class='flag-5'>串口中斷</b>快速編程問題

    STM32使用CubeMAX配置的串口中斷接收方法

    STM32使用CubeMAX配置的串口中斷接收方法目錄1.定位串口中斷發生的地方2.處理串口中斷接收的流程是:(1)初始化串口(2)在main中第一次調用接收
    發表于 12-14 18:45 ?28次下載
    STM32使用CubeMAX配置的<b class='flag-5'>串口中斷</b>接收方法

    STM32F407串口中斷配置

    花費了很久,發現用庫函數去訪問發送完成和接收完成的標志位會出問題,改成了直接訪問寄存器對應的位,終于實現串口中斷的通信。至于為什么庫函數不行,lz還沒有發現原因。 串口中斷適合用于發送數據較少的情況
    發表于 12-24 18:48 ?1次下載
    STM32F407<b class='flag-5'>串口中斷</b>配置

    串口中斷服務函數的觸發

    串口中斷服務函數的觸發USART1_IRQHandler(void)1. 串口發送中斷下圖為狀態寄存器(USART_SR)中的位7、位6說明,發送完一幀并且發送數據寄存器為空時,位6置1。下圖為控制
    發表于 12-28 19:01 ?19次下載
    <b class='flag-5'>串口中斷</b>服務函數的觸發

    STM32G0開發筆記:串口中斷的使用

    使用Platformio平臺的libopencm3開發框架來開發STM32G0,以下為串口中斷的使用。
    的頭像 發表于 01-17 10:46 ?1850次閱讀

    STM32串口中斷應用實例

    本文將介紹如何使用STM32F4的串口接收中斷,通過串口助手模擬上位機發送指令、STM32F4串口中斷接收到指令后根據指令選擇開關LED小燈。
    的頭像 發表于 04-20 11:45 ?1744次閱讀
    STM32<b class='flag-5'>串口中斷</b>應用實例

    STM32串口中斷及DMA接收常見的幾個問題

    STM32串口中斷及DMA接收常見的幾個問題
    的頭像 發表于 10-26 16:41 ?2793次閱讀
    STM32<b class='flag-5'>串口中斷</b>及DMA接收常見的幾個問題
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>