有人使用STM32的定時器事件觸發DMA,讓其將內存數據傳輸到通信外設的數據寄存器進行發送,發現DMA根本就不動作。
比方以基于STM32F411的芯片為例,通過TIM3更新事件觸發DMA請求,DMA從內存將數據送到SPI1?的數據寄存器,從而完成數據發送。
他采用CubeMx進行配置。基本配置如下:[文中圖片可以放大觀看]
?
相關用戶實現代碼如下:
從配置過程和代碼實現來看,似乎都沒有問題。那DMA怎么就是不動作呢?
問題出在我們使用上面的函數做DMA傳輸所關聯源端和目標端時,出現了想當然的情況。
我們利用TIMER事件來作為DMA請求源時,而作為數據傳輸的源端或目的端,都是我們用戶指定的。這時就一定要注意源端和目標端是當前DMA流所支持的。否則就會出現亂點鴛鴦譜,DMA根本可能就跑不起來。就像你叫了某快遞公司,它的服務范圍是相對固定的,并非你想去哪里她就能服務到哪里。
比方上面的例子,如果改成SPI2就沒問題。為什么剛才SPI1不行呢,因為DMA1根本訪問不到SPI1,我們不妨看看基于STM32F411芯片的內部功能及總線框圖就很清晰了。
從上圖不難看出DMA1是訪問不到SPI1或SPI4這些外設的,或者說DMA1就沒法訪問掛在APB2總線上的外設,只能訪問APB1總線上的外設。
小結:一般來講,基于某觸發事件,對應的DMA數據流就可以確定下來了,那該DMA數據流的傳輸范圍往往也隨之確定。我們在為該DMA數據流指定源端和目標端時一定要符合其傳輸范圍,否則會出現傳輸無法完成的情形。換言之,我們在做DMA傳輸時,為了實現DMA的有效傳輸,往往需要結合源端和目的端來調整或選擇合適的DMA數據流。結合前面的比方,如果這家快遞公司到不了,我們換一家可能就輕松解決了。
-
STM32
+關注
關注
2270文章
10906瀏覽量
356530 -
定時器
+關注
關注
23文章
3251瀏覽量
114996 -
dma
+關注
關注
3文章
565瀏覽量
100661
原文標題:定時器觸發DMA數據傳輸失敗之案例
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論