在做一个项目时,为了节约时间将通用定时器的 定时代码直接改动用来驱动高级定时器,发现时钟比预想的慢了六七倍,百思不得其解。
经过各种方式查找后发现是配置高级定时器时一个参数没有配置,造成有定时变慢
改动之前
- <font face="微软雅黑" size="3">
- 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);
- }
- </font>
复制代码 改动之后
- <font face="微软雅黑" size="3">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);
- }
- </font>
复制代码 可以看出增加了TIM_RepetitionCounter 的配置,该参数表明向下计数到多少值时产生中断更新
固件库中的相关说明
查看固件库中的代码,发现库中更改了RCR寄存器的值
查看手册中关于该寄存器的描述
该寄存器的复位值为0,所以导致定时器变慢的原因可能是TIM_TimeBaseStructure 结构体中的值TIM_RepetitionCounter没有初始化为0就传给了库函数,其值可能为随机值,从而造成问题。
|