TIM1自动启动、重复计数问题详解

   这个问题算是一个坑!我在配置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的代码如果屏蔽掉,则定时器会自动重复计数!!

这算是无解~在直接操作寄存器时,是不存在这样子的问题的!因为寄存器都是有默认值的。这也算是奇葩的问题了!瞬间感觉对库函数无爱了~

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值