• 66查看
  • 0回复

[芯片硬件] STM32U5系列TIMER+DMA+DAC应用演示

[复制链接]

该用户从未签到

发表于 27-4-2024 09:39:38 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


有人使用STM32U575芯片的DAC功能。他希望使用TIMER事件触发DMA,并通过DMA传输内存数据到DAC输出寄存器,进而产生相应的DAC输出波形。可他不知如何配置DMA并实现期望的DAC输出,在ST公司提供的HAL库里也没有找到相关例程可以参考。

STM32U5系列TIMER+DMA+DAC应用演示w2.jpg

我这里简单演示一下实现过程,分享出来给有需要的人参考。

我使用TIM3的更新事件触发DMA,每触发一次搬运一个数据到DAC数据寄存器。一共准备了200个数据,在定时器的触发下令DMA循环搬运,让DAC输出一系列正弦波。我使用的开发板是STM32U575 Nucleo板。通过CubeMx进行图形化配置,并基于STM32HAL库组织代码。

先看TIM3的配置,主要是要用它的更新事件,PWM输出不是必需的。

STM32U5系列TIMER+DMA+DAC应用演示w3.jpg

下面是DAC1的基本配置。用到其通道1的对外输出,其它功能根据需要自行调整。

STM32U5系列TIMER+DMA+DAC应用演示w4.jpg

基于TIM3的更新事件作为DMA请求触发源进行相关配置。DMA使用标准请求模式。源端是内存数据【数据定义为无符号32位】,目的端为DAC数据保持寄存器【访问宽度为32位】。DMA配置成Circular循环传输模式。见下面的DMA配置截图【使用GPDMA Channel 8】:

STM32U5系列TIMER+DMA+DAC应用演示w5.jpg

STM32U5系列TIMER+DMA+DAC应用演示w6.jpg

配置完成后,创建初始化工程。添加如下必要的用户代码。主要是准备内存数据;开启DAC工作;调用DMA启动函数;使能TIM3更新事件的DMA触发功能;启动TIM3定时器。我把本人所用代码悉数贴出来,以供参考。至于通过CubeMx生成的初始化代码就没必要在这里贴出来了。

STM32U5系列TIMER+DMA+DAC应用演示w7.jpg

验证输出结果。【下面截图中的蓝色部分是TIMER的PWM输出,没展开。】

STM32U5系列TIMER+DMA+DAC应用演示w8.jpg

整体上,要实现上述功能,首先DMA配置要正确;其次就是组织代码时要适当做些灵活调整;再就是那个DMA启动函数里的数据个数要按源端的数据宽度和传输数据个数换算成总的字节数,即一轮DMA传输的数据字节数。比方这里,源端数据宽度为字【即4字节宽度】,最后设置总的传输个数时是数据个数乘以4。关于这点在本公众号之前的其它文章里也特意讨论过。

上面演示的DMA应用,使用的是标准请求模式,如果使用链表模式也是可以的。有兴趣的话可以自行验证测试。关于DMA链表模式的配置,在本公众号的其它文章里也有介绍,记得也是基于STM32U5系列的。

OK,今天的分享演示就介绍到这里,供君参考。有问题的话可以后台留言。下次再聊,祝好~!

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 9-5-2024 04:01 , Processed in 0.238163 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.