
有人使用STM32U575芯片的DAC功能。他希望使用TIMER事件触发DMA,并通过DMA传输内存数据到DAC输出寄存器,进而产生相应的DAC输出波形。可他不知如何配置DMA并实现期望的DAC输出,在ST公司提供的HAL库里也没有找到相关例程可以参考。 * j3 V$ M2 O$ `! ?$ k, O ![]() 我这里简单演示一下实现过程,分享出来给有需要的人参考。 我使用TIM3的更新事件触发DMA,每触发一次搬运一个数据到DAC数据寄存器。一共准备了200个数据,在定时器的触发下令DMA循环搬运,让DAC输出一系列正弦波。我使用的开发板是STM32U575 Nucleo板。通过CubeMx进行图形化配置,并基于STM32 HAL库组织代码。+ F! W3 V/ W; s6 V R2 q9 X6 R, C4 u5 w+ |' `1 Y& V) { 先看TIM3的配置,主要是要用它的更新事件,PWM输出不是必需的。 ![]() 下面是DAC1的基本配置。用到其通道1的对外输出,其它功能根据需要自行调整。" }1 i" P2 F5 z2 T4 a) Q! f# ~ 4 d; ` O' ^* i/ @! V0 |5 \% y ![]() % a0 r \8 G2 S9 Z4 T 基于TIM3的更新事件作为DMA请求触发源进行相关配置。DMA使用标准请求模式。源端是内存数据【数据定义为无符号32位】,目的端为DAC数据保持寄存器【访问宽度为32位】。DMA配置成Circular循环传输模式。 见下面的DMA配置截图【使用GPDMA Channel 8】: ![]() # \& v3 z+ }/ @! ?% R3 ^* I& B ![]() % I. \" E, o6 P; t" y# [ 配置完成后,创建初始化工程。添加如下必要的用户代码。主要是准备内存数据;开启DAC工作;调用DMA启动函数;使能TIM3更新事件的DMA触发功能;启动TIM3定时器。我把本人所用代码悉数贴出来,以供参考。至于通过CubeMx生成的初始化代码就没必要在这里贴出来了。 ! w! f' p" B( ?/ K! r3 s ![]() 验证输出结果。【下面截图中的蓝色部分是TIMER的PWM输出,没展开。】 / x& D4 \" a) U) s. m, D ![]() 整体上,要实现上述功能,首先DMA配置要正确;其次就是组织代码时要适当做些灵活调整;再就是那个DMA启动函数里的数据个数要按源端的数据宽度和传输数据个数换算成总的字节数,即一轮DMA传输的数据字节数。比方这里,源端数据宽度为字【即4字节宽度】,最后设置总的传输个数时是数据个数乘以4。关于这点在本公众号之前的其它文章里也特意讨论过。 x2 Y% t4 F' |; X * M. _' V, q9 | 上面演示的DMA应用,使用的是标准请求模式,如果使用链表模式也是可以的。有兴趣的话可以自行验证测试。关于DMA链表模式的配置,在本公众号的其它文章里也有介绍,记得也是基于STM32U5系列的。 ( ^5 a& p+ K$ ?1 c 转载自: 茶话MCU4 B* `! n+ m: a! G 如有侵权请联系删除/ V# }4 F9 K' Y # ~4 f- E- _* H, h6 F8 [ ; S+ P0 G2 Z, d |
STM32怎么选型
内存配置的艺术:STM32为嵌入式系统高端UI优化RAM和闪存的三大策略
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
STM32的DMA双缓冲模式详解
STM32U5 系列使用 LPBAM 进行功耗优化
基于STM32的心率计以DMA方式获取传感器数据经验分享
【STM32U545】实现CAN数据收发
基于STM32利用ADC+DMA采样显示经验分享
【经验分享】STM32使用DMA接收串口数据
感谢分享