您现在的位置是:首页 >学无止境 >定时器定时中断中TIM分频器失效原因探讨网站首页学无止境
定时器定时中断中TIM分频器失效原因探讨
简介定时器定时中断中TIM分频器失效原因探讨
定时器定时中断中TIM分频器失效原因探讨
根据上一篇文章,我发现在无论设置 TIM_CKD_DIV1
、TIM_CKD_DIV2
还是 TIM_CKD_DIV4
,最终定时器的行为都跟无分频(TIM_CKD_DIV1
)相同。 本文章我结合了AI的回答,想与大家一起探讨一下可能原因,如果有错误,欢迎指正。
首先,我们先来看看TIM_ClockDivision
的作用:
1. TIM_ClockDivision 的作用
① 作用范围
在 STM32F103 的定时器中,TIM_ClockDivision
仅影响 输入信号的滤波器,例如:
- 输入捕获(Input Capture)
- 编码器接口(Encoder Mode)
- 外部触发信号(Trigger Filter)
但它 不影响定时器的时钟源,即 定时器的计数频率不会因为 TIM_ClockDivision
的变化而改变。
② 具体作用
TIM_ClockDivision
仅对 定时器滤波器采样时钟 进行分频:
TIM_CKD_DIV1 // 采样频率 = 内部时钟
TIM_CKD_DIV2 // 采样频率 = 内部时钟 / 2
TIM_CKD_DIV4 // 采样频率 = 内部时钟 / 4
但它不会影响定时器的主时钟。
2. 定时器的主时钟来源
STM32F103 的通用定时器(TIM2~TIM5)的主时钟来源是 APB1 总线时钟(PCLK1):
- 如果
APB1
预分频因子PCLK1_Prescaler = 1
,则 定时器时钟 = PCLK1。 - 如果
PCLK1_Prescaler ≠ 1
,定时器时钟会 自动加倍,即:
TIM_CLK = 2 * times PCLK1 - 默认情况下:
PCLK1 = 36MHz, TIM_CLK = 72MHz
因此,影响定时器计数的关键参数是:
- 时钟源(APB1 总线时钟)
- 时钟预分频器(Prescaler)
- 计数周期(Period)
TIM_ClockDivision
不会影响定时器的计数时钟!
3. 代码中的无效配置
在代码中:
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
这个 TIM_ClockDivision
参数的设置 对定时器的计时功能没有影响,无论设置 TIM_CKD_DIV1
、TIM_CKD_DIV2
还是 TIM_CKD_DIV4
,最终的定时器计时频率都不会改变。
4. 正确影响定时器时钟的方法
如果想改变 TIM2 的计数频率,可以调整:
方法①:修改预分频器
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
- 这个参数会直接影响定时器的计数速度。
- 例如:
Prescaler = 7200
→ 计数频率 从 72MHz 降到 10kHzPrescaler = 3600
→ 计数频率 从 72MHz 降到 20kHz
方法②:修改自动重装值(ARR)
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
- 这个值决定了 计数器溢出的时间,影响定时器中断的周期。
5. 结论
- 在 STM32F103 系列中,TIM_ClockDivision(时钟分频) 仅对数字滤波器(如输入捕获、编码器模式) 相关的功能起作用,而不影响定时器的计数时钟。
TIM_ClockDivision
只影响输入信号滤波,不影响定时器计数频率!- 要调整定时器的工作频率,应该修改
TIM_Prescaler
和TIM_Period
! - 如果希望让 TIM2 运行得更快或更慢,应该修改
TIM_Prescaler
,而不是TIM_ClockDivision
。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。