在STM32的I2C从机模式下,时钟拉伸(Clock Stretching)是SCL被从机拉低以暂停通信的机制,但若主机异常或从机固件卡死,可能导致总线永久占用。硬件超时机制的核心是利用I2C外设的TIMEOUT寄存器(I2C_TIMEOUTR)和独立的超时计数器。具体操作:1)使能I2C超时功能(I2C_TIMEOUTR的TIMOUTEN位),并配置超时值(如基于APB时钟的周期),同时选择超时检测模式(SCL低电平超时或SDA低电平超时);2)在中断或事件回调中,检测超时标志(TIMEOUT),若触发则复位I2C外设(如调用__HAL_I2C_RESET_HANDLE)并重新初始化,释放SCL线;3)建议将超时值设为略大于最大合法时钟拉伸时间(如从机处理时间+余量),避免误触发。实操中,还需注意在从机处理数据时避免长时间占用SCL,可配合DMA或中断快速响应。若使用HAL库,可启用HAL_I2C_ErrorCallback处理超时错误。
mcuku 阿沐 · 2026-08-27