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

时间:2019-04-17 14:26:46

标签: stm32 stm32f7

我尝试将旋转编码器与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__);
  }

}

4 个答案:

答案 0 :(得分:0)

您可以使用边缘检测器触发器 TI1F_ED STM32F030F4P6示例:

/* Trigger Edge Detector */
/* 100: TI1 Edge Detector (TI1F_ED) */
TIM3->SMCR &= ~(TIM_SMCR_TS_0 | TIM_SMCR_TS_1);
TIM3->SMCR |= TIM_SMCR_TS_2;
/* 1: Trigger interrupt enabled. */
TIM3->DIER |= TIM_DIER_TIE;
NVIC_EnableIRQ(TIM3_IRQn);

void TIM3_IRQHandler(void){
    if(TIM3->SR & TIM_SR_TIF){
        
    /* Here code */
    
        /* Interrupt enabled */
        TIM3->SR &= ~TIM_SR_TIF;
    }
}

更多信息: https://www.youtube.com/watch?v=1CPk9UD4440 https://cxemka.com/71-podklyuchenie-enkodera-dupa-k-stm32-cmsis-i-hal.html

答案 1 :(得分:-1)

设置一个比较器,然后在每个比较器中断处增加比较器阈值(TIMx_CCRx)。计时器应计数足够慢,以允许CPU在达到新阈值之前退出中断。将阈值(TIMx_CNT + 1)设置为阈值也可以很聪明,以确保中断已及时执行(否则您可以在下一个中断之前等待整个计时器周期)

达米亚诺

答案 2 :(得分:-1)

我相信捕获中断机制将在编码器模式下工作,因此每次计数器更改时,设置TIM1->DIER |= TIM_DIER_CC1IE都会产生一个中断。

如果上述方法不起作用,则在其他输入引脚上设置一个EXTI中断,即映射到通道2的一个中断,该中断不会直接更改计数器。这样,您将获得稳定的计数器值读数。

答案 3 :(得分:-2)

这不可能直接实现-但是您可以使用设置PWM,然后在该行上设置EXTI中断。