STM32 上 DMA 传输到 PWM 外设的编排

问题描述 投票:0回答:1

我有一块STM32F411板,想要使用定时器/PWM/DMA输出一个PWM信号:每2毫秒一次,发送16个脉冲,每个脉冲代表一位。每个脉冲的周期约为 3 微秒,占空比不同。

为了更改占空比,我通过 DMA 传输从内存中的缓冲区(缓冲区包含 16 个 32 位整数)写入 32 位输出捕获/比较寄存器 (TIMx->CCRx)。本质上,只要定时器的计数器小于该寄存器值,输出就为高电平,然后变为低电平,直到定时器溢出。

我有两个问题:

  1. 如果 DMA 传输与 PWM 输出不完全同步会发生什么?例如,如果通过 DMA 传输的前两个 CCR 值在第一个脉冲周期内到达。到达的第二个值是否被“丢弃”,或者 PWM 外设是否存储它并将其用于第二个脉冲?
  2. 怎样才能让PWM外设只输出16个脉冲,然后将线设置为低电平,并等到需要传输下一个16个脉冲?目前,我只能连续输出脉冲,但我一直在实现脉冲串之间的延迟。

我将不胜感激任何指点!

顺便说一句,我使用 libopencm3。

timer stm32 dma pwm libopencm3
1个回答
0
投票
  1. TIMx_CCRx 是一个寄存器。如果您向其中写入两个值,第二个值将覆盖第一个值。

但是,如果设置了相关的 TIMx_CCMRx.OCxPE 位,则可以打开 TIMx_CCRx 预加载。在这种情况下,处理器或 DMA 不会写入“工作”TIMx_CCRx 寄存器(与 TIMx_CNT 进行比较),而是写入“中间”寄存器(ST 使用不同的术语,但 IMO 更令人困惑)。在下一个更新事件发生时(通常在定时器“翻转”时,当 TIMx_CNT 达到 TIMx_ARR 然后变为 0 时),“中间”寄存器中的值将被复制到“工作”寄存器中。但即使在这种情况下,如果您在一个 TIM 周期内向 TIMx_CCRx 写入两次,两次写入都会进入“中间”寄存器,并且第二次写入会覆盖第一次写入。

但是您根本不需要担心每个周期两次写入。除非您在某些极端时钟下运行,否则 DMA 机制与上述预加载可确保每个周期只有一次 DMA 传输。只是不要通过 CC 本身触发 DMA(正如我在示例和 Cube/HAL 中经常看到的那样),而是通过更新触发 DMA。

  1. 在末尾添加一个“停止”周期,占空比为 0。这使得计时器输出永久处于低电平,即使计时器继续运行也是如此。
© www.soinside.com 2019 - 2024. All rights reserved.