STM32F7定时器触发定时器

时间:2017-10-14 13:38:29

标签: c timer stm32 stm32f7

我使用CubeMX生成了一些代码。 我希望计时器2触发计时器3。 如果定时器2发生溢出,定时器3应向上计数1。 我尝试了一些配置但没有任何效果 - 在timer3上没有中断 当我设置输出触发器(定时器2)

sMasterConfig.MasterOutputTrigger

与(计时器3)相同的值

sSlaveConfig.SlaveMode

我在计时器3上仍然没有中断

这是两个计时器的完整配置代码:

    TIM_HandleTypeDef htim2;
    TIM_HandleTypeDef htim3;

    /* TIM2 init function */
    void MX_TIM2_Init(void)
    {
      TIM_ClockConfigTypeDef sClockSourceConfig;
      TIM_MasterConfigTypeDef sMasterConfig;

      htim2.Instance = TIM2;
      htim2.Init.Prescaler = 54;
      htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim2.Init.Period = 250;
      htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;
      htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }

      sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
      if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }

      sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
      if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }

    }
    /* TIM3 init function */
    void MX_TIM3_Init(void)
    {
      TIM_SlaveConfigTypeDef sSlaveConfig;
      TIM_MasterConfigTypeDef sMasterConfig;

      htim3.Instance = TIM3;
      htim3.Init.Prescaler = 1;
      htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim3.Init.Period = 8000;
      htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }

      sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1;
      sSlaveConfig.InputTrigger = TIM_TS_ITR0;
      if (HAL_TIM_SlaveConfigSynchronization(&htim3, &sSlaveConfig) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }

      sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
      if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    }

1 个答案:

答案 0 :(得分:2)

应初始化配置结构。

void MX_TIM2_Init(void)
    {
      TIM_ClockConfigTypeDef sClockSourceConfig;

函数体中定义的结构不会被初始化,未显式初始化的字段将获得一些不可预测的值。

      TIM_ClockConfigTypeDef sClockSourceConfig = {};

使用此表单将在使用前明确归零所有字段。

错误的输入触发器

sSlaveConfig.InputTrigger = TIM_TS_ITR0;

使用ITR0使TIM3成为TIM1的奴隶。正确的值为TIM_TS_ITR1。请参阅参考手册中TIMx从模式控制寄存器TIMx的说明末尾的TIMx_SMCR内部触发连接表。

没有HAL的工作示例

嗯,它仍在使用HAL的一些有用的宏。

void TIM3_IRQHandler(void) {
    if(TIM3->SR & TIM_SR_UIF) {
        TIM3->SR = ~TIM_SR_UIF;
        do_something();
    }
}

void starttimers(void) {
    NVIC_EnableIRQ(TIM3_IRQn);
    __HAL_RCC_TIM2_CLK_ENABLE();
    __HAL_RCC_TIM3_CLK_ENABLE();

    TIM3->ARR = 8000;               // slave timer period
    // trigger selection TS=001 ITR1 = TIM2, slave mode SMS=0111 external clock mode 1
    TIM3->SMCR = TIM_TS_ITR1 | TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_2;
    TIM3->DIER = TIM_DIER_UIE;      // interrupt on update event (timer overflow)
    TIM3->CR1 = TIM_CR1_CEN;        // enable timer 3

    TIM2->PSC = 54;                 // prescaler preload
    TIM2->EGR = TIM_EGR_UG;         // update prescaler
    TIM2->ARR = 250;                // master timer period
    TIM2->CR2 = TIM_TRGO_UPDATE;    // master mode selection MMS=010 Update event
    TIM2->CR1 = TIM_CR1_CEN;        // enable timer 2
}