排查此类问题需从触发时序与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