在STM32的I2C从机模式下,时钟延展是主机拉低SCL以等待从机准备数据的机制。为避免死锁,中断优先级配置需确保I2C事件中断(如EVT)和错误中断(ERR)的优先级高于可能阻塞它们的任务中断,但低于系统关键中断(如SysTick)。实操建议:1) 使用NVIC将I2C1_EV_IRQn和I2C1_ER_IRQn设为抢占优先级1(若系统优先级分组为4,则子优先级为0),而普通外设中断设为2或3,确保I2C能及时响应。2) 在I2C中断服务函数中,避免调用阻塞函数(如HAL_Delay),并快速处理数据,若需耗时操作,可先关闭I2C中断,处理完再恢复,但需注意时钟延展超时风险。3) 启用I2C超时检测(如HAL的I2C_TIMEOUT),并配置AFIO或DMA以减少CPU占用。4) 若使用HAL库,确保在回调函数中不执行长时间任务,并考虑使用中断嵌套(设置NVIC优先级分组为2,使I2C可抢占其他中断)。最后,通过逻辑分析仪验证时序,确保主机延展时间在从机处理能力内。
mcuku 阿沐 · 2026-08-27