<center id="qkqgy"><optgroup id="qkqgy"></optgroup></center>
  • <menu id="qkqgy"></menu>
    <nav id="qkqgy"></nav>
    <xmp id="qkqgy"><nav id="qkqgy"></nav>
  • <xmp id="qkqgy"><menu id="qkqgy"></menu>
    <menu id="qkqgy"><menu id="qkqgy"></menu></menu>
    <tt id="qkqgy"><tt id="qkqgy"></tt></tt>


  • 在對STM32調試中,使用上位機串口調試助手給節點發送命令,誤將校驗方式選擇為無校驗,而節點的串口初始化為偶校驗方式接收數據,但使用串口工具發送無校驗數據時,節點立即死機無反應,最終看門狗復位

    *

    使用jlink在線跟蹤調試,發現程序未進入HardFault_Handler異常中斷,在收到無校驗的數據后,節點立即不停的循環進入串口中斷處理程序,最終導致看門狗復位。

    *
    按照常規流程,通過MDK在線調試工具觀察串口USART_CR1 與USART_ISR 寄存器的值;

    *
    發現USART_CR1 寄存器的PEIE置位,即將校驗錯誤中斷使能,同時串口中斷狀態寄存器USART_ISR的PE
    位置位,所以產生中斷,但我的中斷處理程序里面未對改中斷標志做任何處理,沒有使用USART_ICR 寄存器將PE的中斷標志位清除,當退出中斷后,STM32
    會立即再次進入串口中斷。

    *
    這種現象是因為串口配置為偶校驗,但收到無校驗的串口數據時,數據校驗失敗同時PEIE位置1從而導致進入串口中斷處理程序。

    *
    采用兩種辦法解決該問題:將USART_CR1 寄存器的PEIE的使能標志位清楚,或者在中斷處理程序里面退出之前的時候,將使用USART_ICR 寄存器將
    USART_ISR的PE中斷標志位清除,最終測試后問題得到解決

    *

    但是在另外的串口測試中,使用上位機通過串口不停的向節點發送數據,中途手動將串口的硬件連接斷開一段時間后再連接,有時候在將斷開的串口連接再次連接上時,設備又會循環進入串口中斷,最終導致設備的看門狗復位;

    *
    再次通過在線調試觀察串口寄存器,發現上面的PEIE已經被置零,說明該中斷使能已經被關閉,不是上面提到的校驗錯誤引起的中斷;

    *
    最終查看STM32F071的官方參考手冊,在看到CR3寄存器上看到如下說明

    EIE位:錯誤中斷使能控制,該位如果置1時,當USART_ISR的FE或ORE或NF其中一個置位時都將產生中斷,

    FE位:幀錯誤位標志,當檢測到同步錯誤或過多的噪聲或break符;

    ORE:過載錯誤標志;

    NF:噪聲錯誤標志;

    *

    在線調試觀察CR3寄存器的EIE位被置位,同時在異常的循環進入串口中斷時觀察中斷狀態標志位發現以上三個標志位中存在置位的情況,當初對該EIE標志位的使能未重視;

    *
    最后跟源代碼發現在串口的初始化中獎上面的兩個中斷使能位PEIE與EIE都使能;屏蔽該代碼或在中斷處理程序中清楚錯誤標志位后均正常工作;

    *
    該源代碼是使用STM32cube工具生成的庫,只使用了其串口初始化功能,但未使用工具生成的串口中斷處理程序;

    技術
    下載桌面版
    GitHub
    百度網盤(提取碼:draw)
    Gitee
    云服務器優惠
    阿里云優惠券
    騰訊云優惠券
    華為云優惠券
    站點信息
    問題反饋
    郵箱:ixiaoyang8@qq.com
    QQ群:766591547
    關注微信
    巨胸美乳无码人妻视频