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()函數。