您现在的位置是:首页 >其他 >定时器定时中断中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。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结