如何用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。
- 4kHz时:
- 设置占空比:比如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)。
- PWM周期250us(4kHz)时,
- 开启定时器更新中断(
UIE=1),并在NVIC中启用定时器2中断,按实际需求设置优先级。
4. 频率动态调整逻辑
调整PWM频率时按以下步骤操作:
- 先关闭定时器2的更新中断,避免调整过程中触发异常中断。
- 计算新的
ARR值:ARR = (1000000 / new_freq) - 1。 - 计算新的
RCR值:RCR = (1000 / (ARR+1)) - 1(ARR+1为PWM周期的微秒数,1000us除以周期数得到触发中断所需的溢出次数,减1即为RCR值)。 - 更新
ARR、RCR和CCRx以保持目标占空比。 - 重新开启定时器更新中断。
关于之前直接驱动引脚频率受限的原因
直接用GPIO翻转实现“软件PWM”时,需在中断或主循环中手动控制引脚电平,受CPU执行速度及其他任务影响,翻转频率无法达到硬件PWM的精度和高频。而硬件PWM由定时器外设独立完成,不占用CPU资源,因此能轻松实现4kHz甚至更高频率的输出。
内容的提问来源于stack exchange,提问作者TechNomad
相关产品推荐
相关产品推荐

