STM32F030R8的TIM3_IRQHandler触发频率仅为预期的一半
根据你的描述,预期1ms触发一次TIM3更新中断但实际间隔为2ms,核心原因是定时器的实际计数频率只有预期的一半,以下是最可能的遗漏配置项:
预分频器(PSC)未正确设置
STMCubeMX中TIM3的默认PSC值可能不为0(部分版本或芯片默认配置可能设为1)。按你的需求,要让8MHz定时器时钟生成1ms周期,需满足:(PSC + 1) * (ARR + 1) = 8MHz * 1ms = 8000
已知ARR=7999(即ARR+1=8000),因此PSC必须设为0。如果PSC默认是1,那么实际周期为(1+1)*8000/8MHz = 2ms,刚好是预期的两倍。定时器时钟分频(CKD)被误配置
TIM3的CR1寄存器中有CKD位(时钟分频因子),默认应为00(不分频)。如果该位被设为01(分频因子2),定时器的实际工作时钟会变为8MHz/2=4MHz。此时即使PSC=0、ARR=7999,周期也会是8000/4MHz = 2ms,导致中断间隔翻倍。APB1总线预分频与定时器时钟的关联配置遗漏
对于STM32通用定时器(如TIM3),当APB1总线预分频器值大于1时,定时器时钟会自动翻倍为APB1时钟的2倍;若预分频器为1,则定时器时钟等于APB1时钟。
若你在RCC配置中误将APB1预分频器设为1(系统时钟8MHz时APB1时钟为8MHz),但错误地按APB1时钟翻倍的逻辑计算参数,就会导致周期偏差。不过这种情况概率较低,前两项是更常见的原因。Auto-Reload预加载模式未开启(概率较低)
若未开启Auto-reload preload(TIM_CR1的ARPE位),你设置的ARR值不会被加载到影子寄存器,定时器会使用默认的ARR值(可能远大于7999),但这种情况通常会导致间隔远大于2ms,而非刚好两倍,所以优先级低于前两项。
内容的提问来源于stack exchange,提问作者Spice_Weasel

