代码之家  ›  专栏  ›  技术社区  ›  Caniko

如何配置STM32定时器在每次递增/递减时触发中断?

  •  0
  • Caniko  · 技术社区  · 6 年前

    我尝试将旋转编码器与STM32F7连接起来。定时器(TIM1)应计算0-100之间的值,并在该值每次递增或递减时触发中断。

    计数工作,但我只能在每个更新事件上配置一个中断。(如果计数器溢出/下溢)

    如何配置这样的计时器?

    enter image description here

    static void MX_TIM1_Init(void)
    {
    
      TIM_Encoder_InitTypeDef sConfig;
      TIM_MasterConfigTypeDef sMasterConfig;
    
      htim1.Instance = TIM1;
      htim1.Init.Prescaler = 0;
      htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim1.Init.Period = 99;
      htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim1.Init.RepetitionCounter = 0;
      htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      sConfig.EncoderMode = TIM_ENCODERMODE_TI1;
      sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
      sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
      sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
      sConfig.IC1Filter = 0;
      sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
      sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
      sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
      sConfig.IC2Filter = 0;
      if (HAL_TIM_Encoder_Init(&htim1, &sConfig) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
      sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
      sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
      if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
    }
    
    0 回复  |  直到 6 年前
        1
  •  -1
  •   followed Monica to Codidact    6 年前

    我相信捕捉中断机制会在编码器模式下工作,所以 TIM1->DIER |= TIM_DIER_CC1IE 每次计数器改变时都会产生一个中断。

    如果上面的方法不起作用,那么在 其他输入引脚 ,即映射到信道2的那个,它不直接改变计数器。这样你就能得到一个稳定的计数器值读数。

        2
  •  -2
  •   0___________    6 年前

    这是不可能直接-但你可以设置PWM,然后在该线路上设置EXTI中断。