BUG(记录)

📅 2026/7/30 3:55:55
BUG(记录)
一.关于I2C使用DMA传输数据DMA已经开启但是发送数据存在问题回调函数进不去。二.调试打断点发现中断进不去三.换用轮询就可以执行四.原因未启用event事件中断以你调用的 HAL_I2C_Master_Transmit_DMA 为例整个流程是这样的启动传输你调用 HAL_I2C_Master_Transmit_DMA这个函数会启动DMA并触发I2C外设产生一个“起始条件已发送”的中断事件。事件中断处理当这个中断事件发生时必须有一个中断服务函数ISR来处理它。这个ISR就是 I2C1_EV_IRQHandler名字可能因MCU系列略有不同。而在这个ISR内部必须调用 HAL_I2C_EV_IRQHandler 函数。内部状态机运转HAL_I2C_EV_IRQHandler 内部实现了一个状态机。它会检查当前发生了什么事件是起始条件还是地址已发送还是数据已发完然后执行对应的硬件操作比如将设备地址写入数据寄存器、读取状态寄存器来清除标志位等。最终回调当整个传输过程结束包括最后一个数据字节也已由DMA搬运完成并且I2C总线的停止条件也成功发送后I2C_EV_IRQHandler内部的状态机才会最终调用你的用户回调函数HAL_I2C_MasterTxCpltCallback。此时你的g_I2C1_TxCplt 标志才会被置1。五.总结传输函数是否需要I2C事件中断说明HAL_I2C_Master_Transmit(阻塞)不需要函数内部用循环等待标志位CPU全程占用不产生中断HAL_I2C_Master_Transmit_IT(中断)必须开启传输过程靠中断驱动必须使能I2C1_EV_IRQnHAL_I2C_Master_Transmit_DMA(DMA)必须开启虽然数据由DMA搬运但协议状态机仍靠中断驱动必须使能I2C1_EV_IRQn