0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

定时器DMA Burst传输无法实现

麦辣鸡腿堡 来源:茶话MCU 作者:茶话MCU 2023-06-21 16:21 次阅读

有人使用STM32F4系列开发产品,程序运行过程中需要不时地对外输出一串驱动脉冲,并要求这几串脉冲的频率可变、占空比固定。他想到使用基于STM32定时器DMA

BURST传输。具体点说,他期望不时地通过TIM3的CH1输出一串频率可变、占空比固定的脉冲然后停下来。这个思路在原理上是没问题的,可是他在测试过程中发现怎么也折腾不出预期的效果。

他目前使用的芯片是STM32F401,虽有点老旧,但我查看了手册,确认该芯片的TIM3是支持基于TIMER事件实现TIME寄存器与内存间的DMABURST传输的。即每个TIMER事件可以申请多个DMA请求从而实现定时器寄存器与内存间的批量数据传输。要知某个STM32
TIMER是否支持上述功能,只需查看STM32参考手册的相关定时器的寄存器中有无TIMx_DCR和TIMx_DMAR寄存器的介绍。

图片

既然支持,为什么实现不了呢?关于这个功能我们还需要注意几点:

1、所选择的TIMER必须支持基于定时器事件的DMA BURST传输功能。

2、触发事件必须是来自参与DMA传输的定时器事件,不能是别的定时器事件。比方说你想实现TIM1的寄存器与内存间的DMA

BURST传输,触发事件不能是来自TIM2、TIM3这些非TIM1的事件。

3、定时器DMA

Burst传输时,用来被BURST访问的定时器寄存器应该是同一定时器的而且是地址连续的寄存器,不可跳跃访问。比方说像下面某TIMER的4个比较寄存器物理地址是安排在一起的,而CH2恰好因为某些原因没有被用上。

图片

如果你仅对CH1/CH3/CH4三个通道的比较寄存器的值做BURST访问,此时尽管CH2没有被用上,BURST访问的传输个数应该是4而不是3。

4、STM32

HAL库里的例程或函数重点在演示相应的功能或特性,但它不能包罗万象或保证适用于任何场景。有些时候我们可能需要在现有库函数的前提下适当地做些调整来满足需求。

结合这几点,我们一起排查下。第1点、第2点已经核对过了,没问题。看看第3点,即设置BURST传输个数。下图是F40x系列TIM2~TIM5的内存地址映射图。

图片

现在使用者真正需要用到的寄存器只有TIM3-》ARR和TIM3-》CCR1两个寄存器,但二者中间还有个预留空位【其它高级定时器的RCR寄存器的位置】也必须算进来,即这里BURST传输个数应该是3而不是2。

再看看上面提到的第4点要注意的地方。这点我就不过多解释了,ST提供的HAL库例程及相关函数只能实现1次BURST传输的功能,如果要实现多次BURST传输就得在其代码基础上做些调整,更多细节可以参考我之前分享的那篇《STM32定时器BURST传输介绍及示例》。不过,在那篇的演示例程里我使用的是DMA

Circular模式,现在的用户则要使用DMA

Normal模式。采用Normal模式和采用Circular模式基于现有HAL库函数组织代码还略有差异,若没处理好这点小差异,可能让你完全出不来想要的结果。

下面我使用STM32G4芯片的TIM3-CH1演示上面用户的功能。每次输出5个脉冲,3次输出为一个循环,同一循环中的3次输出的频率各不相同,占空比一样。【为什么没用STM32F401芯片,是因为此时手上没有带该芯片的开发板。不过演示功能的配置及代码基本一样。】

我使用CubeMx对TIM3进行配置,参考配置如下:

图片

开启TIM3基于更新事件的DMA传输功能并做相关配置。

图片

配置完成,生成初始化工程,添加用户代码。

我准备了3串脉冲的ARR/CCR1的值,分别以数组PulseData1[]、PulseData2[]、PulseData3[]来存放,占空比都设置为50%。显然数组行中间的0值用于前面提到过的预留字,此处无实际作用。另外,每个数组中的第6行数据其实是关闭当前通道PWM输出,具体应用时注意结合所选择的PWM模式及极性选择。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2264

    文章

    10852

    浏览量

    354100
  • 控制
    +关注

    关注

    4

    文章

    1010

    浏览量

    122581
收藏 人收藏

    评论

    相关推荐

    STM32通过DMA方式传输TIM3定时器计数值,数值重复是为什么?

    4.TIM1更新事件频率 更新事件频率由16khz改为10k/5k,或者重复计数由1改为2 结果反馈,TIM3计数数值重复 5.其他定时器计数值 DMA触发方式为TIM1更新
    发表于 04-10 06:50

    TIMx“DMA Burst Feature”如何通过SPI触发多个DMA请求?

    ,因为 SPI 外设最多支持 16 位传输。不过,我还没有看到有人使用 Timer DMA-burst 功能。我想使用计时来触发 DMA/SPI
    发表于 02-07 08:23

    STM32F030的定时器PWM使用设置与ADC的dma代码

    里面是STM32F030的定时器PWM使用设置与ADC的dma代码
    发表于 03-21 15:29 152次下载

    STM32定时器触发DMA数据传输失败的原因如何解决

    有人使用STM32的定时器事件触发DMA,让其将内存数据传输到通信外设的数据寄存进行发送,发现DMA根本就不动作。
    的头像 发表于 11-25 09:21 2.1w次阅读
    STM32<b class='flag-5'>定时器</b>触发<b class='flag-5'>DMA</b>数据<b class='flag-5'>传输</b>失败的原因如何解决

    STM32定时器BURST传输介绍及示例

    这里有两个专门用于定时器BURST传输的寄存,分别是TIM2_DCR和TIM2_DMAR. 其中TIM2_DCR就是用来配置从哪个定时器
    的头像 发表于 05-14 09:15 1.2w次阅读
    STM32<b class='flag-5'>定时器</b><b class='flag-5'>BURST</b><b class='flag-5'>传输</b>介绍及示例

    测试代码中使用DMA传输定时器触发ADC

    现在共用到ADC1模块的4个ADC通道,即1个片内Vrefint通道和其它三个外部通道CH8,CH10,CH17。下面测试代码中使用DMA传输定时器触发ADC.
    的头像 发表于 08-10 16:22 4407次阅读
    测试代码中使用<b class='flag-5'>DMA</b><b class='flag-5'>传输</b>,<b class='flag-5'>定时器</b>触发ADC

    STM32CUBEMX配置教程(十二)STM32的定时器触发的固定频率ADC采样(使用DMA

    STM32CUBEMX配置教程(十二)STM32的定时器触发的固定频率ADC采样(使用DMA
    发表于 11-24 13:51 85次下载
    STM32CUBEMX配置教程(十二)STM32的<b class='flag-5'>定时器</b>触发的固定频率ADC采样(使用<b class='flag-5'>DMA</b>)

    STM32CUBEMX配置教程(十三)STM32的定时器触发的固定频率DAC输出(使用DMA

    STM32CUBEMX配置教程(十三)STM32的定时器触发的固定频率DAC输出(使用DMA
    发表于 11-24 14:06 46次下载
    STM32CUBEMX配置教程(十三)STM32的<b class='flag-5'>定时器</b>触发的固定频率DAC输出(使用<b class='flag-5'>DMA</b>)

    STM32F103定时器触发ADC+DMA传输

    STM32F103定时器触发ADC+DMA传输ADC除了软件触发方式之外还有外部触发模式,我用TIM2定时器触发ADC,并用DMA
    发表于 11-30 10:36 55次下载
    STM32F103<b class='flag-5'>定时器</b>触发ADC+<b class='flag-5'>DMA</b><b class='flag-5'>传输</b>

    H743定时器触发ADC转换DMA传输之应用

    学习安富莱的H743的定时器触发ADC DMA传输源码
    发表于 11-30 11:21 11次下载
    H743<b class='flag-5'>定时器</b>触发ADC转换<b class='flag-5'>DMA</b><b class='flag-5'>传输</b>之应用

    stm32 定时器触发ADC多通道采样+DMA提取数据

    stm32g0 定时器触发ADC多通道采样+DMA提取数据stm32g0 定时器触发ADC多通道采样+DMA提取数据stm32g0 单片机对三相电流采样,用
    发表于 12-16 16:56 68次下载
    stm32 <b class='flag-5'>定时器</b>触发ADC多通道采样+<b class='flag-5'>DMA</b>提取数据

    使用MM32F0270 定时器DMA方式输出PWM

    使用MM32F0270 定时器DMA方式输出PWM
    的头像 发表于 10-17 14:47 793次阅读
    使用MM32F0270 <b class='flag-5'>定时器</b><b class='flag-5'>DMA</b>方式输出PWM

    运用 DMA 功能实现高级定时器和 ADC 的同步触发采样

    运用DMA功能实现高级定时器和ADC的同步触发采样在做BLDC电机控制时,需要ADC的采样时刻和定时器产生的PWM波形相配合,才能获取准确的采样值,本文介绍了CW32F030系列芯片通
    发表于 06-06 13:35 31次下载

    定时器设计实现

    返回ITimer类型的共享指针。其中ITimer类中定义了start和stop方法,用于启动或停止当前定时器。 TimerManager还有一个内部类TimerMessageQueue用于实现
    的头像 发表于 11-08 16:50 550次阅读

    CW32使用DMA单通道、定时器触发ADC实现了多路AD采集

    本测试样例基于CW32F030C8T6MCU,使用DMA单通道、定时器触发ADC实现了12路AD采集。
    的头像 发表于 05-24 09:29 759次阅读
    CW32使用<b class='flag-5'>DMA</b>单通道、<b class='flag-5'>定时器</b>触发ADC<b class='flag-5'>实现</b>了多路AD采集