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