工作中經常會遇到串列埠通訊,並對互動的資料進行處理。經常用到的是通過不停的產生串列埠接收中斷,然後對資料做處理。,這樣做的弊端就是,不停的會產生串列埠接受中斷。中斷請求不但使cpu停下來,而且要cpu執行中斷服務程式為中斷請求服務,這個請求包括了對斷點和現場的處理以及cpu與外設的傳送,所以cpu付出了很多的代價。後面就可以採用dma接收資料,這樣串列埠就可以不需要每次接收到乙個位元組的資料就進入中斷,影響主程式執行。當dma接收到的資料達到定長時就會產生dma中斷,因此也就帶來了乙個弊端,就是如果需要接受不定長的資料怎麼處理,這時候就需要dma+串列埠空閒中斷。 「這兩個資源配合,簡直就是天衣無縫啊,無論接收什麼不定長的資料,管你資料有多少,來乙個我就收乙個,就像廣東人吃「山竹」,來乙個吃乙個~(最近風好大,我好怕)」 綜上dma配合串列埠有以下幾種運用和注意事項:
dma不通過串列埠中斷接受資料,而是採用普通的串列埠接受資料的方式接受串列埠資料,當產生dma中斷時代表傳輸完成開始對資料進行處理。
dma接受不定長資料,採用dma+串列埠空閒中斷的方式,達到無論接收什麼不定長的資料,管你資料有多少,來乙個我就收乙個的效果。
串列埠dma資料傳送
串列埠dma資料傳送和接收
主要理解前兩種運用即可。
注意事項:
stm32的idle的中斷在串列埠無資料接收的情況下,是不會一直產生的,產生的條件是這樣的,當清除idle標誌位後,必須有接收到第乙個資料後,才開始觸發,一斷接收的資料斷流,沒有接收到資料,即產生idle中斷。如果中斷傳送資料幀的速率很快,mcu來不及處理此次接收到的資料,中斷又發來資料的話,這裡不能開啟,否則資料會被覆蓋。有兩種方式解決:
1.在重新開啟接收dma通道之前,將rx_buf緩衝區裡面的資料複製到另外乙個陣列中,然後馬上處理複製出來的資料,然後再開啟dma,(實現比較簡單)
2.建立雙緩衝,重新配置dma_memorybaseaddr的緩衝區位址,那麼下次接收到的資料就會儲存到新的緩衝區中,不至於被覆蓋(暫時沒有細究這個是如何實現的)
stm32 串列埠接受不定長資料方法(3種)
方法1 串列埠接受資料,定時器來判斷超時是否接受資料完成。方法2 dma接受 idle中斷 實現思路 採用stm32f103的串列埠1,並配置成空閒中斷idle模式且使能dma接收,並同時設定接收緩衝區和初始化dma。那麼初始化完成之後,當外部給微控制器傳送資料的時候,假設這幀資料長度是200個位元...
stm32串列埠接收不定長內容,不使用DMA
專案做到一半,碰到個尷尬問題 pwm使用的dma通道與串列埠接收的dma通道撞車了,咋辦?考慮一下,決定放棄idle中斷 dma的串列埠不定長資料接收方案,回到中斷接收去。中斷接收函式hal uart receive it函式是個定長接收函式,除非把接收長度設為1。由於我使用freertos系統,打...
STM8s 串列埠接收不定長資料
usart rtx typedef usart1 rtx void uart1 initial void interrupt handler tim4 upd ovf irqhandler,23 gpio writereverse gpioc,gpio pin 4 tim4 clearitpendi...