定时器开启就进中断

2019-07-20 13:28发布

板子芯片是STM32F405ZGTx,我想在程序中可以随时更改定时器的设定值,所以在程序中会随时有定时器初始化,但是我发现定时器每次在初始化后开启时都会进一次中断。网上查了下也没有搞定,发帖求教。定时器的配置使用CubeMx配的,TIM时钟为36MHz。定时器初始化是我自己改的:void MX_timer4_Init(uint16_t x,uint16_t y)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  htim4.Instance = TIM4;
  htim4.Init.Prescaler = x;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = y;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}

因为可能需要定时时间比较长,所以给PSC和Period都做了赋值。最高就可以定时到119s。
定时器中断程序如下:
void TIM4_IRQHandler(void)
{               
        switch(flag_time[0])
                {       
                        case 1:               
            HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);
                        flag_time[0]=2;
                        if(time4[1]<=655)
                        {
            MX_timer4_Init(3599,time4[1]*100-1);
                  HAL_TIM_Base_Start_IT(&htim4);
                        break;
                        }
                        else if(time4[1]>655)
                        {
                        MX_timer4_Init(65535,time4[1]*360000/65535-1);
                  HAL_TIM_Base_Start_IT(&htim4);
                        break;
                        }
                        case 2:
                                flag_time[0]=1;
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET);
                        if(time4[2]<=655)
                        {
                        MX_timer4_Init(3599,time4[2]*100-1);
                        HAL_TIM_Base_Start_IT(&htim4);
                        break;
                        }
                        else if(time4[2]>655)
                        {
                        MX_timer4_Init(65535,time4[2]*360000/65535-1);
                        HAL_TIM_Base_Start_IT(&htim4);
                        break;
                        }
                        case 3:
                                flag_time[0]=0;
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET);
                        HAL_TIM_Base_Stop_IT(&htim4);
                                break;
                }
  HAL_TIM_IRQHandler(&htim4);
}

然后我发现每次用
MX_timer4_Init(65535,time4[2]*360000/65535-1);
                        HAL_TIM_Base_Start_IT(&htim4);
初始化然后开启定时器时都会进中断,而不是我希望的只有在溢出时才进中断,求教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
薛坤
1楼-- · 2019-07-20 18:31
 精彩回答 2  元偷偷看……
一头鱼
2楼-- · 2019-07-20 18:47
薛坤 发表于 2017-7-7 15:41
这个问题我也遇到过,定时器初始化后,定时器已开启就会立刻进入“更新中断”,所以产生了定时器开始就进中 ...

在网上找了一种方法,时在定时器初始化时给一个操作EGR寄存器,产生一个中断时间,然后清除更新标志位,暂时解决了,具体的过程还没有仔细研究。

一周热门 更多>