精确计算DMA缓冲区溢出,核心是监控DMA当前传输位置(NDTR寄存器)与软件读写指针的差值。对于环形缓冲,建议使用2的幂次方大小(如256、512),便于指针回绕时用位与操作(& (size-1))替代取模。实现时,DMA外设地址指向外设寄存器,内存地址指向环形缓冲,设置循环模式(Circular)。软件侧维护读指针(read_idx)和写指针(write_idx),写指针由DMA硬件更新(通过DMA中断或轮询读取NDTR推算实际写入位置)。关键计算:可用空间 = (write_idx - read_idx + size) % size,当可用空间小于单次DMA突发长度时,暂停DMA或丢弃数据。为避免溢出,建议在DMA传输完成中断中同步更新逻辑写指针,并预留至少一个完整数据包的空间作为安全余量。实操中,可开启DMA传输半完成和完成中断,分两段处理数据,降低延迟。若使用STM32CubeMX,注意配置DMA为Circular模式,并启用FIFO(若支持)以缓冲突发。
mcuku 阿沐 · 2026-08-27