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

【经验分享】STM32L053 可控 PWM 脉冲方法之 DMA

[复制链接]
STMCU小助手 发布时间:2022-2-24 19:50
一. 前言
目标要求:系统时钟 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 地址的定义:

GY1{W)D]AI430O@YU9JQY_B.png

DMA 的初始化:

4)6DF$B]X`(EQ5YJ@$WZFRJ.png

逐个寄存器简要说明:
DMA_PeripheralBaseAddr

3L831PDSSZI0N1I)$_`A]9W.png

该语句是对寄存器 DMA_CPARx 赋值,存入要操作的是哪种外设,该外设的数据寄存器的基地址,它作为数据传输的源或目标,在此例中,是作为数据传输的目标的基地址。
通道 5,它的 CPAR 值是 0x40012C4C,表明通道 5 的寄存器偏移地址 DMA_CPAR5 是 0x10+0d20 *4 = 0x60,所以 DMA_CPAR5 的真实地址是 0x40020000 +0x60 = 0x40020060,该地址里面存储的是0x40012C4C,是 TIM1_DMAR 的地址。即可以理解为操作的是 TIM1 的外设。

427~LY)KH0~YKO5017GFZ1I.png

DMA_MemoryBaseAddr

Z[_KTLR)YM25E{0{[80K16F.png

该语句是对寄存器 DMA_CMARx 赋值,设置的是相应通道的存储器的基地址,作为数据传输的源或目标,在此例中,是作为数据传输的源的基地址。(uint32_t)SRC_Buffer;
DMA_DIR
数据传输方向,从外设读或者从存储器读,该示例中是从存储器读;外设作为目标地址。
DMA_BufferSize

XEW746E9GY()RF~LRTX664P.png

定义数据传输的数量,指示剩余的待传输字节数目,寄存器内容在每次 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 口的设定:

Z(}(FM@R5E9)4{JJX`A6Q]I.png

这里要记住一点,如果参数设置中,周期和占空比寄存器设定的计数值已经达到最小,当再使用 DMA产生中断时,可能会来不及响应。允许的话,可以利用分频 Prescaler 先对定时计数器的时钟分频。
定时器的配置:

NNPA`9FY{H[OKL%SWY7ABB4.png

DMA 的配置:

DRYSC]CTGD8UI$DZ]7(3FFT.png

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

`8}0]10N3I563SWT908H)WF.png

上述需要在程序中添加设置 TIM2_DMAR_Address 的偏移索引地址,在定时器的章节可以看到。不需要打开 DMA 传输完成的中断。
下面的是启动 DMA 传输,利用定时器的更新事件(TIM_UP 指定时器的周期,TIM_CH1 指占空比)去触发 DMA 传输数据。

9T}M9E6A%CH64UIX1ZB$Z58.png

这儿传输的方向是将 aSRC_Buffer 数组中数值,逐个向 TIM_DAMBase_CR1 寄存器中写入,控制定时器的计数使能位,达到控制 PWM 个数的目的。

_JL8I1ELH29~VGH04]9}F5Y.png

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

4}F)RNKR~R_5)6W44O95W.png

波形截取成功。

收藏 评论0 发布时间:2022-2-24 19:50

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版