STM32高级定时器定时变慢

本文介绍了一个项目中使用定时器遇到的问题及解决过程。通过对比通用定时器与高级定时器的配置代码,发现问题在于未正确配置TIM_RepetitionCounter参数,导致定时器运行速度远低于预期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做一个项目时,为了节约时间将通用定时器的 定时代码直接改动用来驱动高级定时器,发现时钟比预想的慢了六七倍,百思不得其解。

 经过各种方式查找后发现是配置高级定时器时一个参数没有配置,造成有定时变慢

  改动之前

static void TIM1_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  /* Time base configuration,输出pwm频率为1KHZ */		 
  TIM_TimeBaseStructure.TIM_Period = 100-1;       //当定时器从0计数到100,即为100次,为一个定时周期
  TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/100000)-1;	    //设置预分频:不预分频,即为72MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;	//设置时钟分频系数:不分频(这里用不到)
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  //TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
}	

改动之后

static void TIM1_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

  /* Time base configuration,输出pwm频率为1KHZ */		 
  TIM_TimeBaseStructure.TIM_Period = 100-1;       //当定时器从0计数到100,即为100次,为一个定时周期
  TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/100000)-1;	    //设置预分频:不预分频,即为72MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;	//设置时钟分频系数:不分频(这里用不到)
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
}

可以看出增加了TIM_RepetitionCounter 的配置,该参数表明向下计数到多少值时产生中断更新

固件库中的相关说明

查看固件库中的代码,发现库中更改了RCR寄存器的值

查看手册中关于该寄存器的描述

该寄存器的复位值为0,所以导致定时器变慢的原因可能是TIM_TimeBaseStructure 结构体中的值TIM_RepetitionCounter没有初始化为0就传给了库函数,其值可能为随机值,从而造成问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值