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