You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32 HAL库I2C DMA传输正常但TCIF标志未触发DMA中断问题

I2C DMA传输完成标志TCIF未触发故障排查

以下是该故障的常见原因:

  • DMA传输完成中断未使能:初始化阶段未调用__HAL_DMA_ENABLE_IT(&hdma_i2c2_rx, DMA_IT_TC)开启传输完成中断,或是CubeMX配置时未勾选对应DMA通道的TC中断选项,中断从硬件层面被屏蔽,自然无法触发。
  • DMA通道与标志位不匹配:你的代码使用DMA1_Channel1的中断处理函数、判断DMA_FLAG_TC1标志,但绑定的是I2C2_RX的DMA。请核对所用MCU的DMA通道映射表,多数STM32型号中I2C2_RX的默认DMA通道并非DMA1_Channel1,若实际传输使用的是其他通道,Channel1的TC1标志自然不会置位。比如STM32F1系列中I2C2_RX对应DMA1_Channel5,错误绑定通道就会出现该问题。
  • 传输长度配置异常:启动DMA传输时传入的长度参数,与DMA初始化时配置的NDTR寄存器值不匹配,或是配置的传输长度大于实际需要的字节数,DMA尚未完成预设的全部传输,自然不会触发TC标志。你观测到的读取数据正确,只是前N个字节已经传输完成的表象。
  • DMA配置为循环模式:若DMA初始化时开启了循环传输模式,部分场景下如果未正确配置中断回调逻辑,也可能出现TC标志被硬件自动重置、无法被捕获的问题。
  • 标志位被更高优先级中断提前清除:如果同时开启了I2C事件中断,且I2C中断优先级高于DMA中断,HAL库的HAL_I2C_EV_IRQHandler处理接收完成事件时,会主动清除对应DMA的TC标志,导致DMA中断触发时标志位已经被清空,看起来就像TCIF从未触发。
  • NVIC配置错误:未在NVIC中开启对应DMA通道的中断,或是优先级配置不符合要求,即使DMA外设的TC标志已经置位,中断信号也无法上报到内核,无法进入中断服务函数。
  • 标志位判断逻辑错误:不同DMA控制器的标志位寄存器偏移不同,若hdma_i2c2_rx实际绑定的是DMA2的通道,却判断DMA1的TC1标志,必然无法读到正确的标志位。建议调试时直接读取DMA对应ISR寄存器的值,确认TC位是否真的未置位,排除判断逻辑错误的可能。

内容的提问来源于stack exchange,提问作者ozie.embdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:00:05