在STM32定时器应用中,我们有时希望根据某些定时器事件同时读写定时器的多个寄存器。为此,STM32芯片专门为定时器的多寄存器访问应用设计了DMA突发传输。
高级定时器和一些通用定时器都支持用于定时器寄存器访问的突发传输。所谓的定时器突发传输是指当定时器事件发生时,可以产生多个DMA请求,并触发多个DMA传输来访问多个定时器寄存器,从而实现从存储器到寄存器或从寄存器到存储器的数据传输。这里的定时器事件可以是更新事件、比较匹配事件、换向事件和触发事件。
我们知道每个定时器的所有寄存器都存储在从芯片上的固定地址开始的连续空间中。下图是STM32G4系列定时器地址分布图的一部分。不同定时器拥有的寄存器数量可能不同,但每个定时器的寄存器地址映射表中的第一个寄存器必须是TIMx_CR1,并且所有寄存器都以字对齐方式顺序存储在存储器空间中。稍后以[TIM2为例]
显然,当我们对定时器进行DMA突发传输时,除了配置DMA传输所需的基本源地址、目的地址和其他一般配置信息之外,我们还必须通知DMA突发传输模块,哪个寄存器从每次传输开始并连续访问几个寄存器,例如,从TIMx_CCR1开始访问上图中圈出的四个寄存器。
有两个寄存器专门用于定时器突发传输,即TIM2_DCR和TIM2_DMAR。TIM2_DCR用于配置要访问哪个定时器寄存器以及连续访问几个寄存器。[下面的截图来自STM32G4参考手册]
DBA:在定时器地址映射表中,第一个被访问的定时器寄存器相对于TIMx_CR1的地址偏移量[偏移量从0开始计算。
DBL:从0开始,每个突发组[访问的寄存器数量]。
仍然根据以上所述,通过从TIM2_CCR1开始访问四个连续的寄存器,可以知道TIM2_CCR1位于寄存器地址映射表中的第14个位置,然后DBA=14-1;如果用于突发包访问的寄存器数量是4,DBL=4-1。
另一个寄存器是TIM2_DMAR。它是做什么的?上述TIM2_DCR寄存器仅配置了要访问的第一个定时器寄存器地址相对于TIMx_CR1的地址偏移,以及每个组中要访问的寄存器数量。其中,地址偏移量只是一个相对数,DMA访问需要绝对地址,TIM2_DMAR是为了解决DMA访问时需要的绝对地址。
当DMA访问DMAR寄存器时,绝对地址是根据下面的公式获得的,以实现逐个寄存器的访问。(TIM2 _地址)(数据库存取内存索引)x 4
[索引是一个动态索引号,由硬件在DMA突发访问期间自动生成,从0到0的顺序实现对多个寄存器的连续访问~DBL完成BUSRT传输]
也就是说,对于定时器DMA突发传输,外围地址必须是TIM2_DMAR寄存器[的地址,也可能是源地址或目的地址],DMA访问它,并根据上述公式实现对实际寄存器的访问。因此,TIM2_DMAR寄存器也可以称为专用于定时器DMA突发传输的虚拟寄存器。
一般来说,当我们基于定时器进行DMA突发传输时,除了使用正确的DMAR寄存器地址作为外设地址之外,我们还在DCR寄存器中配置DBA和DBL参数,以找出哪个寄存器可以访问多个寄存器。其他配置链接与一般的DMA传输配置相同。
以下是演示相关用法的示例。以下验证基于STM32G474核仁板。TIM2用于输出4路脉宽调制,占空比根据更新事件同步变化,脉宽调制占空比有规律的宽度变化。也就是说,每当发生更新事件时,DMA从存储区中取出对应于4个通道的4个比较寄存器的值,并将它们分配给对应的比较寄存器[CCR1/CCR2/CCR3,CCR4]。如下图所示,传输后将回收多组数据。
以下是使用STM32CubeMx工具的基本初始化配置。
为TIM2_CH1/CH2/CH3/CH4配置脉宽调制输出:
要配置计时器时基装置:
对TIM2更新事件的DMA传输进行基本配置:
这被配置为循环模式,并且可以根据应用选择模式。在配置了其他时钟和GPIO之后,可以生成初始化工程文件。
向项目中添加用户应用程序代码。定时器突发传输有特殊的库函数可以直接调用。它们是:
HAL _ TIM _ DMaBurst _ WriteStart()-(1)
HAL _ TIM _ DMaBurst _ ReadStart()-(2)
第一个函数用于在DMA分组模式下将存储器数据写入寄存器。
第二功能,用于以码分多址分组模式将多个寄存器的内容读入存储器;
然而,如果我们简单地应用这两个函数,可能会有问题或障碍。我们不妨一起看一看。
显然,我们需要使用第一个函数。当我们进一步打开函数时,我们发现它只是调用了另一个函数。
也就是说,它调用Hal _ Tim _ DMA burst _ multi write start()函数。让我们看看这个函数中使用的几个变量。
Htim:指的是定时器结构的地址,所以我就不多说了。
BurstBaseAddress:前面提到的第一个被访问的寄存器的地址偏移量,即在DCR寄存器中给数据库管理员的值。这里首先要访问的是地址偏移量为13的TIM2_CCR1。
突发请求是触发DMA突发传输的定时器事件源。这是一个更新事件。
突发缓冲器:这是用于存储数据的存储器的起始地址,例如用户定义的阵列地址。
突发长度:是对应于DCR寄存器中DBL的上述值,即每个突发组传输的数据数量。具体来说,DBL应该是4-1或3。
以上是固件中该变量的定义。为什么数据是这样定义的?它向左移动了8位。请看上面DCR登记簿中DBL部分的位置。
最后,看看紧随其后的另一个数据卷((突发长度)8U) 1U。结合先前的突发长度数据,计算结果是传输到DMA的数据的数量,其等于每个突发组传输的数据的数量。具体来说,这里是4。换句话说,如果我们将每个突发传输的数据数量设置为6,则此处的值为6。这意味着,根据函数的当前用法,无论发生多少次Busrt传输,都只能使用一组数据。如果我想在[突发传输中使用多组不同的数据(可能部分或完全不同),如上面的示例所预期的那样,该怎么办?
在这种情况下,当突发传输需要多组不同的数据时,我们可以直接使用现有的库函数。
函数的作用是:对最后一个表示DMA传输长度的变量进行适当的修改。
例如,在一个应用中,每组突发传输m个数据,而在一轮DMA传输中,有对应的n个触发事件。在不同的触发时间,每组传输的数据内容不尽相同,那么DMA传输数据的总数为m * n。具体来说,我将使用11组不同的数据,每组传输4个数据,即一次DMA传输4*11个数据。
这是基本的介绍和分析。让我们看看具体的用户代码。代码非常简单,基于STM32HAL库。
以下是用于在不同时间调整每个通道的脉宽调制占空比的11组存储器数据。
要添加的用户参考代码如下。应该清楚地说明并画出几行代码。主要功能是定时器DMA包传输功能,这已经在上面详细解释过了。
最后,看看手术后的演示结果。
示波器只接收两个开关,其目的是演示同时修改四个通道的占空比,实现pwm占空比从窄到宽的规律变化。
这里,这里讨论了定时器DMA突发传输的介绍和示例。简要总结:
1.从对定时器DMA突发传输原理的理解来看,它有点复杂。我们需要很好地理解定时器的相关原理和DMA的基本知识。在阅读STM32参考手册的相关章节时,除了阅读文本,您还应该仔细阅读TIMx_DMAR和TIMx_DCR寄存器的描述。但是,从实现代码的角度来看,使用CubeMx和固件库,其功能代码还是很简单的,相关的变量值可以相应的填入。
2.STM32固件库的一些例程或功能侧重于展示相应的功能或特性,但不能包罗万象或保证适用于任何场景。有时我们可以根据现有的函数进行适当的重写调整,甚至完全重写代码以满足实际需要。
3.在定时器的DMA突发传输期间,用于组访问的定时器寄存器应该是具有相同定时器和连续地址的寄存器,并且不能通过跳转来访问。
4.上面的例子只是一个演示,旨在理解这个函数的用法和基本特征。在实际应用中,经常会涉及到更多的细节,例如每个定时器事件的特性、寄存器预安装功能的开/关、与DMA相关的知识等。最终结合实际需要灵活应用。
防控疫情的需求激发之下,代替人类送药、送餐送菜、消毒巡逻的无人车成了疫情期间的特殊尖兵。疫情过后,无人车配送是否...
2020-03-23 17:12市场分调研机构Omdia的最新数据分析显示,全球智能城市人工智能(AI)软件市场将从6 738亿美元(2019年),在2025年将增长到4...
2020-04-07 17:55现代电测技术日趋成熟,由于具有精度高、便于微机相连实现自动实时处理等优点,已经广泛应用在电气量和非电气量的测量中。
2020-04-07 17:56微软经常在游戏领域开辟路径,扮演开拓者的角色,这一点体现在很多方面,包括微软的尖端技术(DX12终极版 DX光追),硬件(X...
2020-04-07 17:57去年 12 月,波音为美国宇航局发射了未载人的 Starliner 航天器。然而由于技术问题,任务并没有按计划进行。作为 NASA ...
2020-04-07 17:58