1. 定时器时间基准的工程本质
在嵌入式系统开发中,“获取当前时间”并非一个抽象概念,而是一个需要精确建模的硬件行为。STM32的通用定时器(如TIM3)本质上是一个可编程的递增计数器,其行为完全由输入时钟、预分频器(PSC)和自动重装载寄存器(ARR)共同决定。理解这一点是构建可靠延迟函数的前提。
以TIM3为例,其时钟源来自APB1总线。在标准的72MHz系统主频下,APB1总线频率为36MHz。但关键细节在于:当APB1预分频器配置为不分频(即PCLK1 = HCLK)时,定时器时钟会被硬件自动倍频——这是STM32F1系列的一个重要特性。因此,若HCLK=72MHz且APB1预分频为1,则TIM3的实际输入时钟为72MHz;若APB1预分频为2(PCLK1 = 36MHz),则TIM3时钟仍为72MHz。这一机制确保了定时器具有更高的分辨率和更宽的定时范围。
本方案选择将TIM3配置为1ms时间基准,其核心参数推导如下:
- 目标溢出周期:1ms = 1000μs
- 输入时钟频率:72MHz → 周期为1/72MHz ≈ 13.89ns
- 预分频系数(PSC):需使计数器时钟接近1MHz以便于计算。设PSC = 71,则分频后时钟为72MHz/(71+1) = 1MHz,计数周期恰为1μs
- 自动重装载值(ARR):1ms / 1μs = 1000,因计数器从0开始计数,故ARR = 999
- 重复计数器(RCR):设为0,确保每次溢出均产生更新事件(UEV)
此配置下,TIM3的计数器每1ms溢出一次,硬件自动触发更新事件。该事件是后续实现毫秒级时间戳的核心物理基础。