STM32F7 定时器触发定时器

Posted

技术标签:

【中文标题】STM32F7 定时器触发定时器【英文标题】:STM32F7 Timer triggers Timer 【发布时间】:2018-03-26 11:48:38 【问题描述】:

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

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__);
  

【问题讨论】:

先尝试注册。它更容易,您不必依赖这个 HAL 膨胀软件 【参考方案1】:

应初始化配置结构。

void MX_TIM2_Init(void)
    
      TIM_ClockConfigTypeDef sClockSourceConfig;

函数体中定义的结构不会被初始化,没有显式初始化的字段会得到一些不可预知的值。

      TIM_ClockConfigTypeDef sClockSourceConfig = ;

使用此表单将在使用前将所有字段显式归零。

输入触发错误

sSlaveConfig.InputTrigger = TIM_TS_ITR0;

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

没有 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

【讨论】:

这正是我经常写的——寄存器。清晰、简单、易读和可维护。对于那些懒得阅读和理解 RM 的人来说,这不是 HAL 过时软件背后的“魔法”。点赞

以上是关于STM32F7 定时器触发定时器的主要内容,如果未能解决你的问题,请参考以下文章

stm32f7 时钟

STM32F030 定时器多次溢出才触发中断的问题

STM32F4一个主定时器触发两个从属时间

STM32F429 定时器触发 USART DMA 传输问题

定时器触发的STM32F767ZI双ADC模式

STM32学习及应用笔记一:SysTick定时器学习及应用