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_IRQn
HAL_I2C_Master_Transmit_DMA (DMA) 必须开启 虽然数据由DMA搬运,但协议状态机仍靠中断驱动,必须使能 I2C1_EV_IRQn
相关推荐
陈 洪 伟1 天前
大模型推理引擎vLLM(30):由一个GLM5 bug,整理MLP中的SwiGLU、算子融合、量化相关问题
bug·mlp·vllm
不断学习加努力4 天前
使用rviz2进行可视化时,cpu资源占用过高的bug
bug
happyness444 天前
如何利用 AI 自动编写单元测试(Unit Test)来捕捉隐藏的边缘情况 Bug?
人工智能·单元测试·bug
深念Y4 天前
Windows幽灵端口占用:HNS如何无声偷走你的端口
windows·python·bug·环境·端口·特权
AI多Agent协作实战派8 天前
AI多Agent协作系统实战(二十二):从6列到12列——任务监控报告的进化之路
java·人工智能·uni-app·bug
自然 醒8 天前
记录We码开发者工具的一个bug
前端·javascript·bug
GeekArch9 天前
第28讲:避坑——AI堆栈分配错误、栈溢出BUG
c语言·人工智能·stm32·mcu·学习·bug
AI多Agent协作实战派9 天前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug
尸僵打怪兽9 天前
Claude-code命令行无法下载插件
bug·插件·claude-code