在STM32的I2C从机模式下,时钟拉伸(SCL被拉低)是主机等待从机响应的正常机制,但若从机因软件异常或中断延迟未能及时释放SCL,可能导致总线死锁。硬件超时机制的关键是利用I2C外设的TIMEOUT寄存器(I2C_TIMEOUTR)和独立的超时检测电路。首先,使能I2C的时钟超时功能(I2C_CR1的TIMOUTEN位),并配置TIMEOUTA或TIMEOUTB的值(以SCL时钟周期为单位),同时设置TIDLE位选择空闲或总线忙时的超时条件。当SCL被拉低超过设定时间,硬件会自动产生超时中断(TIMEOUT标志),并可选地复位I2C外设(通过设置I2C_CR1的SWRST位在中断服务程序中执行)。实操建议:在初始化时,根据I2C时钟频率(如100kHz或400kHz)计算超时值,通常设为10-20个SCL周期(例如100kHz下100-200μs),确保覆盖正常从机处理时间,同时避免过长导致死锁。在超时中断服务函数中,清除标志、释放SCL(通过配置CR1的START位或软件复位),并重新初始化I2C从机状态机。此外,可配合看门狗(IWDG)作为最后防线,但硬件超时是首选,因为它不依赖CPU响应。
mcuku 阿沐 · 2026-08-27