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
相关产品推荐
相关产品推荐

