有人使用STM32的定時器事件觸發(fā)DMA,讓其將內(nèi)存數(shù)據(jù)傳輸?shù)?a href="http://www.3532n.com/v/tag/1301/" target="_blank">通信外設(shè)的數(shù)據(jù)寄存器進行發(fā)送,發(fā)現(xiàn)DMA根本就不動作。
比方以基于STM32F411的芯片為例,通過TIM3更新事件觸發(fā)DMA請求,DMA從內(nèi)存將數(shù)據(jù)送到SPI1?的數(shù)據(jù)寄存器,從而完成數(shù)據(jù)發(fā)送。
他采用CubeMx進行配置。基本配置如下:[文中圖片可以放大觀看]


?
相關(guān)用戶實現(xiàn)代碼如下:

從配置過程和代碼實現(xiàn)來看,似乎都沒有問題。那DMA怎么就是不動作呢?
問題出在我們使用上面的函數(shù)做DMA傳輸所關(guān)聯(lián)源端和目標(biāo)端時,出現(xiàn)了想當(dāng)然的情況。
我們利用TIMER事件來作為DMA請求源時,而作為數(shù)據(jù)傳輸?shù)脑炊嘶蚰康亩耍际俏覀冇脩糁付ǖ摹_@時就一定要注意源端和目標(biāo)端是當(dāng)前DMA流所支持的。否則就會出現(xiàn)亂點鴛鴦譜,DMA根本可能就跑不起來。就像你叫了某快遞公司,它的服務(wù)范圍是相對固定的,并非你想去哪里她就能服務(wù)到哪里。
比方上面的例子,如果改成SPI2就沒問題。為什么剛才SPI1不行呢,因為DMA1根本訪問不到SPI1,我們不妨看看基于STM32F411芯片的內(nèi)部功能及總線框圖就很清晰了。

從上圖不難看出DMA1是訪問不到SPI1或SPI4這些外設(shè)的,或者說DMA1就沒法訪問掛在APB2總線上的外設(shè),只能訪問APB1總線上的外設(shè)。
小結(jié):一般來講,基于某觸發(fā)事件,對應(yīng)的DMA數(shù)據(jù)流就可以確定下來了,那該DMA數(shù)據(jù)流的傳輸范圍往往也隨之確定。我們在為該DMA數(shù)據(jù)流指定源端和目標(biāo)端時一定要符合其傳輸范圍,否則會出現(xiàn)傳輸無法完成的情形。換言之,我們在做DMA傳輸時,為了實現(xiàn)DMA的有效傳輸,往往需要結(jié)合源端和目的端來調(diào)整或選擇合適的DMA數(shù)據(jù)流。結(jié)合前面的比方,如果這家快遞公司到不了,我們換一家可能就輕松解決了。
-
STM32
+關(guān)注
關(guān)注
2309文章
11162瀏覽量
373399 -
定時器
+關(guān)注
關(guān)注
23文章
3368瀏覽量
123575 -
dma
+關(guān)注
關(guān)注
3文章
582瀏覽量
105916
原文標(biāo)題:定時器觸發(fā)DMA數(shù)據(jù)傳輸失敗之案例
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
STM32通過DMA方式傳輸TIM3定時器計數(shù)值,數(shù)值重復(fù)是為什么?
STM32F103定時器觸發(fā)ADC+DMA傳輸 精選資料分享
stm32 定時器觸發(fā)ADC多通道采樣+DMA提取數(shù)據(jù)相關(guān)資料下載
stm32數(shù)據(jù)傳輸的相關(guān)資料分享
DMA進行數(shù)據(jù)傳輸和CPU進行數(shù)據(jù)傳輸的疑問
DMA數(shù)據(jù)傳輸(源代碼分享)
DMA數(shù)據(jù)傳輸在SPEAR300實現(xiàn)高速串口驅(qū)動設(shè)計
測試代碼中使用DMA傳輸,定時器觸發(fā)ADC
STM32CUBEMX配置教程(十二)STM32的定時器觸發(fā)的固定頻率ADC采樣(使用DMA)
STM32CUBEMX配置教程(十三)STM32的定時器觸發(fā)的固定頻率DAC輸出(使用DMA)
STM32F103定時器觸發(fā)ADC+DMA傳輸
H743定時器觸發(fā)ADC轉(zhuǎn)換DMA傳輸之應(yīng)用
stm32 定時器觸發(fā)ADC多通道采樣+DMA提取數(shù)據(jù)
stm32數(shù)據(jù)傳輸
STM32定時器觸發(fā)DMA數(shù)據(jù)傳輸失敗的原因如何解決
評論