
有人想使用STM32的TIMER及DMA,通过DAC实现指定的模拟输出,实现起来似乎不太顺畅。我这里借助于STM32F334Nucleo开发板,通过TIM6触发DMA传输,让DAC输出一路正弦波【半波】,做个简单示例,仅供参考。 . e8 @* \; A3 b$ \9 P3 J5 P 1、基本原理:TIM6的更新事件周期性的触发DMA;DMA将预备好的内存数据写入到DAC的输出数据寄存器;以实现DAC通道1输出一路半波正弦波信号。 2、初始配置:【使用STM32CubeMx图形化工具进行配置】 2.1 TIM6的配置,做基本时基参数配置即可,同时开启基于TIM6更新事件的DMA传输配置【circula 模式】 1 z: J2 {: F8 _2 c) ^9 A% _ ![]() ![]() ; D4 H' w% G+ G3 Q 3、完成上述配置后,生成含有初始化代码的工程。 4、添加用户代码。 4.1 准备用于DAC输出的数据。 我这里准备的数据基于如下正弦函数来做。准备好的数据放在数组TodisplayData【】里,供DMA取用。 ![]() #define Step (200) #define half_pai (3.141592/2) #define StepAngel (half_pai/Step) #define Size_Array (Step* 2) uint16_t TodisplayData[Size_Array] = {0}; for (i=0;i<Step;i++) { TodisplayData=(uint16_t)(4000*sinf(StepAngel*i)); } for (i=Step;i<Step*2;i++) { TodisplayData=(uint16_t)(4000*sinf(StepAngel*(Step*2-i))); } 4.2使能TIM6的基于更新事件的DMA请求。 __HAL_TIM_ENABLE_DMA(&htim6,TIM_DMA_UPDATE); 5 F6 b0 _8 U6 f. `9 A5 C6 X4.3使能TIM6的计数器计数。 __HAL_TIM_ENABLE(&htim6); 4.4使能DAC通道1输出启动。 HAL_DAC_Start(&hdac1,DAC_CHANNEL_1 ); $ x% ^1 q( u4 S; |2 U% d% M" k4.5完成基于TIM6更新事件的DMA传输的相关配置,并开启该传输相关中断。 HAL_DMA_Start_IT(&hdma_tim6_up,(uint32_t)TodisplayData, (uint32_t)&DAC1->DHR12R1 , Step*2-1); 5、验证结果。 我们可以通过示波器看到DAC通道1输出周期性的波形。我这里是借助MDK IDE自带的逻辑分析仪看到的结果,可以参考。如下图: ![]() ! P; m4 p3 W# D! G/ r OK,到此也实现了预期的结果,其实整个过程也比较简单。 0 P. b1 l- g" ~. A" J: C# q9 { 最后,稍微提醒两点: 1、对于DAC输出数据寄存器多说几句,以12位为例。 7 G, L6 ?. S( P5 P( \ 我们要写入的DAC数据输出寄存器是DAC_DHR12Rx或DAC_DHR12Lx,即数据保持寄存器,具体使用哪个看你选择的是左对齐还是右对齐数据格式。而真正体现在输出端所对应的输出数据寄存器是DORx寄存器,该寄存器是只读的,即不能被写入的。DAC_DHR寄存器的内容被加载到DOR寄存器,可能是自动完成,也可能需依靠触发事件激发完成。具体跟我们的配置有关。我们读取DAC通道实际输出的数据时应以DORx寄存器为准。 / K& W9 a% {' j0 u* p9 T, x* x 2、关于DMA配置有个地方也提醒下。用cubeMx配置时选择的内存数据宽度【BYTE/HALF WORD/WORD]注意要跟你实际定义内存数组的数据类型一致。不要DMA配置时MEMORY宽度选择WORD,而在定义内存数组数据类型时使用HALF WORD(uint16)类型。这个地方很容易出错,还很隐蔽。特作提醒。 8 X' H* p1 z, M6 D% @9 d |
我用H750芯片实现这个功能,发现DAC什么东西都不输出,配置也是按照你说的配的,请问这是问什么 |
MCSDK FOC应用详解
STM32F10xxx 正交编码器接口应用笔记 及源代码
基于STM32定时器ETR信号的应用示例
STM32 生态系统|基于STM32WB的低功耗蓝牙应用(一)
《无刷直流电机控制应用 基于STM8S系列单片机》
STM32定时器触发SPI逐字收发之应用示例
【银杏科技ARM+FPGA双核心应用】STM32H7系列10——ADC
【银杏科技ARM+FPGA双核心应用】STM32H7系列57——MDK_FLM
【STM32图书分享之九】—《STM32F 32位ARM微控制器应用设计与实践》
无刷直流电机控制应用+基于STM8S系列单片机---电子书