You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用STM32L452RET的同一定时器生成可变频率PWM与1ms中断

基于STM32L452RET定时器2的复用实现方案

核心思路:利用定时器重复计数器+PWM通道实现双功能

STM32L4系列定时器支持重复计数器(RCR寄存器),可让定时器每N次计数溢出后才触发更新中断。借助这个特性,能让定时器2同时输出可变频率的PWM,且稳定产生1ms定时中断,完全复用单定时器资源。

1. 基础时钟配置(以80MHz系统时钟为例)

  • 定时器2时钟源选择内部时钟(默认),预分频器(PSC)设为 79,使定时器计数频率为 80MHz / (79+1) = 1MHz(计数周期1us)。

2. PWM输出配置(任选通道1/2/3/4,以通道1为例)

  • 配置通道为PWM模式1(或模式2,根据蜂鸣器驱动逻辑选择),开启通道输出比较预装载(OC1PE=1)和自动重装载预装载(ARPE=1)。
  • 根据目标频率计算自动重装载值(ARR):
    • 4kHz时:ARR = (1MHz / 4kHz) - 1 = 249,对应PWM周期250us。
    • 1ms周期(1kHz)时:ARR = 999。
    • 其他频率通用公式:ARR = (1000000 / target_freq) - 1。
  • 设置占空比:比如50%占空比,将CCR1设为ARR/2(可根据蜂鸣器实际特性调整)。

3. 1ms定时中断实现

  • 通过重复计数器(RCR)控制更新中断触发周期:
    • PWM周期250us(4kHz)时,RCR = 3,每4次定时器溢出(250us×4)触发一次更新中断,刚好1ms。
    • PWM周期1ms(1kHz)时,RCR = 0,每1次溢出触发中断,即1ms。
    • PWM周期500us(2kHz)时,RCR=1,每2次溢出触发中断(500us×2=1ms)。
  • 开启定时器更新中断(UIE=1),并在NVIC中启用定时器2中断,按实际需求设置优先级。

4. 频率动态调整逻辑

调整PWM频率时按以下步骤操作:

  1. 先关闭定时器2的更新中断,避免调整过程中触发异常中断。
  2. 计算新的ARR值:ARR = (1000000 / new_freq) - 1。
  3. 计算新的RCR值:RCR = (1000 / (ARR+1)) - 1(ARR+1为PWM周期的微秒数,1000us除以周期数得到触发中断所需的溢出次数,减1即为RCR值)。
  4. 更新ARR、RCR和CCRx以保持目标占空比。
  5. 重新开启定时器更新中断。

关于之前直接驱动引脚频率受限的原因

直接用GPIO翻转实现“软件PWM”时,需在中断或主循环中手动控制引脚电平,受CPU执行速度及其他任务影响,翻转频率无法达到硬件PWM的精度和高频。而硬件PWM由定时器外设独立完成,不占用CPU资源,因此能轻松实现4kHz甚至更高频率的输出。


内容的提问来源于stack exchange,提问作者TechNomad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:23:30