STM8避坑—串口中斷


  STM8庫函數開發方式中,串口中斷的類型有很多,頭文件中的定義入下:

typedef enum { UART1_IT_TXE        = (uint16_t)0x0277, /*!< Transmit interrupt */
               UART1_IT_TC         = (uint16_t)0x0266, /*!< Transmission Complete interrupt */
               UART1_IT_RXNE       = (uint16_t)0x0255, /*!< Receive interrupt */
               UART1_IT_IDLE       = (uint16_t)0x0244, /*!< IDLE line interrupt */
               UART1_IT_OR         = (uint16_t)0x0235, /*!< Overrun Error interrupt */
               UART1_IT_PE         = (uint16_t)0x0100, /*!< Parity Error interrupt */
               UART1_IT_LBDF       = (uint16_t)0x0346, /**< LIN break detection interrupt */
               UART1_IT_RXNE_OR    = (uint16_t)0x0205  /*!< Receive/Overrun interrupt */
             } UART1_IT_TypeDef;

  我們經常使用的串口中斷是,接收中斷和發送中斷,但是從頭文件中來看比較模糊。

  發送中斷到底是用UART1_IT_TXE(TXE的意思是發送寄存器為空),還是用UART1_IT_TC(TC的意思是發送完成),接收中斷到底是用UART1_IT_RXNE(RXNE的意思是接收寄存器非空),還是用UART1_IT_RXNE_OR(OR的意思是接收寄存器超載溢出),又要怎么使用呢?

  經過實踐,總結如下:

  發送中斷只能使用UART1_IT_TXE,並且與51單片機的方式有很大不同,51單片機中發送中斷的工作流程是:1)給SBUF賦值,2)硬件自動發送,3)發送完成進入串口中斷,4)在中斷中判斷中斷是發送還是接受,清楚對應標志位;

  STM8中對串口進行了初始化之后,

UART1_Init((uint32_t)115200,
            UART1_WORDLENGTH_8D,
            UART1_STOPBITS_1,
            UART1_PARITY_NO,
            UART1_SYNCMODE_CLOCK_DISABLE,
            UART1_MODE_TXRX_ENABLE);
UART1_Cmd(ENABLE);

  在需要發送數據時再對發送中斷進行使能,比如在主函數中,

UART1_ITConfig(UART1_IT_TXE,ENABLE);

  然后在發送中斷服務函數中執行發送函數,最后關閉發送中斷,一定要關閉發送中斷,不然就會一直反復進入發送中斷,退不出來;

/**
  * @brief UART1 TX Interrupt routine.
  * @param  None
  * @retval None
  */
 INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
 {
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
        UART1_SendData8('A');
        UART1_ITConfig(UART1_IT_TXE,DISABLE);
 }

  接收中斷只能使用UART1_IT_RXNE_OR,可以在串口初始化之后直接使能,因為只有在接收到數據才會進入中斷,這里和51單片機基本一致,

UART1_ITConfig(UART1_IT_RXNE_OR,ENABLE);

  接收中斷服務中,如果接收數據量比較大的,需要查詢超載溢出的對應標志,因為超載溢出也會觸發此中斷,一旦是溢出,就要軟件清除對應的標志位,取出接收到的數據使用UART1_ReceiveData8()函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM