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