STM32定时器时间的计算
定时器时间计算
确定定时器时钟频率(Tck)
定时器和总线挂载对应表
以下是 STM32F4 系列 定时器与总线挂载的对应表(最常用的 F407/F429 等型号通用)
| 定时器编号 | 挂载总线 | 核心特征(补充) |
|---|---|---|
| TIM1 | APB2 | 高级定时器,带刹车 / 死区,常用于 PWM 电机控制 |
| TIM2 | APB1 | 通用定时器,32 位计数器,支持多模式计数 |
| TIM3 | APB1 | 通用定时器,16 位,最常用的通用定时 / PWM 外设 |
| TIM4 | APB1 | 通用定时器,16 位,同 TIM3,互补使用 |
| TIM5 | APB1 | 通用定时器,32 位计数器,超长定时场景优先选 |
| TIM6 | APB1 | 基本定时器,仅定时 / 触发 DAC,无 PWM / 捕获功能 |
| TIM7 | APB1 | 基本定时器,同 TIM6,仅定时功能 |
| TIM8 | APB2 | 高级定时器,功能同 TIM1,备用高级定时器 |
| TIM9 | APB2 | 通用定时器(简化版),仅 2 个通道 |
| TIM10 | APB2 | 通用定时器(简化版),仅 1 个通道 |
| TIM11 | APB2 | 通用定时器(简化版),仅 1 个通道 |
| TIM12 | APB1 | 通用定时器(简化版),2 个通道 |
| TIM13 | APB1 | 通用定时器(简化版),1 个通道 |
| TIM14 | APB1 | 通用定时器(简化版),1 个通道 |
| TIM15 | APB2 | 通用定时器(部分高端 F4 型号支持,如 F469) |
| TIM16 | APB2 | 通用定时器(部分高端 F4 型号支持) |
| TIM17 | APB2 | 通用定时器(部分高端 F4 型号支持) |
- APB1 总线:
- 包含 “低速” 通用 / 基本定时器(TIM2—TIM7、TIM12—TIM14)
- 总线时钟最高 42MHz(F4),定时器时钟倍频后最高 84MHz;
- APB2 总线:
- 包含 “高速” 高级 / 简化通用定时器(TIM1、TIM8—TIM11、TIM15—TIM17)
- 总线时钟最高 84MHz(F4),定时器时钟倍频后最高 168MHz;
时钟分频机制
- 如果APB预分频器 = 1:定时器时钟 = APB时钟
- 如果APB预分频器 ≠ 1:定时器时钟 = APB时钟 × 2
/* 常见系统时钟配置下:
HCLK = 168MHz
APB1预分频器 = 4 → PCLK1 = 42MHz
APB2预分频器 = 2 → PCLK2 = 84MHz
实际定时器时钟:
APB1定时器时钟 = 42MHz × 2 = 84MHz
APB2定时器时钟 = 84MHz × 2 = 168MHz
*/
配置定时器参数(PSC和ARR)
PSC预分频系数
a. 分频定时器时钟
实际计数频率 = 定时器时钟 / (PSC + 1)
- PSC=0:计数频率 = 定时器时钟(不分频)
- PSC=9:计数频率 = 定时器时钟 ÷ 10
- PSC=999:计数频率 = 定时器时钟 ÷ 1000
b. 扩大定时范围
定时器时钟往往很高(如84MHz),直接计数很快就溢出:
- 84MHz时,1秒需要8400万次计数
- 16位计数器最大只能计65535次
- 通过PSC分频,可以把频率降到可管理的范围
ARR自动重装载值
a. 设定定时周期
定时时间 = (ARR + 1) × (PSC + 1) ÷ 定时器时钟
- ARR=999:计数器从0计到999后溢出
- ARR=4999:计数器从0计到4999后溢出
b. 产生更新事件
当计数器达到ARR值时:
- 产生更新中断(如果使能)
- 计数器自动复位到0
- 更新影子寄存器(如果有)
c. 在PWM中的应用
- PWM周期由ARR决定
- 占空比由CCRx与ARR的比值决定
- 频率 = 定时器时钟 / ((ARR+1)×(PSC+1))
// 生成1kHz PWM,占空比50%
// 定时器时钟 = 84MHz
TIMx->PSC = 0; // 不分频
TIMx->ARR = 83999; // 周期84000个计数
TIMx->CCR1 = 42000; // 占空比50%
/*
PWM频率 = 84MHz / 84000 = 1kHz
高电平时间 = 42000/84MHz = 0.5ms
*/
计算定时时间
定时时间公式

举例子
TIM1定时时间1ms(APB2)
根据定时器和总线挂载对应表,可以知道定时器TIM1是挂载在APB2总线上,很明显APB2 Prescaler(预分频器)为2,如果APB预分频器 ≠ 1:定时器时钟 = APB时钟 × 2,即定时器时钟自动倍频,此时APB2的时钟为84MHz,则定时器时钟Tck = 84MHz × 2 = 168MHz。

此时将PSC配置为168-1,ARR配置为1000-1

故定时时间为 T = (168-1 + 1)× (1000-1 + 1)÷ 168MHz(168000 000) = 0.001s = 1ms
TIM5定时时间2ms(APB1)
根据定时器和总线挂载对应表,可以知道定时器TIM5是挂载在APB1总线上,很明显APB1 Prescaler(预分频器)为4,如果APB预分频器 ≠ 1:定时器时钟 = APB时钟 × 2,即定时器时钟自动倍频,此时APB1的时钟为42MHz,则定时器时钟Tck = 42MHz × 2 = 84MHz。

此时将PSC配置为168-1,ARR配置为1000-1

故定时时间为 T = (168-1 + 1)× (1000-1 + 1)÷ 84MHz(84000 000) = 0.002s = 2ms
TIM5定时时间1ms(APB1)
根据定时器和总线挂载对应表,可以知道定时器TIM5是挂载在APB1总线上,很明显APB1 Prescaler(预分频器)为4,如果APB预分频器 ≠ 1:定时器时钟 = APB时钟 × 2,即定时器时钟自动倍频,此时APB1的时钟为42MHz,则定时器时钟Tck = 42MHz × 2 = 84MHz。

此时将PSC配置为84-1,ARR配置为1000-1

故定时时间为 T = (84-1 + 1)× (1000-1 + 1)÷ 84MHz(84000 000) = 0.001s = 1ms
其他时间设置(1s、2s、5s)
其他时间的设置,可以在1ms的基础上,用代码实现1s、2s、5s等的定时时间设置
if (htim == &htim2) /* 1ms,以定时器2为例 */
{
time_count++;
if(time_count >= 1000) /* 每1ms进入一次中断,1ms*1000 = 1s,1ms*2000 = 2s,1ms*5000 = 5s,修改time_count的值即可 */
{
read_flag = 1; /* 设置读取标志 */
time_count = 0; /* 计数值清零 */
}
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)