1. 什么是Timer+DMA动态PWM生成
如果你正在做电机控制、LED调光或者需要实时调整PWM占空比的项目,那么STM32的Timer配合DMA生成动态PWM绝对是个值得掌握的技能。简单来说,这种方式可以让CPU从繁重的PWM数据更新任务中解放出来,实现"一次配置,自动运行"的效果。
传统的PWM生成方式需要CPU不断修改比较寄存器(CCR)的值来改变占空比,这会占用大量计算资源。而使用DMA(直接存储器访问)来自动搬运数据到Timer的CCR寄存器,CPU只需要初始化配置,剩下的工作就交给DMA自动完成了。这种方式特别适合需要平滑变化PWM波形的场景,比如呼吸灯效果、电机软启动、音频生成等。
我在实际项目中发现,很多开发者对HAL库的配置流程不太清楚,特别是底层寄存器如何配合工作。接下来我会用最直白的方式,带你一步步理解并实现这个功能。
2. 环境准备与基础配置
2.1 硬件选择与时钟设置
我这次用的是STM32G030芯片,系统时钟配置为16MHz。这个芯片虽然属于入门级,但功能足够演示Timer+DMA的PWM生成。你也可以选择其他STM32系列,配置原理都是相通的。
时钟配置是关键的第一步。Timer的计数频率取决于系统时钟和预分频器设置。我的配置是:预分频器(PSC)设置为15,这意味着Timer的实际工作频率是16MHz / (15+1) = 1MHz。为什么要加1?因为预分频器是从0开始计数的,设置15实际上会产生16分频效果。
自动重装载寄存器(ARR)我设置为999,这样PWM的周期就是(999+1)/1MHz = 1ms,也就是1kHz的PWM频率。这个频率对于大多数电机控制和LED调光应用都很合适。
2.2 Timer工作模式选择
在CubeMX中配置Timer时,有几个重要选项需要注意:
时钟源选择:一定要选择内部时钟(Internal Clock),这样Timer才会使用系统时钟作为计数基准。
通道模式:每个Timer通道都有几种PWM模式可选:
- CH1:仅使用OC1输出
- CH1N:仅使用OC1N输出(互补输出)
- CH1 & CH1N:同时使用主输出和互补输出
如果你需要驱动电机桥电路,选择CH1 & CH1N模式可以同时生成主PWM和互补PWM信号。对于简单的LED调光,选择CH1模式就足够了。
PWM模式:STM32支持两种PWM模式:
- PWM模式1:在向上计数时,当计数器小于CCR时输出有效电平
- PWM模式2:在向上计数时,当计数器大于CCR时输出有效电平
大多数情况下使用PWM模式1就可以了,但如果你需要特定的电平极性,可以根据实际需求选择。
3. DMA配置详解
3.1 DMA参数设置原理
DMA配置是整个过程的核心,也是最容易出


3万+

被折叠的 条评论
为什么被折叠?



