有人使用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系列的。
社交应用程序ParlerCEO:禁令后所有供应商都放弃其公司
谈谈中国激光的技术升级之路
从入门到高手,电子工程师必备的15款工具!
《2019物联网行业100强》榜单新鲜出炉,SIMBOSS荣登100强
室外光缆冷接技术存在明显缺陷
STM32U5系列TIMER+DMA+DAC应用演示
阿甘精神加持 华米科技8月27日召开年度新品发布会
OpenHarmony C++公共基础类库应用案例:Thread
配置文档(ini文档)的应用
简单介绍一下什么是微波通讯?
中国最优秀的IC设计企业TOP100最新名单出炉!(含传感器10强企业)
关于PCB各层的含义你都知道吗
模式带宽在光纤测试中的用途
通信基站是否会对信号屏蔽器的效果造成影响
外资车企的未来布局:一场针对中国电池企业的争夺战
磁电式传感器结构示意图(转速转矩传感器结构原理图)
PCB设计领域的DRC和MRC之间有什么区别?
氮化镓用途和性质
中电科南京外延材料产业基地投产,一期投资19.3亿元
三星8个系列电视机通过TÜV莱茵"产品碳减排"核查