找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5970|回复: 3
收起左侧

STM32L053可控PWM脉冲方法之DMA

[复制链接]
ID:437031 发表于 2018-12-1 11:40 | 显示全部楼层 |阅读模式
.前言

目标要求:系统时钟 8Mhz,6 个 PWM 脉冲。

二.实现方式

实现上述目标的方法有很多种,比如两个定时器级连,定时器定时中断翻转 IO 口,等等,这里使用
DMA 的方式去实现。

2.1 参考基于 F1 标准外设库

软件环境:STM32F10x_StdPeriph_Lib_V3.5.0 版本的标准外设库函数中的

Project->STM32F10x_StdPeriph_Examples->TIM->DMABurst 的示例代码; 硬件环境:STM32F10V-128K-EVAL,MCU型号为 STM32F103VBT6; 该示例的代码稍微解释下,就会明白 DMA 的寄存器的作用。部分代码如下:


TIM1_DMAR_ADDRESS 地址的定义:


DMA 的初始化:

逐个寄存器简要说明:

DMA_PeripheralBaseAddr


该语句是对寄存器 DMA_CPARx 赋值,存入要操作的是哪种外设,该外设的数据寄存器的基地址,它作 为数据传输的源或目标,在此例中,是作为数据传输的目标的基地址。


通道 5,它的 CPAR 值是 0x40012C4C,表明通道 5 的寄存器偏移地址 DMA_CPAR5 是 0x10+0d20 *
4 = 0x60,所以 DMA_CPAR5 的真实地址是 0x40020000 +0x60 = 0x40020060,该地址里面存储的是

0x40012C4C,是 TIM1_DMAR 的地址。即可以理解为操作的是 TIM1 的外设。


DMA_MemoryBaseAddr

该语句是对寄存器 DMA_CMARx 赋值,设置的是相应通道的存储器的基地址,作为数据传输的源或目

标,在此例中,是作为数据传输的源的基地址。(uint32_t)SRC_Buffer; DMA_DIR

数据传输方向,从外设读或者从存储器读,该示例中是从存储器读;外设作为目标地址。


DMA_BufferSize

定义数据传输的数量,指示剩余的待传输字节数目,寄存器内容在每次 DMA 传输后递减。

DMA_PeripheralInc,DMA_MemoryInc 该示例中,不执行外设地址增量操作,执行存储器地址增量操作。DMA_PeripheralDataSize,DMA_MemoryDataSize 定义外设数据宽度,存储器数据宽度。


DMA_Mode
分为非循环模式和循环模式,

在非循环模式中,在数据传输结束后,DMA_CNDTRx 寄存器的内容会变为 0,此时无论通道是否开启, 都不会发生任何数据传输。

在循环模式中,在数据传输结束后,DMA_CNDTRx 寄存器的内容会自动加载变为之前配置的数值, 重新开始数据传输。


DMA_Priority,DMA_M2M
本例中,通道优先级设为高,启动非存储器到存储器模式。

2.2 基于 Cube 库函数的可控 PWM 脉冲 直接打开\STM32Cube_FW_L0_V1.1.0\Projects\STM32L053R8-Nucleo\Examples\TIM\TIM_DMABurst 中的示例项目,修改配置符合自己当初的设想:选取 Timer2 的 channel1(PA5),系统时钟通过 HSI 的分频倍频,通过 PLL 实现系统时钟为 8MHz。GPIO 口的设置: Max output speed 的速度为 High。定时器 PWM 模式的设置:向上计数,计数时钟为 8MHz,占空比

50%。

GPIO 口的设定:

这里要记住一点,如果参数设置中,周期和占空比寄存器设定的计数值已经达到最小,当再使用 DMA

产生中断时,可能会来不及响应。允许的话,可以利用分频 Prescaler 先对定时计数器的时钟分频。 定时器的配置:

DMA 的配置:



其中,对于 DMA 配置中,BUFFER_SIZE 是代表要向目标地址发送的数据的个数。

上述需要在程序中添加设置 TIM2_DMAR_Address 的偏移索引地址,在定时器的章节可以看到。
不需要打开 DMA 传输完成的中断。

下面的是启动 DMA 传输,利用定时器的更新事件(TIM_UP 指定时器的周期,TIM_CH1 指占空比)去触 发 DMA 传输数据。

这儿传输的方向是将 aSRC_Buffer 数组中数值,逐个向 TIM_DAMBase_CR1 寄存器中写入,控制定

时器的计数使能位,达到控制 PWM 个数的目的。

BUFFER_SIZE 的数值为 6,目的是产生 6 个脉冲。
运行程序:


波形截取成功
完整的pdf格式文档51黑下载地址:
STM32L053可控PWM脉冲方法之DMA.pdf (295.4 KB, 下载次数: 64)
回复

使用道具 举报

ID:93931 发表于 2019-7-2 09:41 | 显示全部楼层
楼主,我最近也在搞PWM的DMA方式,发送精确个数的PWM。不过有个问题,脉冲可以产生,而且跟DMA发送数目成正比,不过总会遗漏掉第一个脉冲。想求一份楼主的程序参考下,再次多谢
回复

使用道具 举报

ID:477269 发表于 2019-10-23 20:26 | 显示全部楼层
楼主打扰下,我想咨询一下,我们用DMA来发送脉冲,我想加一个控制脉冲的加减速,是用T好,还是S好呢,请问要怎么样写呢,能给一个提示吗
回复

使用道具 举报

ID:595170 发表于 2020-2-2 15:44 | 显示全部楼层
如何修改DMA_MemoryBaseAddr对应的传输数据,是DMA的关键,应该在什么时候对这些数据进行修改,还有要保证修改时不影响到PWM信号的输出。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表