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

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

3天内不再提示

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

茶话MCU 来源:ST MCU 信息交流 2020-05-14 09:15 次阅读

STM32定时器应用中,我们有时希望基于某定时器事件同时对定时器的多个寄存器进行读写访问。为此,STM32芯片设计了专门应对定时器的多寄存器访问应用的DMA Burst传输。

高级定时器和部分通用定时器都支持针对定时器寄存器访问的BURST传输。所谓定时器的BURST传输,就是指当产生某定时器事件时,可以产生多个DMA请求,并触发多次DMA传输,访问多个定时器寄存器实现从内存到寄存器或从寄存器到内存的数据传输。这里的定时器事件可以是更新事件、比较匹配事件、换相事件以及触发事件。

我们知道,各定时器的所有寄存器都存放在片内某一固定地址开始的连续空间内。下图是我从STM32G4系列定时器地址分布图中截取的一部分,不同的定时器所拥有的寄存器个数可能有差异,但每个定时器的寄存器地址映射表的第一个寄存器一定是TIMx_CR1,所有寄存器在内存空间以字对齐的方式按顺序依次存放。【后面都以TIM2为例来说】

显然,我们在做定时器的DMA BURST传输时,除了配置基本的源地址、目的地址等DMA传输所需的通用配置信息外,还得告知DMA BURST传输模块每次传输时从哪个寄存器开始,连续访问几个寄存器,比方访问上图中圈出来的从TIMx_CCR1开始的连续4个寄存器。

这里有两个专门用于定时器BURST传输的寄存器,分别是TIM2_DCR和TIM2_DMAR. 其中TIM2_DCR就是用来配置从哪个定时器寄存器开始访问、连续访问几个寄存器的问题。【下面截图来自STM32G4参考手册】

DBA:被访问的第一个定时器寄存器相对于定时器地址映射表中的TIMx_CR1的地址偏移量【偏移量从0开始计算】。

DBL:每组BURST访问的寄存器个数【从0开始计算】。

仍然按照上面所说,访问从TIM2_CCR1开始的连续4个寄存器,可得知TIM2_CCR1位于寄存器地址映射表中的第14号位置,则DBA= 14-1;用于BURST分组访问的寄存器个数为4个,则DBL=4-1。

另外一个寄存器就是TIM2_DMAR。那它是干什么的呢?上面TIM2_DCR寄存器只是配置了被访问的首个定时器寄存器地址相对于TIMx_CR1的地址偏移量和每组要访问的寄存器个数。其中地址偏移量还只是个相对数,DMA访问最终是需要绝对地址的,而TIM2_DMAR就是来解决DMA访问时所需的绝对地址的。

DMA访问DMAR寄存器时,按照如下算式得到绝对地址实现对寄存器的逐个访问。(TIM2_CR1address) + (DBA + DMA index)x 4

[Index是DMA Burst访问时硬件自动生成的动态索引号,按0~DBL依次实现对多个寄存器的连续访问而完成BUSRT传输】

也就是说,对于定时器DMA BURST传输,外设地址一定是TIM2_DMAR寄存器的地址【或许是源地址,或许是目的地址】,DMA通过访问它,并根据上面算式实现对实际寄存器的访问。所以TIM2_DMAR寄存器又可称之为专门用于定时器DMA Burst传输的虚拟寄存器。

总的来讲,我们在做基于定时器的DMA BURST传输时,除了使用正确的DMAR寄存器地址作为外设地址外,再就是配置好DCR寄存器中的DBA与DBL参数,弄清从哪个寄存器开始访问,访问几个寄存器。其它配置环节跟通用DMA传输配置一样。

下面用个例子来演示相关用法。后面的验证基于STM32G474 Nucleo板。使用TIM2输出4路PWM,根据更新事件同步变化占空比,实现PWM占空比呈规律性的宽窄变化。即每次发生更新事件时,DMA到内存区取走4个对应于4个通道的比较寄存器的值赋给对应的比较寄存器[CCR1/CCR2/CCR3,CCR4],如下图所示,多组数据传输完毕后循环重来。

下面使用STM32CubeMx工具进行基本的初始化配置。

配置TIM2_CH1/CH2/CH3/CH4的PWM输出:

对定时器时基单元进行配置:

对TIM2更新事件的DMA传输做基本配置:

这里配置为循环模式,具体应用时可以根据具有应用来选择模式。将其它时钟、GPIO配置完毕后即可生成初始化工程文件。

在工程里添加用户应用代码。关于定时器BURST传输有专门的库函数可以给我们直接调用。它们分别是:

HAL_TIM_DMABurst_WriteStart() ----(1)

HAL_TIM_DMABurst_ReadStart() ----(2)

第一个函数用于将内存数据以DMA 分组模式写入寄存器的功能函数;

第二个用于将多个寄存器内容以DMA 分组模式读取到内存的功能函数;

不过呢,如果我们简单套用这两个函数有些时候可能出问题,或者遇到障碍。我们不妨一起来看看。

显然,我们要用到第一个函数。当我们进一步打开该函数时,发现它只是再调用了另外一个函数。

即它调用了HAL_TIM_DMABurst_MultiWriteStart()函数。这里就该函数用到的几个变量一起看下。

htim:即指向定时器结构体的地址,就不多说了。

BurstBaseAddress:前面提到过的第一个被访问寄存器的地址偏移量,即给到DCR寄存器中DBA的值。这里第一个被访问的是TIM2_CCR1,所在地址偏移量为13.

BurstRequestSrc:即触发DMA Burst传输的定时器事件源。这里是更新事件。

BurstBuffer:这个是存放数据的内存起始地址,如用户定义的数组地址。

BurstLength:就是前面提到的对应于DCR寄存器中DBL的值,即每组Burst传输的数据个数。具体到这里DBL应该是4-1,即3.

上面是固件里对该变量的定义。数据为什么这样定义,整整往左移了8位。看看上面DCR寄存器中DBL段所处位置就明白了。

最后看看紧随其后的另外一个数据量 ((BurstLength) >> 8U) + 1U;结合前面BurstLength的数据,该计算结果就是给到DMA的传输数据个数,数值等于每组 Burst传输的数据个数。具体到这里就是4。换言之,若我们将每组Burst传输的数据个数设为6,则这里的值就是6。这就意味着,如果按照该函数的现有用法,无论发生多少次Busrt传输只能用到一组数据。如果我希望在Burst传输中使用到多组不同数据【可能部分不同或全部不同】,就像上面示例所期望的那样,那怎么办呢?

这时我们可以基于现有库函数,在BURST传输需要用到多组不同数据时,直接使用

HAL_TIM_DMABurst_MultiWriteStart()函数并将其最后一个表示DMA传输长度的那个变量做适当修改。

比方在应用中每组BURST传输m个数据,一轮DMA传输过程中对应n个触发事件,在不同的触发时刻,每组传输的数据内容并不全部相同,这时总的DMA传输数据个数就是m*n。具体到这里,我要用到11组不同的数据,每组传输4个数据,即一轮DMA传输用到4*11个数据。

好,到此基本介绍和分析都差不多了,再看看具体用户代码。代码很简单,基于STM32HAL库的。

下面是用来调整不同时刻各个通道PWM占空比的内存数据,共11组。

要添加的用户参考代码都在下面,几行代码,应该说明白如画。主要是那个关于定时器DMA分组传输的那个函数,上面也已经详细解释了。

最后看看运行后的演示结果。

示波器只接了2个通通,目的就是演示同时修改4个通道的占空比,实现pwm占空比由窄到宽的规律性变化。

到此,关于定时器DMA Burst传输的介绍及示例就聊到这里。稍事小结:

1、从定时器DMA Burst传输原理的理解上讲,稍显小复杂。需要我们对定时器相关原理和DMA基础知识有较好的了解。在阅读STM32参考手册相关章节时,除了看正文部分外,还需细看TIMx_DMAR和TIMx_DCR寄存器的描述。但从实现代码角度看,使用CubeMx和固件库,其功能代码还是很简单的,将相关变量值对应地填进去即可。

2、STM32固件库的有些例程或函数侧重点在演示相应的功能或特性,但它不能包罗万象或保证适用于任何场景。有时我们可以在基于现有函数的前提下适当地做些改写调整,甚至完全重写代码以满足实际需求。

3、在做定时器DMA Burst传输时,用来被成组访问的定时器寄存器应该是同一定时器的而且是地址连续的寄存器,不可跳跃访问。

4、上面的示例只是个示范,旨在了解该功能的用法和基本特性。实际应用中,往往还要涉及更多细节,比方各个定时器事件的特性、寄存器的预装功能的开或关、DMA相关知识等,最终结合实际需求加以灵活运用。

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

    关注

    31

    文章

    5317

    浏览量

    120006
  • STM32
    +关注

    关注

    2266

    文章

    10871

    浏览量

    354796
  • 定时器
    +关注

    关注

    23

    文章

    3237

    浏览量

    114467

原文标题:STM32定时器BURST传输介绍及示例

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    定时器的工作方式介绍

    定时器是计算机和嵌入式系统中常见的一种硬件模块,用于实现定时和计数功能。定时器的工作方式通常由一组寄存来控制,这些寄存定义了
    的头像 发表于 07-12 10:29 729次阅读

    STM32G4系列芯片定时器的延时输出问题

    有人使用STM32G4系列芯片内部的多个定时器做PWM输出,输出频率一样,占空比也一样,均为50%。可是,当他中途调整各个定时器以相同的工作参数,即改变ARR的值和CCR值后,会发现TIM2和TIM5两个
    的头像 发表于 07-01 09:45 1433次阅读
    <b class='flag-5'>STM32</b>G4系列芯片<b class='flag-5'>定时器</b>的延时输出问题

    如何实现一个软件定时器

    在Linux,uC/OS,FreeRTOS等操作系统中,都带有软件定时器,原理大同小异。典型的实现方法是:通过一个硬件定时器产生固定的时钟节拍,每次硬件定时器中断到,就对一个全局的时间标记加一,每个软件
    的头像 发表于 04-29 11:00 580次阅读

    s7200定时器的五种故障介绍

    定时器或CPU故障:如果定时器本身或PLC的CPU出现故障,也可能导致定时器无法复位。此时,需要检查定时器和CPU的工作状态,确保其正常运行。
    的头像 发表于 04-03 17:08 2191次阅读

    ​PLC定时器介绍

    定时器是PLC中重要的编程元件,是累计时间增量的内部器件。大部分自动控制领域都需要定时器进行延时控制,灵活地使用定时器可以编制出复杂的控制程序。
    发表于 03-22 12:36 2185次阅读
    ​PLC<b class='flag-5'>定时器</b><b class='flag-5'>介绍</b>

    如果STM32定时器外接了正交编码,该剩余通道是否能做PWM输出呢?

    其实,对于STM32芯片,编码输入信号就是定时器的计数时钟源之一。定时器外接了编码输入,若还有剩余通道的话,剩余通道依然可以实现输入捕获或输出比较功能。
    的头像 发表于 03-21 09:06 1426次阅读
    如果<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>外接了正交编码<b class='flag-5'>器</b>,该剩余通道是否能做PWM输出呢?

    使用555定时器的可调双定时器电路

    定时器 IC 555 是最通用和最常用的 IC 之一,因为它的应用范围更广,如 PWM放大器、延迟定时器、开关电路、占空比选择、时钟脉冲发生等。这也可用于各种应用,如精确
    的头像 发表于 02-25 15:16 2011次阅读
    使用555<b class='flag-5'>定时器</b>的可调双<b class='flag-5'>定时器</b>电路

    555定时器的基本功能 555定时器的工作原理及其应用

    555定时器是一种非常常见和常用的集成电路,它具有广泛的应用领域,例如计时、频率分频、脉冲宽度调制等。本文将详细介绍555定时器的基本功能、工作原理以及应用。 一、555定时器的基本功
    的头像 发表于 01-18 11:12 1.4w次阅读

    AWTK 开源串口屏开发(6) - 定时器的用法

    定时器是个常用的功能,AWTK串口屏提供了丰富的定时器函数,用于定时器的启动、停止、暂停、恢复、修改和重置等功能,本文以计时的例子来介绍
    的头像 发表于 01-13 08:24 539次阅读
    AWTK 开源串口屏开发(6) - <b class='flag-5'>定时器</b>的用法

    单片机定时器的用法

    本章以CW32通用定时器为例介绍单片机定时器的用法。
    的头像 发表于 01-04 10:37 1345次阅读
    单片机<b class='flag-5'>定时器</b>的用法

    定时器会阻塞线程吗 定时器指令有哪几种

    定时器会阻塞线程吗 定时器指令有哪几种  定时器一般不会阻塞线程,但具体是否会阻塞取决于所使用的定时器实现方式和使用方式。 定时器指令可以分
    的头像 发表于 12-19 14:03 892次阅读

    STM32定时器时间计算方法

    详细介绍STM32定时器时间计算方法。 STM32定时器基本结构 STM32
    的头像 发表于 12-19 11:31 1.1w次阅读

    stm32一个定时器能同时控制两个灯以不同频率闪烁吗?

    STM32定时器功能强大,**STM32定时器可以同时控制两个灯以不同频率闪烁** 。
    的头像 发表于 12-13 10:43 2002次阅读

    简述STM32定时器的计数模式

    STM32的向上计数模式是指定时器的计数从0开始计数,直到达到自动加载值(TIMx_ARR),然后重新从0开始计数,并产生一个计数溢出事件。
    的头像 发表于 12-13 10:09 4771次阅读

    基于STM32CUBEMX驱动低压步进电机驱动STSPIN220(3)----定时器中断产生指定数量脉冲

    在步进电机控制过程中,为了实现精确的位置和速度控制,经常需要输出指定数量的脉冲。这就需要使用定时器功能来生成PWM脉冲信号。本文将详细介绍如何利用STM32CUBEMX配置定时器以输出
    的头像 发表于 12-01 15:26 1157次阅读
    基于<b class='flag-5'>STM32</b>CUBEMX驱动低压步进<b class='flag-5'>器</b>电机驱动<b class='flag-5'>器</b>STSPIN220(3)----<b class='flag-5'>定时器</b>中断产生指定数量脉冲