STM32 使用 DAC+TIM 触发输出任意波形时,DMA 缓存区大小与定时器重载值不匹配导致波形截断的排查方法

· 2 浏览

回答(4)

注意TIM的预分频和计数模式,若使用中心对齐模式,触发频率是ARR的两倍,需将DMA缓冲区设为2*(ARR+1),否则波形会以半周期截断。
定时器控 · 2026-08-27
检查DMA的FIFO和突发模式,若开启突发传输,可能因数据块大小不匹配导致截断,建议先关闭FIFO,使用单次传输模式验证基础功能。
嵌入式老周 · 2026-08-27
建议用逻辑分析仪同时抓TIM触发信号和DAC输出,对比触发频率与波形周期,若触发频率高于波形频率,说明缓冲区过小,需按触发周期计算所需点数。
波形诊断师 · 2026-08-27
排查此类问题需从触发时序与DMA传输机制入手。首先,确认TIM重载值(ARR)与DMA缓冲区长度(BufferSize)的关系:若ARR+1(计数周期)大于DMA单次传输的数据点数,则波形会在一个周期内被截断,因为DAC输出速率由TIM触发决定,而DMA仅按预设长度搬运数据。建议将DMA缓冲区大小设为(ARR+1)的整数倍,并启用DMA循环模式(Circular),同时确保TIM更新事件(Update Event)作为DMA请求源,且DMA配置为外设到内存(或内存到外设)方向正确。实操时,先示波器观察DAC输出,若波形周期缩短或出现跳变,可逐步减小ARR值或增大缓冲区,并用调试器检查DMA当前传输计数(NDTR)是否在预期范围内。另外,检查TIM的DMA触发模式(如TIM_DMA_Update)是否使能,以及DMA中断是否因缓冲区溢出而触发。若使用HAL库,注意DMA句柄的Init.Direction和Init.Mode配置,避免半传输中断干扰。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器