在STM32的I2C从机模式下,时钟拉伸(SCL被从机拉低)是流控机制,但若主机异常或从机固件卡死,总线会永久锁死。正确配置超时机制的核心是:1) 使用硬件超时——STM32的I2C外设(如F1/F4系列)没有内置SCL超时计数器,需借助定时器(如TIM或基本定时器)在SCL低电平期间启动计时,超时(如10ms)后强制复位I2C外设(调用I2C_DeInit并重新初始化),同时释放SCL线(将SCL引脚配置为开漏输出并拉高)。2) 软件层面,在中断或轮询中监控I2C状态寄存器(如I2C_SR1的AF、BERR位),若检测到错误或超时标志,立即执行总线恢复序列:发送9个时钟脉冲(通过GPIO模拟)以释放从机,再复位外设。3) 配置NVIC优先级,确保超时中断能抢占I2C中断,避免死锁嵌套。实操建议:使用HAL库时,可自定义一个超时回调函数,在HAL_I2C_Slave_Receive/Transmit的while循环中检查超时变量,超时后调用HAL_I2C_DeInit和HAL_I2C_Init。注意:时钟拉伸超时值应大于主机最坏响应时间(如100ms),避免误触发。
mcuku 阿沐 · 2026-08-27