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

如何配置STM32定时器在每次递增/递减时触发中断?,stm32,stm32f7,Stm32,Stm32f7,我尝试将旋转编码器与STM32F7接口。计时器(TIM1)应计算0-100之间的值,并在每次值递增或递减时触发中断 计数工作,但我只能在每个更新事件上配置一个中断。(如果计数器溢出/下溢) 如何配置这样的计时器 这不可能直接实现,但您可以使用设置PWM,然后在该线路上设置EXTI中断 我相信捕获中断机制将在编码器模式下工作,因此设置TIM1->DIER |=TIM_DIER_CC1IE应在每次计数器更改时生成中断 如果上述操作不起作用,则在另一个输入引脚(即映射到通道2的引脚)上设置EXTI中

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

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

如何配置这样的计时器


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

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


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

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

/*触发边缘检测器*/
/*100:TI1边缘检测器(TI1F_ED)*/
TIM3->SMCR&=~(TIM_SMCR_TS_0 | TIM_SMCR_TS_1);
TIM3->SMCR |=TIM|SMCR|TS|2;
/*1:触发中断已启用*/
TIM3->DIER |=TIM|DIER|TIE;

NVIC_EnableIRQ(TIM3_IRQn)中断可能比编码器计数器快,因此,如果您得到EXTI中断,计数器值尚未更新。这是一个坏主意。exti由定时器生成的pwm。因此,如何地狱计数器无法更新BTWQ编码器模式我读了这篇文档。我的理解是,中断不是由计时器生成的,而是由外部线路上升/下降沿生成的。在这种情况下,计数器可以在稍后的行中更新。我知道有人正是因为这个问题。但是如果你真的知道一个中断是由定时器而不是引脚边缘产生的,那么请给我解释一下。这正是我的问题。@Caniko它很简单-你的计时器会在内部引脚上产生PWM。您可以在此引脚(线)上设置| EXTI。边缘由定时器生成,带出口的引脚与编码器引脚没有连接(电气)。
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__);
  }

}