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

基于STM32L433 TIM6与FreeRTOS的按键重置计时器控制LCD熄屏咨询

实现方案

前提说明

TIM6是STM32L4系列的基础无通道定时器,非常适合做这类超时计数场景,由于你同时运行FreeRTOS,只需注意TIM6中断优先级配置不要高于FreeRTOS可管理的最高中断优先级即可,整个逻辑不会影响其他无关任务的调度。

具体实现步骤

  • 第一步:TIM6基础配置

    建议配置为1秒触发一次中断,方便后续灵活调整超时时间,无需反复修改定时器参数,HAL库初始化示例如下:
TIM_HandleTypeDef htim6;
volatile uint8_t lcd_timeout_cnt = 0; // 超时计数变量,单位为秒
#define LCD_TIMEOUT_SEC 10 // LCD无操作自动熄灭时间,可自由调整

void MX_TIM6_Init(void)
{
  htim6.Instance = TIM6;
  // 以下参数按40MHz系统主频配置,你可根据实际时钟调整分频系数
  htim6.Init.Prescaler = 40000 - 1; // 40MHz分频后计数频率为1kHz
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 1000 - 1; // 计数满1000次触发1次中断,间隔为1秒
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    Error_Handler();
  }
  // 初始化后不要启动定时器,第一次按键按下再启动即可
}

// TIM6中断服务函数
void TIM6_DAC_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&htim6);
}

// 定时器更新中断回调
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM6)
  {
    lcd_timeout_cnt++;
    if (lcd_timeout_cnt >= LCD_TIMEOUT_SEC)
    {
      // 达到超时时间,熄灭LCD、停止定时器、重置计数
      HAL_GPIO_WritePin(LCD_PWR_GPIO_Port, LCD_PWR_Pin, GPIO_PIN_RESET);
      HAL_TIM_Base_Stop_IT(&htim6);
      lcd_timeout_cnt = 0;
    }
  }
}
  • 第二步:按键触发时重置TIM6逻辑

    无论你是在GPIO中断还是FreeRTOS的按键扫描任务里检测按键,只需要调用以下逻辑即可完成定时器重置,不会出现计时不准的问题:
void lcd_refresh_timeout(void)
{
  // 点亮LCD
  HAL_GPIO_WritePin(LCD_PWR_GPIO_Port, LCD_PWR_Pin, GPIO_PIN_SET);
  // 重置超时计数变量
  lcd_timeout_cnt = 0;
  // 清空TIM6当前计数寄存器,避免残留计数值导致首次中断提前触发
  __HAL_TIM_SET_COUNTER(&htim6, 0);
  // 启动定时器,重复调用也不会出现异常
  HAL_TIM_Base_Start_IT(&htim6);
}
  • 第三步:FreeRTOS兼容注意事项

    • TIM6的NVIC中断优先级要设置为高于configMAX_SYSCALL_INTERRUPT_PRIORITY(也就是优先级数值更大),避免打断FreeRTOS的临界区操作
    • 全局计数变量lcd_timeout_cnt必须加volatile修饰,避免编译器优化导致中断修改的值无法被正常读取
    • 如果需要在FreeRTOS任务中读取这个计数变量,建议加临界区保护,示例如下:
uint8_t get_lcd_remain_time(void)
{
  uint8_t remain;
  taskENTER_CRITICAL();
  remain = LCD_TIMEOUT_SEC - lcd_timeout_cnt;
  taskEXIT_CRITICAL();
  return remain;
}

异常排查

  • 如果出现LCD提前熄灭:先核对TIM6的分频、周期参数是否和你实际的系统时钟匹配,确保1秒中断的计时准确
  • 如果按键重置不生效:检查是否漏了__HAL_TIM_SET_COUNTER(&htim6, 0)操作,只清计数变量不清定时器计数器的话,残留的计数值可能会很快触发下一次中断,导致实际计时不足10秒

内容的提问来源于stack exchange,提问作者Amin-nano-sys

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:42:01