使用精准的时基、通过硬件的方式,实现定时功能。定时器的核心就是计数器。
STM32定时器分类
| 定时器类型 | 具体子类型 | 核心功能 | 典型应用场景 |
|---|---|---|---|
| 常规定时器 | 基本定时器 | 1. 16 位自动重装计数器,仅向上计数 2. 触发 DAC / 定时器同步 3. 基础定时 / 溢出中断 | - 简单周期性任务触发(如 LED 周期性闪烁) - 作为 DAC 触发源实现波形输出 - 低精度周期性数据采集 |
| 通用定时器 | 1. 16 位向上 / 向下 / 中心对齐计数 2. 输入捕获 / 输出比较 3. PWM 生成(边缘 / 中心对齐) 4. 外部时钟同步 | - 脉冲宽度测量(PWM 信号占空比检测) - 直流电机转速控制(输出可调 PWM) - 外部信号频率 / 周期测量(输入捕获) - 舵机角度精准控制 | |
| 高级定时器 | 1. 包含通用定时器全部功能 2. 死区时间插入(DTI) 3. 刹车 / 断路功能(BRK) 4. 互补 PWM 输出 | - 大功率电机驱动(带死区控制,防止桥臂直通) - 开关电源 PWM 调制(带刹车保护) - 伺服电机精准位置 / 速度控制 - 逆变电路驱动 | |
| 特殊功能定时器 | 独立看门狗(IWDG) | 1. 由内部低速时钟驱动,独立于主程序 2. 喂狗超时自动复位系统 3. 低功耗模式仍工作 | - 嵌入式系统防死机(程序跑飞 / 卡死时复位) - 工业控制设备的异常自恢复 - 无人值守设备的稳定性保障 |
| 窗口看门狗(WWDG) | 1. 由 APB1 时钟分频驱动,依赖主时钟 2. 仅在 “窗口时间” 内喂狗有效 3. 可检测程序执行超时 / 过快 | - 高精度系统异常检测(如程序执行节奏异常) - 对时序敏感的工业控制场景 - 防止程序陷入短周期死循环 | |
| 实时时钟(RTC) | 1. 独立时钟域(可由备用电池供电) 2. 秒 / 分 / 时 / 日 / 周 / 月 / 年计时 3. 闹钟 / 周期性中断 / 时间戳 | - 电子设备的时间 / 日期显示 - 低功耗设备的定时唤醒(如物联网终端周期性上报) - 数据采集的时间戳记录 - 定时任务触发(如定时开关机) | |
| 系统定时器 | SysTick 系统滴答 | 1. 24 位向下递减计数器,内核级定时器 2. 可生成精准延时 3. 作为 OS 时钟节拍源 | - 嵌入式操作系统(FreeRTOS/UCOS)的任务调度 - 软件延时函数的精准计时(us/ms 级) - 多任务系统的时间片分配 - 外设轮询的时间基准 |
常规定时器
STM32定时器分为基本定时器、通用定时器和高级定时器,它们功能各有侧重,适用于不同的应用场景。
基本定时器
基本定时器结构框图
基本定时器结构细分
1.时钟源(内部时钟CK_INT)
基本定时器(TIM6和TIM7)的时钟源来源于APB1总线时钟。
2.预分频器(PSC)
负责对定时器输入时钟进行分频,它的主要作用是通过降低定时器的输入时钟频率,为定时器的计时和定时功能提供更灵活的时间控制。TIMx_PSC寄存器是定时器的预分频器寄存器,用于设置定时器的预分频因子,分频因子决定了定时器的时钟频率。需要注意的是实际的分频值是TIMx_PSC+1,例如,当TIMx_PSC寄存器的值为0时,实际的分频因子的大小为0 + 1 = 1。
3.计数器
计数器通过对输入时钟(由预分频器分频后的时钟信号),记录经过的时间。计数器的计数模式有三种,递增计数、递减计数、中央对齐计数,但是,基本定时器仅支持递增模式。
TIMx_CNT寄存器是计数寄存器,用于存储定时器的计数值。
4.自动重装载器
控制计数器的最大计数值,从而影响定时器的溢出时间和功能行为。
TIMx_ARR是自动重装载器的重装载值寄存器,当TIMx_CNT寄存器等于TIMx_ARR寄存器时,计数器上溢,TIMx_CNT寄存器的值自动重置为0,同时产生一个UEV更新信号。
UEV事件的产生:
可能产生UEV事件的信号来源:
①计数器上溢(TIMx_CNT寄存器值==TIMx_ARR寄存器值)
②手动产生(将TIMx_EGR.UG位写1)
产生UEV事件的信号来源是否可以产生一个UEV的更新事件,取决于TIMx_CR1.UDIS位域。TIMx_CR1.UDIS为0时,允许产生更新事件;TIMx_CR1.UDIS为1时,则禁止产生UEV事件。
如何正确设置TIMx_ARR寄存器的内容?
单脉冲模式选择(取决于TIMx_CR1.OPM位域)
| 寄存器 | 位位置 | 位名称 | 取值含义 |
|---|---|---|---|
TIMx_CR1 | Bit 3 | OPM | 0:关闭单脉冲模式(定时器连续计数,正常模式) 1:开启单脉冲模式(单次计数,更新事件后自动停止) |
更新中断和DMA请求
生成更新中断和DMA请求的两种情况(取决于TIMx_CR1.URS位域):
TIMx_CR1.URS设置为1时:只有计数器上溢(TIMx_CNT寄存器值==TIMx_ARR寄存器值),会生成更新中断和DMA请求
TIMx_CR1.URS设置为0时:所有以下事件都会生成更新中断或DMA请求。
此类事件包括:
—计数器上溢(TIMx_CNT寄存器值==TIMx_ARR寄存器值)
—将UG位置1
—通过从模式控制器生成的更新事件