我有一块STM32F411板,想要使用定时器/PWM/DMA输出一个PWM信号:每2毫秒一次,发送16个脉冲,每个脉冲代表一位。每个脉冲的周期约为 3 微秒,占空比不同。
为了更改占空比,我通过 DMA 传输从内存中的缓冲区(缓冲区包含 16 个 32 位整数)写入 32 位输出捕获/比较寄存器 (TIMx->CCRx)。本质上,只要定时器的计数器小于该寄存器值,输出就为高电平,然后变为低电平,直到定时器溢出。
我有两个问题:
我将不胜感激任何指点!
顺便说一句,我使用 libopencm3。
但是,如果设置了相关的 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。