打印
[STM32F4]

DAC DMA停止和启动之间的差距

[复制链接]
365|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
封存into|  楼主 | 2025-6-26 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AC, DAC, DM, DMA
我有一个1000字节的数组,在HAL_DAC_START_DMA函数中调用,启动DAC DMA触发定时器。在DAC DMA的半完成回调时,我从SD卡内的文件中读取下一个1000字节,在完成DAC DMA回调时,停止触发计时器,停止DAC DMA并将新的1000字节重新加载到HAL_DAC_START_DMA函数中,然后再次启动计时器。
// audio out function main bitsmemset((void *) DacAudioBuffer.Audio16BitBuffer, 0, sizeof(DacAudioBuffer.Audio16BitBuffer));memcpy((void *) DacAudioBuffer.Audio16BitBuffer, (void *) DacAudioBuffer.Temp16AudioBuffer, sizeof(DacAudioBuffer.Temp16AudioBuffer)); HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *) DacAudioBuffer.Audio16BitBuffer, BuffSize, DAC_ALIGN_12B_R);HAL_TIM_Base_Start_IT(&htim2); // DAC DMA half out call backIsDacDataHalfOut = TRUE; // DAC DMA complete call backif(HAL_TIM_Base_Stop_IT(&htim2) == HAL_OK) {         if(HAL_DAC_Stop_DMA(hdac, DAC_CHANNEL_1) == HAL_OK) {}         IsDacDataCpltOut = TRUE;}
我的主要问题是,当我停止计时器和重新启动它之间有一个时间差。
我从文件中阅读的数据是音频字节,希望这些波形能完美地融合在一起,但随着时间的推移,时间差变得越来越大。如下图
请教如何解决

使用特权

评论回复
沙发
xiaoqizi| | 2025-7-3 18:31 | 只看该作者
DMA 停止后,DAC 输出会保持最后一个数据值,直到 DMA 重新启动并填充新数据

使用特权

评论回复
板凳
木木guainv| | 2025-7-3 20:50 | 只看该作者
DMA 停止/启动需要 软件干预,耗时约 几微秒~几十微秒

使用特权

评论回复
地板
Jiangxiaopi| | 2025-7-3 23:07 | 只看该作者
硬件状态不同步的常见表现为DMA 传输完成标志(TC)未正确清除,DAC 未及时进入空闲状态,缓冲区指针未复位到起始地址

使用特权

评论回复
5
荣陶陶| | 2025-7-4 09:22 | 只看该作者
// 在 DMA 传输一半和完成中断中切换缓冲区
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)buf0, 256, DAC_ALIGN_12B_R);
// 在中断中动态修改缓冲区地址

使用特权

评论回复
6
Zhiniaocun| | 2025-7-4 11:41 | 只看该作者
使用 DAC 内置 FIFO可以在 DMA 暂停期间由 FIFO 维持输出

使用特权

评论回复
7
Zuocidian| | 2025-7-4 13:56 | 只看该作者
避免完全停止 DMA,改用 动态缓冲区更新

使用特权

评论回复
8
Puchou| | 2025-7-4 16:20 | 只看该作者
// 暂停时降低 TIMER 频率以减少数据消耗
__HAL_TIM_SET_AUTORELOAD(&htim6, new_reload_value);

使用特权

评论回复
9
Xiashiqi| | 2025-7-4 18:32 | 只看该作者
可以使用软件做补偿,比如:
// 在停止前写入一个渐变到 0 的序列
for(int i=0; i<10; i++) {
    HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ramp_down[i]);
    HAL_Delay(1);
}

使用特权

评论回复
10
小海师| | 2025-7-4 20:50 | 只看该作者
通过合理选择硬件特性和软件策略,可将 DAC DMA 启停间隙控制在 <1μs 级别

使用特权

评论回复
11
Haizangwang| | 2025-7-4 23:01 | 只看该作者
不同的模式下,他们的区别是不一样的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

90

帖子

0

粉丝