有人問過這個問題:
“用串口中斷接收比較好理解,只要接收緩存接收到數據,標志位就會置位,然后進入中斷服務程序讀取接收緩存中的數據,但是在發送時,應該是在數據發送出去之后發送標志位才會置位(我是msp430單片機),那么此時等數據發送出去之后進入中斷又有什么意義呢?到底如何通過串口中斷來發送數據呢?”
通過閱讀 STM32 官方庫的代碼,我找到了答案。
中斷發送方式的基本過程是:每發送一個字節,該字節發送完畢引發中斷,中斷處理程序再發送下一個字節……直到發送完成。
這里有兩個細節問題需要注意:
- 第一個字節是怎樣發送的?因為發第一個字節之前,並沒有發送字節完成所觸發的中斷,那第一個字節怎么被發送出去?這關系到中斷在硬件層面的觸發方式:如果是電平觸發的中斷,在中斷式發送函數中會使能相應的中斷,因為發送緩沖區為空,其所處的電平狀態就在中斷功能被使能后會直接觸發中斷,導致第一個字節在中斷處理函數中被發送出去;如果是電平跳變觸發的中斷,為了引發中斷,只好把第一個字節在中斷式發送函數中“手動”發送出去,由此引發一個中斷的“多米諾”效應,把后面的字節依次發送出去。參考:https://www.lpcware.com/content/forum/uart-tx-interrupt-should-i-put-least-one-byte-tx-fifo
- 怎么才算“完成”?完成是用參數指定的欲發送字節數決定的,但發送達到指定數目,中斷處理函數中就失能相應中斷,於是中斷的“多米諾”鏈條停止。