1. 定时器基础STM32 G431的两种工作模式在蓝桥杯嵌入式竞赛中定时器就像比赛中的计时员精准控制着每个操作的节奏。STM32G431的定时器主要有两种工作模式中断模式和轮询模式。这两种模式就像餐厅点餐的两种方式——中断模式相当于服务员主动通知你餐点准备好了自动触发而轮询模式就像你不断去厨房查看餐点状态主动查询。HAL库提供了简洁的API来操作定时器最常用的几个函数包括HAL_TIM_Base_Start_IT()以中断模式启动定时器HAL_TIM_Base_Start()以轮询模式启动定时器HAL_TIM_Base_Stop()停止定时器运行__HAL_TIM_SET_COUNTER()直接操作计数器值实际项目中我遇到过这样的情况用轮询模式实现LED闪烁时主循环会被while(__HAL_TIM_GET_COUNTER())完全阻塞导致其他任务无法执行。这时候切换到中断模式系统响应就流畅多了。2. 中断模式实战精准的异步事件处理2.1 中断回调函数详解HAL_TIM_PeriodElapsedCallback是定时器中断的核心就像你设置的闹钟铃声。当定时器计数达到ARR值时这个铃声就会自动响起。在CubeMX中配置TIM1时需要勾选TIM1 update interrupt这就相当于给闹钟装上了响铃开关。一个典型的中断回调实现是这样的void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim-Instance TIM1) { static uint8_t led_state 0; led_state !led_state; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, led_state); } }我在调试时发现一定要在回调函数中判断定时器实例否则所有定时器中断都会触发相同操作。曾经有个项目因为这个疏忽导致系统异常排查了半天才发现问题。2.2 中断模式参数配置技巧在CubeMX中配置1秒定时中断时时钟源选择Internal ClockPSC设为8000-1对80MHz主频进行8000分频ARR设为10000-1计算公式80MHz/(8000×10000)1Hz这样配置后定时器就像节拍器一样每隔1秒准时触发一次中断。在蓝桥杯比赛中这种定时非常适合用于周期性状态检测或数据采集。3. 轮询模式应用简单高效的延时控制3.1 微秒级延时实现轮询模式特别适合实现精确延时比如用TIM4实现us级延时void Delay_us(uint16_t delay) { HAL_TIM_Base_Start(htim4); __HAL_TIM_SET_COUNTER(htim4, 0); while(__HAL_TIM_GET_COUNTER(htim4) delay); HAL_TIM_Base_Stop(htim4); }配置要点PSC设为80-180MHz/801MHzARR设为最大值65535每个计数周期1/1MHz1us实测发现这种延时方式精度可达±0.5us比HAL自带的HAL_Delay()精确得多。但在使用时要避免长时间阻塞我曾用它在电机控制中实现PWM微调效果很好。3.2 轮询模式使用陷阱新手常犯的错误是混淆HAL_TIM_Base_Start和HAL_TIM_Base_Start_IT。有次我看到一个同学的项目明明想用轮询模式却调用了带IT的函数导致系统不断进入中断。记住轮询模式StartGET_COUNTER组合中断模式Start_IT回调函数组合另一个坑是忘记停止定时器。在不需要延时要及时调用Stop函数否则计数器会一直累加可能溢出导致异常。4. 模式对比与竞赛应用策略4.1 响应机制对比特性中断模式轮询模式触发方式自动触发回调函数需主动查询计数器CPU占用低异步高阻塞实时性高立即响应依赖查询频率适用场景多任务系统、实时响应简单延时、单任务系统在去年蓝桥杯比赛中有个题目要求同时处理按键扫描和LED动画。采用中断模式处理按键轮询模式控制LED这种混合方案最终取得了很好的效果。4.2 竞赛实战建议基础功能用中断模式实现系统心跳如1ms定时维持系统节奏精准控制对电机、舵机等设备使用轮询模式做精细时序控制资源分配简单外设用轮询复杂逻辑用中断调试技巧在回调函数首行加调试输出方便定位定时问题记得在初始化时正确配置NVIC优先级。有次我调试时发现定时器中断会打断USART中断导致数据丢失后来调整优先级才解决。在CubeMX中合理设置中断优先级分组如Group4能让系统更稳定。