有人使用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系列的。
关键字:TIMER DMA DAC
引用地址:
STM32U5系列TIMER+DMA+DAC应用演示
推荐阅读最新更新时间:2024-11-02 16:03
串口DMA方式发送&接收
串口DMA方式收发 笔者使用的是STM32F407VET6,共包含6路串口,页尾处程序已将全部串口的DMA收发配置完成,本文仅以串口1为例进行讲解。(查看代码可直接跳至第二节或页尾处下载) 1 STM32F4 DMA 简介 DMA,全称为:Direct Memory Access,即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。 STM32F4 最多有 2 个 DMA 控制器(DMA1 和 DMA2),共 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用
[单片机]
stm32f4 DMA任意长度buffer无停顿传输
最近闲来无事,玩起了之前自己打的一块f407开发板,做一些VGA分辨率下的模式识别. 我的板上外扩有2兆的SRAM,之前一直用QVGA作图像源,算法能跑到15帧,还算不错. 我的方式是dcmi数据DMA到外扩SRAM,SRAM中处理,结果拷贝到LCD.改到VGA分辨率后问题来了. 图像错乱,但局部图像可以看出摄像头正确的输出 ,整个画面像一张位置错乱的拼图。 据此排除了摄像头输出格式的问题,那么很有可能是显示遮盖造成的。到底是什么原因呢? 几经排查,发现当我修改DMA的buffer size 时,画面会呈现截然不同的组合,难道是DMA的问题? 查阅资料才发现,自己之前对于buffer size的认识是错误的。在地址自增模式下,b
[单片机]
提高设计复用能力并降低开发成本,DAC呼吁制定IP复用标准
设计自动化会议(Design Automation Conference, DAC)的一个专门研究小组尝试确定交换芯片知识产权(IP)需要的数据模型。小组成员都认为需要IP复用标准,但是没有就达成目标的具体步骤获得一致。 三星公司的SoC R&D Center的高级研究经理Songjoo Yoo认为在目前45纳米及以下的工艺技术下SoC设计极为复杂,IP提供方和接受方之间的交换需要标准化的方法,这样能够提高设计复用能力,并降低开发成本。 ARM公司设计技术经理John Goodenough认为复杂的SoC需要来自各方的IP,AMBA或者OCP互联接口等IP互用性标准在体系结构层级提供帮助,降低总体系统验证工作。ARM支持IP-
[焦点新闻]
STM32的DAC加TIMER应用演示
现在有如下图所示的这样一个需求,希望使用 STM32 芯片 来实现。 横轴表示时间,纵轴表示电压【3.3v为限】,不同时刻的电压输出不一样、持续时间也不尽相同。 此问题源于某高校STM32学习时的习题,这里拿出来一起交流探讨下。方法不是唯一的,尤其基于不同STM32系列。这里尽量使用通用、常规的方法,算是抛砖引玉。 显然,我们可以考虑使用STM32的 DAC 加 TI MER以及片内其它资源加以实现。 对于这个实现我们可以分两种方式完成,每一种方式同时也体现不同难度。 我们可以考虑下面两种应用情形: 第一种方式: MCU 除了做这一件事外,还做点别的,比方做按键响应、 ADC 采样这些,整体上没有太复杂的功能和要求。【中断
[单片机]
002_89C52_Proteus_DAC0832_输出50HZ,正弦波,三角波,矩形波,锯齿波
电路图 (三)输出方波 (四)输出锯齿波 (五)输出三角波 (六)输出正玄波 (七)程序 1 #include absacc.h 2 #include reg52.h 3 4 #define DA0832 P2 5 #define DATA 57 //定时器延时 6 7 #define uchar unsigned char 8 #define uint unsigned int 9 10 sbit S1 = P1^0; 11 sbit S2 = P1^1; 12 //00锯齿波;01方波;10三角波;11正弦波 13 14 uchar code
[单片机]
【STM32】定时器TIM触发ADC采样,DMA搬运到内存
TIM+ADC+DMA原理 一般情况下,当我们需要进行采样的时候,需要用到ADC。例如:需要对某个信号进行定时采样(也就是隔一段时间,比如说2ms)。 本文提供的解决方案是:使用ADC的定时器触发ADC单次转换的功能,然后使用DMA进行数据的搬运! 这样只要设置好定时器的触发间隔,就能实现ADC定时采样转换的功能(即采样速率),然后可以在程序的死循环中一直检测DMA转换完成标志,然后进行数据的读取,或者使能DMA转换完成中断,这样每次转换完成就会产生中断。 主要需要解决的一个问题:定时器触发ADC采样,如何实现? 定时器触发ADC采样,是属于外部触发转换的一种方式。在《STM32中文参考手册》中,找到了关于这部分的
[单片机]
STM8L151 DAC
最近在做一个关于ADC采集的,同时使用DAC输出的项目,对于DAC输出0V电压做一下总结。 STM8L151中内嵌1个 Output Buffer其作用可以用来降低输出阻抗,可以在不添加外部运算放大器时直接驱动外部负载,通过 DAC_CHxCR1来控制其使能或失能。 我使用的是PB4 具体的配置代码如下: /******************************** RI_IOSwitch_13 --- PB6 RI_IOSwitch_14 --- PB5 RI_IOSwitch_15 --- PB4 配置DAC1 通道1 PB4 ********************************/ voi
[单片机]
了解R2R和电阻串DAC架构之间的差异
数模转换器均采用两种基本架构,您对其特性的了解将有助于为应用选择正确的转换器架构。 由于大多数工程师都在工程类院校专门学习过有关模数转换器(ADC)、运算放大器(Op Amp)、数模转换器(DAC)以及其他电子架构的课程,因此您可能会认为他们已理解了这些电路的所有基本功能。大多数人都对 ADC 的工作原理有了一个很好的了解,但是对 DAC 的工作原理却不太熟悉,它究竟有何功能呢? 同样,对于大多数人来说,DAC 只不过是一个输入端为数字信号数据而输出端为模拟信号数据的“黑匣子”。只有为数不多的人知道其在架构方面的区别,以及与 R2R梯形架构相比一个电阻串架构所具有的优点和缺点。了解他们之间的不同之处并了解这些通用
[模拟电子]