前言
使用串口接收不定長數(shù)據(jù)時,可以有多種方法,比如最常見的有額外使能一個定時器,在超過定時范圍未收到后續(xù)的字節(jié)時,認為此幀結(jié)束;或者利用 IDLE 中斷,當數(shù)據(jù)空閑時,自動產(chǎn)生中斷;亦或每接收到一個字節(jié)后都通過應(yīng)用程序進行一次處理。這次我們介紹另外一種方法,在 DMA 方式下利用硬件接收超時中斷(Receiver timeout interrupt)實現(xiàn)不定長數(shù)據(jù)的接收。
實現(xiàn)原理
首先,并非所有的 STM32 系列的 MCU,也并非所有的 USART/UART 外設(shè)都支持Receiver timeout (RTO)特性,具體的支持情況,可以通過對應(yīng)芯片的參考手冊去查詢。對于 MCU 的配置,可以通過 USART_RTOR 寄存器的 RTOEN 位使能接收超時功能,通過 RTO 位域配置超時時間,時間單位為傳輸一個數(shù)據(jù)位的時間(即波特率)。
應(yīng)用示例
HAL 庫已經(jīng)為我們提供了操作 RTO 相關(guān)的 API,應(yīng)用開發(fā)過程,我們直接調(diào)用即可。
總結(jié)
利用 RTO 方式接收不定長串口數(shù)據(jù),相比用定時器計時,可以節(jié)省一個硬件定時器資源,同時減少了定時器每次進入中斷處理的運行時間;相比 IDLE 的方式,可以更靈活的配置超時時間。但需注意的是,所選用的 MCU 以及所使用的 USART/UART 是否支持這個特性要確認好。