有人使用STM32U575芯片的DAC功能。他希望使用TIMER事件觸發(fā)DMA,并通過(guò)DMA傳輸內(nèi)存數(shù)據(jù)到DAC輸出寄存器,進(jìn)而產(chǎn)生相應(yīng)的DAC輸出波形??伤恢绾闻渲肈MA并實(shí)現(xiàn)期望的DAC輸出,在ST公司提供的HAL庫(kù)里也沒(méi)有找到相關(guān)例程可以參考。
我這里簡(jiǎn)單演示一下實(shí)現(xiàn)過(guò)程,分享出來(lái)給有需要的人參考。
我使用TIM3的更新事件觸發(fā)DMA,每觸發(fā)一次搬運(yùn)一個(gè)數(shù)據(jù)到DAC數(shù)據(jù)寄存器。一共準(zhǔn)備了200個(gè)數(shù)據(jù),在定時(shí)器的觸發(fā)下令DMA循環(huán)搬運(yùn),讓DAC輸出一系列正弦波。我使用的開(kāi)發(fā)板是STM32U575 Nucleo板。通過(guò)CubeMx進(jìn)行圖形化配置,并基于STM32HAL庫(kù)組織代碼。
先看TIM3的配置,主要是要用它的更新事件,PWM輸出不是必需的。
下面是DAC1的基本配置。用到其通道1的對(duì)外輸出,其它功能根據(jù)需要自行調(diào)整。
基于TIM3的更新事件作為DMA請(qǐng)求觸發(fā)源進(jìn)行相關(guān)配置。DMA使用標(biāo)準(zhǔn)請(qǐng)求模式。源端是內(nèi)存數(shù)據(jù)【數(shù)據(jù)定義為無(wú)符號(hào)32位】,目的端為DAC數(shù)據(jù)保持寄存器【訪(fǎng)問(wèn)寬度為32位】。DMA配置成Circular循環(huán)傳輸模式。 見(jiàn)下面的DMA配置截圖【使用GPDMA Channel 8】:
配置完成后,創(chuàng)建初始化工程。添加如下必要的用戶(hù)代碼。主要是準(zhǔn)備內(nèi)存數(shù)據(jù);開(kāi)啟DAC工作;調(diào)用DMA啟動(dòng)函數(shù);使能TIM3更新事件的DMA觸發(fā)功能;啟動(dòng)TIM3定時(shí)器。我把本人所用代碼悉數(shù)貼出來(lái),以供參考。至于通過(guò)CubeMx生成的初始化代碼就沒(méi)必要在這里貼出來(lái)了。
驗(yàn)證輸出結(jié)果?!鞠旅娼貓D中的藍(lán)色部分是TIMER的PWM輸出,沒(méi)展開(kāi)。】
整體上,要實(shí)現(xiàn)上述功能,首先DMA配置要正確;其次就是組織代碼時(shí)要適當(dāng)做些靈活調(diào)整;再就是那個(gè)DMA啟動(dòng)函數(shù)里的數(shù)據(jù)個(gè)數(shù)要按源端的數(shù)據(jù)寬度和傳輸數(shù)據(jù)個(gè)數(shù)換算成總的字節(jié)數(shù),即一輪DMA傳輸?shù)臄?shù)據(jù)字節(jié)數(shù)。比方這里,源端數(shù)據(jù)寬度為字【即4字節(jié)寬度】,最后設(shè)置總的傳輸個(gè)數(shù)時(shí)是數(shù)據(jù)個(gè)數(shù)乘以4。關(guān)于這點(diǎn)在本公眾號(hào)之前的其它文章里也特意討論過(guò)。
上面演示的DMA應(yīng)用,使用的是標(biāo)準(zhǔn)請(qǐng)求模式,如果使用鏈表模式也是可以的。有興趣的話(huà)可以自行驗(yàn)證測(cè)試。關(guān)于DMA鏈表模式的配置,在本公眾號(hào)的其它文章里也有介紹,記得也是基于STM32U5系列的。
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5358瀏覽量
120771 -
dac
+關(guān)注
關(guān)注
43文章
2303瀏覽量
191259 -
dma
+關(guān)注
關(guān)注
3文章
565瀏覽量
100733 -
HAL庫(kù)
+關(guān)注
關(guān)注
1文章
121瀏覽量
6336
原文標(biāo)題:STM32U5系列TIMER+DMA+DAC應(yīng)用演示
文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話(huà)MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論