这个问题算是一个坑!我在配置TIM1定时,但是并没有调用到库函数void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)来启动计数器,居然TIM1自己启动!还出现自动重复计数!逆天了,百般查找~居然发现问题是因为在初始化定时器时,没有初始化TIM_ClockDivision分频因子以及没有将TIM_RepetitionCounter重复计数器的值赋值为0,会直接导致“定时器自动启动”、“重复计数”
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/** * @brief 定时器1初始化函数 * @param none * @return none */ void Timer1_Init( void) { u16 arr = 10000; //重装载值 u16 psc = 7200- 1; //预分频值 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定义结构体变量,用于初始化定时器 NVIC_InitTypeDef NVIC_InitStructure; //定义结构体,用于初始化中断 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定时器1时钟 /*定时器1初始化*/ TIM_TimeBaseStructure.TIM_Period = arr; //将重装载值赋值给重装载寄存器 TIM_TimeBaseStructure.TIM_Prescaler = psc; //将预分频值赋值给预分频寄存器进行预分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器向上计数 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频,必不可少 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //不使用重复计数功能,不可缺少 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据上述参数,初始化定时器 TIM_ClearFlag(TIM1, TIM_FLAG_Update); //清除标志位,以免一启用中断后立即产生中断 TIM_ITConfig(TIM1, TIM_IT_Update,ENABLE ); //使能更新中断 /*NVIC中断初始化*/ NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //中断通道是定时器1更新中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //设置相应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道 NVIC_Init(&NVIC_InitStructure); //初始化NVIC TIM_Cmd(TIM1, ENABLE); //使能定时器1 } |
行20的代码如果屏蔽掉,则定时器会自动启动!!
行21的代码如果屏蔽掉,则定时器会自动重复计数!!
这算是无解~在直接操作寄存器时,是不存在这样子的问题的!因为寄存器都是有默认值的。这也算是奇葩的问题了!瞬间感觉对库函数无爱了~