在MCU的應用中,經常需要通過串口進行不定長數據包的傳輸。發送方很簡單,不需特別的考慮,而接收方則需要能夠偵測到數據包的結束。接收方的簡單做法是結合串口的IDLE中斷,或使用DMA并利用DMA的超時傳輸機制。
但有些MCU在設計時出于成本上的考慮,簡化了串口接收的IDLE模式以及DMA超時傳輸機制。沒有串口IDLE中斷或者DMA超時傳輸的機制,我們就不知道什么時候通信結束了。這種情況下,為了實現通過串口傳輸不定長數據包的要求,需要使用軟件和其它片內外設的配合,協同完成指定的功能。
LPC54101系列的UART模塊,支持FIFO的接收超時,能夠方便地實現上述功能。除此之外,本文介紹一種基于LPC54101和SDK,通過使用引腳中斷和定時器配合,實現串口DMA接收超時,實現串口DMA接收超時的機制。
先分析下UART傳輸的時序,圖1是一個典型的8位數據位1位停止位的串口通信數據流。串口每次發送數據時會首先發送一個起始位,在TTL電平邏輯下,Start位首先是一個下降沿信號。
圖1. 串口接收數據時序圖
在串口DMA接收超時系統中,我們需要利用MCU的引腳中斷功能偵測這個下降沿信號,引腳中斷觸發后告訴系統開始計時。要特別注意的是,當系統偵測到Start位的下降沿后最好關閉引腳中斷,不然后續數據流等信號的下降沿也會觸發引腳中斷使得整套方案失去了意義(還不如直接用串口接收完成中斷)。
LPC54101的引腳中斷可以在任意IO引腳上使能,所以可以直接把LPC54101的串口接收的引腳的中斷功能打開,并設置成下降沿觸發。
超時計數器最好是系統里的低功耗定時器,這個例程中我們用的是LPC54101的RIT定時器。超時的時間設置要考慮到當前串口設置的波特率以及一次串口傳輸的最大包長。
超時定時器計數溢出產生中斷后,軟件首先要從DMA的狀態寄存器中獲取到當前接收到數據的長度(對于LPC54101來說,串口DMA接收數據的長度在XFERCFGn寄存器中的XFERCOUNT位,如圖2所示),然后從串口DMA預設置的數據緩沖區獲取對應的數據即可。
圖2. LPC54101 DMA傳輸數據長度計數位
在初始化設置串口對應的DMA通道時,最好設置傳輸長度為可能的最大長度,在接收超時后也別忘記重新復位一下串口對應DMA通道的狀態,不然本次接收的數據和數據長度還會帶入下次傳輸的過程中。
圖3是例程的流程圖,分主程序,串口RX引腳中斷服務程序,超時定時器服務程序三個部分。
圖3. 程序流程圖
-
mcu
+關注
關注
146文章
17144瀏覽量
351149 -
串口
+關注
關注
14文章
1554瀏覽量
76497
原文標題:在MCU中,如何實現串口的不定長數據包接收?
文章出處:【微信號:mcuworld,微信公眾號:嵌入式資訊精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論