你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的TIM+DMA+DAC应用示例

[复制链接]
eefishing 发布时间:2019-6-21 12:02
有人想使用STM32的TIMER及DMA,通过DAC实现指定的模拟输出,实现起来似乎不太顺畅。我这里借助于STM32F334Nucleo开发板,通过TIM6触发DMA传输,让DAC输出一路正弦波【半波】,做个简单示例,仅供参考。

9 w: X( c' ^% [/ P+ h  v
1、基本原理:TIM6的更新事件周期性的触发DMA;DMA将预备好的内存数据写入到DAC的输出数据寄存器;以实现DAC通道1输出一路半波正弦波信号。
2、初始配置:【使用STM32CubeMx图形化工具进行配置】
2.1 TIM6的配置,做基本时基参数配置即可,同时开启基于TIM6更新事件的DMA传输配置【circula 模式】

- g: e4 b% v; K$ j- D  g
1.jpg
2.jpg

+ o# X; k6 g4 z. {1 w0 b  c' l
3、完成上述配置后,生成含有初始化代码的工程。
4、添加用户代码。
4.1 准备用于DAC输出的数据。
我这里准备的数据基于如下正弦函数来做。准备好的数据放在数组TodisplayData【】里,供DMA取用。

! n5 J4 y; X1 k4 E: I* s; E; A. ^
3.jpg

* q/ ~% s0 F9 i6 Y- r9 U
#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};

5 r. I1 s6 ]3 h9 N
for (i=0;i<Step;i++)
{
TodisplayData=(uint16_t)(4000*sinf(StepAngel*i));
}

( d' _; b2 T4 T1 J4 l
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);
- E+ F8 S: r- E0 |
4.3使能TIM6的计数器计数。
  __HAL_TIM_ENABLE(&htim6);
4 M+ d6 _. ~, |6 E, g
4.4使能DAC通道1输出启动。
  HAL_DAC_Start(&hdac1,DAC_CHANNEL_1 );

4 v% `# v& C( o$ h  _: i# _2 C
4.5完成基于TIM6更新事件的DMA传输的相关配置,并开启该传输相关中断。
  HAL_DMA_Start_IT(&hdma_tim6_up,(uint32_t)TodisplayData, (uint32_t)&DAC1->DHR12R1 , Step*2-1);
# p6 \4 `. ^2 ]+ B$ ]/ e
5、验证结果。
我们可以通过示波器看到DAC通道1输出周期性的波形。我这里是借助MDK IDE自带的逻辑分析仪看到的结果,可以参考。如下图:
- ^  o4 L3 P+ _+ F& p2 o' q3 a( J
4.jpg
" R5 y( {& Y$ R$ ?
OK,到此也实现了预期的结果,其实整个过程也比较简单。
- |7 z" \) |) P. v0 S: Q
最后,稍微提醒两点:
1、对于DAC输出数据寄存器多说几句,以12位为例。

0 Y( W% @/ T0 z4 z1 s# z/ K
我们要写入的DAC数据输出寄存器是DAC_DHR12Rx或DAC_DHR12Lx,即数据保持寄存器,具体使用哪个看你选择的是左对齐还是右对齐数据格式。而真正体现在输出端所对应的输出数据寄存器是DORx寄存器,该寄存器是只读的,即不能被写入的。DAC_DHR寄存器的内容被加载到DOR寄存器,可能是自动完成,也可能需依靠触发事件激发完成。具体跟我们的配置有关。我们读取DAC通道实际输出的数据时应以DORx寄存器为准。

, _: q/ T* s, a# g/ i) d, P
2、关于DMA配置有个地方也提醒下。用cubeMx配置时选择的内存数据宽度【BYTE/HALF WORD/WORD]注意要跟你实际定义内存数组的数据类型一致。不要DMA配置时MEMORY宽度选择WORD,而在定义内存数组数据类型时使用HALF WORD(uint16)类型。这个地方很容易出错,还很隐蔽。特作提醒。

$ h' K# i' {! W- Y+ I9 A) y) N
收藏 评论1 发布时间:2019-6-21 12:02

举报

1个回答
虎三可可 回答时间:2019-10-30 16:23:26
我用H750芯片实现这个功能,发现DAC什么东西都不输出,配置也是按照你说的配的,请问这是问什么
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版