基于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任务中读取这个计数变量,建议加临界区保护,示例如下:
- TIM6的NVIC中断优先级要设置为高于
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
相关产品推荐
相关产品推荐

