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
相关推荐
kyle~16 小时前
机器人通信 --- FANUC TCP 并发请求-响应错位 Bug 复盘
tcp/ip·机器人·bug
鬼手点金3 天前
Harness 工程:模型之外的竞争力
服务器·人工智能·深度学习·机器学习·bug
巴巴媛6664 天前
【Debug1】程序死机,while(1)循环,怎么办?
c语言·笔记·stm32·嵌入式硬件·bug
JosieBook6 天前
【多线程】两台机器同时抢一个字典:一次并发 Bug 的排查
java·网络·bug
鬼手点金6 天前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
小玮看世界7 天前
【Bug 报告】腾讯元宝 Windows 客户端 v2.88.1 新建对话卡死、界面残留与输入框乱码
bug
衣舞晨风7 天前
一次升级引出两个BUG:API7 AI 网关流式 500 与低流量 CPU 打满排查
网关·ai·bug·异常排查
小此方12 天前
「插曲:Git」企业规范篇:DevOps开发模型、Git Flow五类分支设计与测试/预发布/生产环境Bug修复及Hotfix紧急发布流程
git·bug·devops
中文英文-我选中文13 天前
FreeRTOS 玄学Bug:调换任务创建顺序,程序时而正常、时而死机(栈溢出内存踩踏深度复盘)
bug
Keven_1114 天前
BUG:UVA116
算法·bug·图论