1. 问题背景客户需要 MCU 输出一组变频的 PWM 波形来控制外围器件,并且不同频率脉冲的个数也不同。STM32U5 芯片拥有 TIM1/TIM8 高级定时器,还有通用定时器TIM2/TIM3/TIM4/TIM5 以及 TIM15/TIM16/TIM17。TIM 模块中,可通过修改 ARR 寄存器的值来修改 PWM 的频率。如果使用 TIM1/TIM8 或者 TIM15/TIM16/TIM17,则可以通过修改 RCR 与 CCR 寄存器,来控制脉冲个数及占空比。由于要同时修改多个 TIM 寄存器,需要使用 TIM 的 DMA burst 功能来实现此需求。 # o5 L* o8 {0 E: K9 B5 u' S1 C. | 2. TIM DMA burst STM32 片内部分 TIMER 在产生单个定时器事件情况下可以基于特定硬件机制触发多个 DMA 请求,这样产生多个连续的 DMA 传输来实现对多个 TIMER 寄存器的批量访问。这就是所谓的 TIM DMA burst 功能,这里有两个专用寄存器:8 p: X/ i% q8 @2 P9 {% \ TIMx_DCR :% p- e0 t& B6 G DBSS : 触发 DMA burst 的事件源& d/ G, _5 u1 @9 |' w- J DBL : DMA burst 传输个数* l4 q: {2 j {& h2 \- ~; F4 u1 ] DBA : DMA burst 传输的 TIM 寄存器基地址索引 TIMx_DMAR :9 @8 m+ J6 J0 Z& j3 h# H TIM DMA Burst 时,DMA 访问此寄存器 # e9 I6 q# {0 H9 K& Y/ E+ z0 B. V 3. 产生 PWM: B3 v# G+ U. y 本文使用 TIM1 来产生 PWM,在 U575 NECLEO 板上测试,MCU 主频为 100MHz。使用两个频率分别对应 TIM 寄存器组的值如下:ARR/ RCR/ CCR1 uint32_t pulse1[3] = {1000, 2, 500} ;' N l. X+ u& M% s# x4 H uint32_t pulse2[3] = {5000, 1, 2500} ; 即输出 3 个 pulse1 的脉冲后,再输出 2 个 pulse2 脉冲,这样交替输出。# k1 W6 I: e7 b0 w. \ 7 P5 M" [+ A7 B' l4 m! a i' _ 3.1. TIM 与 GPDMA 配置5 y1 j8 C2 ~* w- \$ W! F& w5 i: Y 3.1.1. TIM1 配置- R; J: v* Z: @+ O. B7 s8 i TIM1 配置如下,使能寄存器预装载功能。( `$ A. W. g2 R2 C0 z; G 4 k0 `' }* C' s9 d P . N+ @7 x$ f6 Z4 J ; y2 k$ Z+ \! Z0 W, i/ L 3.1.2. GPDMA 配置1 }/ Q! @# `7 |# v5 j: p 使用 GPDMA 通道 12 的 linked list 模式,并配置为循环模式: P9 T. x" K3 o2 U9 X& N# w & ?: }5 S' f( K 完整版请查看:附件 |
基于STM32U5系列TIMER+DMA+DAC应用经验分享
基于STM32双定时器+ADC+DMA实战经验分享
基于STM32 DMA传输的两个问题释疑
基于STM32的Timer 结合 DMA 2D 通道实现不同波形输出
基于STM32的 DMA 实验经验分享
基于STM32H563演示UART+DMA经验分享
基于STM32 DCMI 的带宽与性能经验分享
基于STM32 DAC+TIMER+DMA经验分享
基于STM32CUBEIDE在DMA模式下扫描多个通道的ADC经验分享
基于STM32F1 SPI3 使用DMA发送和接收
老哥,能否公布一下例程,我试了一下跑得有问题。0.0