STM32 定时器高级应用实战指南——PWM 输出、输入捕获、编码器模式与 HAL 库优化

前言 在嵌入式开发的世界里,定时器(Timer)堪称单片机的"瑞士军刀"。从简单的延时函数、周期性任务调度,到复杂的电机驱动控制、高精度脉冲测量、通信时序生成,定时器的身影无处不在。对于 STM32 这样的 Cortex-M 架构微控制器来说,定时器外设的丰富程度和灵活性,更是其区别于普通 8 位单片机的核心优势之一。 然而,很多开发者对 STM32 定时器的使用仅仅停留在"定时中断"这个最基础的层面——配置好自动重装载值,使能中断,然后在中断服务函数里翻转一下 LED。对于定时器的高级功能,如 PWM 输出、输入捕获、编码器接口等,要么知之甚少,要么只会通过 CubeMX 生成代码后"照着例子抄",遇到问题时根本不知道从何排查。 根据我多年的嵌入式开发经验,真正拉开单片机开发者水平差距的,往往不是会不会用某个外设,而是能不能把外设的性能发挥到极致。一个只会用定时器做延时的工程师,和一个能熟练运用编码器接口做闭环控制的工程师,其解决问题的能力和项目贡献度完全不在一个量级。 本文将从实际应用出发,系统讲解 STM32 定时器的四大高级功能:PWM 输出、输入捕获、编码器接口和输出比较。我们不会停留在寄存器层面的理论讲解,而是通过大量可直接运行的代码示例、实测数据和常见问题排查指南,带你真正掌握定时器的高级应用技巧。无论你是刚接触 STM32 的新手,还是有多年经验的老司机,这篇文章都会帮助你构建完整的定时器应用知识体系。 一、STM32 定时器家族概览 在深入具体应用之前,我们首先需要搞清楚 STM32 到底有多少种定时器,它们各自的特点是什么。很多初学者看到 STM32 的数据手册里 TIM1、TIM2、TIM8…一大堆定时器型号就头大,不知道该怎么选择。其实只要掌握了分类方法,一切就都清晰了。 1.1 定时器的分类与特点 STM32 的定时器按照功能复杂度可以分为四大类: 高级控制定时器(TIM1、TIM8):这是功能最强大的定时器,通常挂载在 APB2 总线上。除了基本定时功能外,还具备互补输出、死区时间插入、刹车输入等高级功能,专门为电机控制和开关电源设计。如果你需要做三相 BLDC 电机的 FOC 控制,或者需要带死区的 PWM 输出,高级定时器是唯一选择。 通用定时器(TIM2-TIM5,TIM9-TIM14):这是使用最广泛的一类定时器,挂载在 APB1 或 APB2 总线上。通用定时器具备完整的四大功能:定时中断、PWM 输出、输入捕获、编码器接口。其中 TIM2 和 TIM5 是 32 位计数器,其余是 16 位。对于 90% 以上的应用场景,通用定时器都是最佳选择。 基本定时器(TIM6、TIM7):功能最简单,只能做基本定时和 DAC 触发,没有输入输出通道。优点是资源占用小,中断优先级配置简单。通常用于周期性任务调度、ADC 采样触发等场景。 低功耗定时器(LPTIM):专为低功耗应用设计,可以在停止模式下继续运行,使用 LSE 或 LSI 作为时钟源。适合电池供电设备的周期性唤醒场景。 1.2 定时器资源快速选择表 功能需求 推荐定时器 备注 简单定时中断 TIM6/TIM7 资源开销最小 PWM 输出(单路) TIM2-TIM5 任意通用定时器 PWM 输出(多通道同步) TIM1/TIM8 高级定时器同步性更好 脉冲宽度/频率测量 TIM2-TIM5 输入捕获功能 旋转编码器解码 TIM2-TIM5 需要 TI1+TI2 双通道 电机控制(带死区) TIM1/TIM8 必须用高级定时器 长周期定时(>10秒) TIM2/TIM5 32位计数器优势明显 1....

May 8, 2026 · 10 min · 👁️ 0 · Tech Snippets