You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32G4 TIM1中心对齐模式下更新事件仅ARR触发的问题求助

STM32G4 TIM1中心对齐模式下仅在ARR触发ADC采样的解决方案

针对中心对齐模式1下更新事件在ARR和下溢点重复触发的问题,以下是几种可行的解决方法:

方案1:改用捕获比较通道触发ADC(推荐)

绕过更新事件的双触发问题,直接利用TIM的输出比较事件精准触发ADC:

  • 配置TIM1的任意空闲捕获比较通道为输出比较定时模式,将比较值设置为与ARR相等。
  • 当计数器向上计数到ARR时,该通道会产生捕获比较事件,以此作为ADC的触发源。
  • 这种方式无需额外判断逻辑,触发时机完全符合需求。

HAL库代码示例:

// 配置TIM1 CH1为输出比较模式
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_TIMING; // 仅生成触发事件,不输出PWM
sConfigOC.Pulse = TIM1->ARR; // 比较值匹配ARR
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);

// 启动该通道的输出比较功能
HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_1);

// 配置ADC触发源为TIM1 CH1事件
ADC_HandleTypeDef hadc1;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1_EVENT;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
HAL_ADC_Init(&hadc1);

方案2:在更新中断中判断计数方向

如果必须使用更新事件触发,可通过判断计数器的计数方向过滤无效触发:

  • 启用TIM1的更新中断,在中断回调中读取TIM_CR1的DIR位:
    • DIR=0表示计数器处于向上计数状态,此时的更新事件是到达ARR触发的;
    • DIR=1表示向下计数,此时的更新事件为下溢触发,直接忽略。

代码示例:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM1)
  {
    // 仅在向上计数到达ARR时启动ADC采样
    if (!(TIM1->CR1 & TIM_CR1_DIR))
    {
      HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&adc_sample_buf, 1);
    }
  }
}

方案3:配置TIM仅向上溢出触发更新请求

通过TIM_CR1的URS位(Update Request Selection)限制更新请求的生成条件:

  • 设置URS=1后,TIM仅在计数器溢出(向上计数到ARR)时生成更新请求,下溢时不会触发。
  • 注意该配置会影响所有更新相关的功能(中断、DMA、触发输出),需确保其他功能不受影响。

寄存器配置代码:

// 仅允许向上溢出触发更新请求
TIM1->CR1 |= TIM_CR1_URS;

内容的提问来源于stack exchange,提问作者amirparto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:16:18