新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 關于STM32的串口溢出中斷

        關于STM32的串口溢出中斷

        作者: 時間:2018-07-24 來源:網絡 收藏

        之前遇到奇怪的問題:

        本文引用地址:http://www.104case.com/article/201807/383617.htm

        中斷處理函數中加了處理:

        if(USART_GetITStatus(USART1,USART_IT_ORE) != RESET) //產生

        {

        Utemp = USART_ReceiveData(USART1); //扔掉接收的數據

        USART_ClearITPendingBit(USART1, USART_IT_ORE); //清標志位

        }

        參考手冊ISR寄存器:

        位 3 ORE: 溢出錯誤

        在RXNE=1 的的條件下(也就是上次數據還沒有讀走),接收寄存器又接收好

        了一個字節的數據并準備往RDR 寄存器去轉移的時候,會由硬件將這個位置1。

        由軟件向USART_ICR 寄存器的ORECF 位寫1,可以清除這個標志。

        如果USART_CR1 寄存器中的RXNEIE 位或EIE 位是1,就會產生中斷請求。

        0: 沒有溢出錯誤

        1: 檢測到溢出錯誤

        CR1中的RXNEIE已經使能,實際溢出發生時keil中觀察ORE的確被置位為1。

        然鵝,,,,,,,,

        就算ORE置位為1,這個if語句也不通過。。。。。

        后來網上找到這句話:

        “ORE中斷只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 讀到(沒有使能USART_IT_ERR中斷時)”

        驚奇的發現還有USART_GetFlagStatus可以用!

        USART_GetITStatus(USART1,USART_IT_ORE)這個函數在USART_IT_ERR未使能時并不能正確ORE的正確狀態!!!!!!

        可以使用USART_GetFlagStatus(USART1,USART_FLAG_ORE)讀取,或者初始化時使能USART_IT_ERR。關于USART_IT_ERR在庫函數中的定義:

        (##) USART_IT_ERR: specifies the interrupt source for Error interrupt (Frame error, noise error, overrun error)

        補充一下這倆函數的區別(看庫函數更直接):

        IT主要就是與中斷相關的,檢查USART中斷產生與否,當USART發送完成后會有USART_IT_TC中斷,因此可以用來判斷,而USART_GetFlagStatus是USART標志位設置與否,其中就有發送完成標志位USART_Flag_TC所以也可用來判斷。而最終都是操作ISR寄存器

        • 單片機中文官網
        • 單片機官方開發工具
        • 單片機參考設計


        關鍵詞: STM32 串口 溢出中斷

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 射阳县| 离岛区| 名山县| 墨玉县| 开阳县| 芦溪县| 博罗县| 板桥市| 陈巴尔虎旗| 荃湾区| 泊头市| 拜泉县| 漯河市| 武城县| 竹溪县| 余干县| 建德市| 达尔| 甘肃省| 安塞县| 射洪县| 于都县| 延庆县| 亚东县| 南丰县| 朝阳县| 麻阳| 茌平县| 乐都县| 江陵县| 兰州市| 建湖县| 商南县| 休宁县| 科技| 汤原县| 梅州市| 宝坻区| 新巴尔虎右旗| 凤翔县| 永清县|