問題1、
用戶使用STM32G473RET6芯片,開發(fā)環(huán)境STM32CubeMX+Keil(LL庫)。使用DMA1通道1,在半傳輸中斷和完全傳輸中斷里,拷貝ADC采集的數(shù)據(jù)。在應(yīng)用過程中發(fā)現(xiàn)DMA半傳輸中斷和完全傳輸中斷不能獨(dú)立使用。
具體體現(xiàn):
1、在DMA1初始化時(shí),打開了半傳輸中斷,關(guān)閉完全傳輸中斷,照樣能觸發(fā)完全傳輸中斷
LL_DMA_EnableIT_HT(DMA1,LL_DMA_CHANNEL_1);//打開DMA1半傳輸中斷
LL_DMA_DisableIT_TC(DMA1,LL_DMA_CHANNEL_1);//關(guān)閉DMA1完全傳輸中斷
2、在DMA1初始化時(shí),關(guān)閉了半傳輸中斷,打開完全傳輸中斷,照樣能觸發(fā)半傳輸中斷
LL_DMA_EnableIT_TC(DMA1,LL_DMA_CHANNEL_1);//打開DMA1完全傳輸中斷
LL_DMA_DisableIT_HC(DMA1,LL_DMA_CHANNEL_1);//關(guān)閉DMA1半傳輸中斷
這個(gè)問題很讓他很困惑,想知道怎么回事。
關(guān)于這個(gè)問題,我們在操作DMA相關(guān)的使能位或做相關(guān)傳輸長度配置時(shí),一定要注意他們往往要求在DMA通道未被使能的前提下進(jìn)行【具體閱讀芯片手冊】。現(xiàn)在的問題是,他想對DMA傳輸中斷使能位進(jìn)行改寫,依然也有這個(gè)前提。見下圖黃色高亮內(nèi)容,即當(dāng)相應(yīng)DMA通道被使能時(shí),是不接受對相應(yīng)DMA通道的傳輸完成和半完成中斷使能的改寫。
換言之,這里若要對相應(yīng)中斷使能位進(jìn)行改寫,得先將DMA通道使能位【EN位】進(jìn)行清零。使用LL庫的話就調(diào)用LL_DMA_DisableChannel()函數(shù)實(shí)現(xiàn),修改相應(yīng)中斷使能位之后再將DMA通道打開,即調(diào)用LL_DMA_EnableChannel()函數(shù)。
問題2、用戶使用STM32G431芯片,用到TIMER1的PWM功能,并啟用基于TIMER事件的DMA Burst傳輸實(shí)現(xiàn)4個(gè)比較通道寄存器的批量修改。使用CubeMx進(jìn)行配置。配置時(shí)發(fā)現(xiàn)一點(diǎn)疑惑,為什么外設(shè)端不需地址自增的勾選。
現(xiàn)在用戶的具體情況就是利用TIMER更新事件觸發(fā)DMA請求,每次更新事件觸發(fā)DMA將4個(gè)內(nèi)存數(shù)據(jù)轉(zhuǎn)發(fā)給定時(shí)器的4個(gè)CCR寄存器。
按照客戶的理解,在做DMA配置時(shí)這里的外設(shè)地址也應(yīng)該勾選自增才對,可事實(shí)發(fā)現(xiàn)不勾選才結(jié)果正常,若選擇外設(shè)地址自增了反而異常。
ST公司設(shè)計(jì)人員為了滿足DMA對TIMER寄存器批量訪問,還特別設(shè)計(jì)了2個(gè)寄存器,分別是TIMx_DCR和TIMx_DMAR。其中,DCR寄存器由DBL和DBA字段組成。
DBA:被訪問的第一個(gè)定時(shí)器寄存器相對于定時(shí)器地址映射表中的TIMx_CR1的地址偏移量【偏移量從0開始計(jì)算】。
DBL:每組批量訪問的寄存器個(gè)數(shù)【從0開始計(jì)算】。DMA訪問DMAR寄存器時(shí),按照如下算式得到絕對地址實(shí)現(xiàn)對寄存器的逐個(gè)訪問。(TIM2_CR1address) + (DBA + DMA?index)x 4。
對于定時(shí)器DMA BURST傳輸,外設(shè)地址就是TIM2_DMAR寄存器的地址。DMA根據(jù)上面地址算式實(shí)現(xiàn)對多個(gè)TIMER寄存器的訪問。TIM2_DMAR寄存器地址本身是固定的,無須增減,所以基于定時(shí)器事件DMA Burst模式配置外設(shè)時(shí)不要做地址自增勾選。
當(dāng)然,上面需求也可以基于非Burst模式來完成。假設(shè)還是基于4個(gè)內(nèi)存數(shù)據(jù)修改4個(gè)CCR寄存器,此時(shí)則需要4次定時(shí)器事件觸發(fā)DMA請求,做DMA配置時(shí)需要將內(nèi)存端和外設(shè)端都選擇地址自增模式。基于CubeMx的參考配置如下:
當(dāng)然,相應(yīng)API函數(shù)也跟Burst模式下的也不一樣【這里依然使用更新事件申請DMA】。 HAL_DMA_Start_IT(&hdma_tim1_up,(uint32_t)T1_CCRData, (uint32_t)&htim1.Instance->CCR1,4); 下面是兩種不同訪問模式下的示意圖,圖示可能更直觀些。
好,今天的分享就到這里,下次再聊。
審核編輯:湯梓紅
-
adc
+關(guān)注
關(guān)注
99文章
6606瀏覽量
547575 -
STM32
+關(guān)注
關(guān)注
2282文章
10983瀏覽量
360923 -
中斷
+關(guān)注
關(guān)注
5文章
902瀏覽量
42321 -
dma
+關(guān)注
關(guān)注
3文章
569瀏覽量
101939 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
286瀏覽量
15832
原文標(biāo)題:關(guān)于STM32 DMA傳輸?shù)膬蓚€(gè)問題釋疑
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
使用STM32自帶DMA傳輸數(shù)據(jù)
STM32 DMA應(yīng)用與性能分析
STM32定時(shí)器觸發(fā)DMA數(shù)據(jù)傳輸失敗的原因如何解決

STM32F429芯片帶FIFO的DMA傳輸實(shí)現(xiàn)過程

DMA通信編程與STM32串口中斷方式

STM32F1開發(fā)指南筆記32----DMA

STM32CubeMX-串口開啟DMA進(jìn)行數(shù)據(jù)傳輸

【DMA】淺談STM32F4xx的DMA(附初始化代碼)

STM32F10XXX使用DMA傳輸ADC轉(zhuǎn)換的數(shù)據(jù)
STM32U59 SPI DMA發(fā)送未產(chǎn)生傳輸完成中斷問題分析
DMA帶中斷的內(nèi)存到內(nèi)存傳輸

STM32F1的DMA使用

STM32的DMA的五大問題

評論