【已解决】STM32F407DAC+TIM触发+DMA进行语音输出,出现DMA下溢错误

项目场景:

项目场景:
STM32F407DAC+TIM触发+DMA进行语音输出,输出语音为四个字(开始和停止)


问题描述

提示:这里描述项目中遇到的问题:

运行过程中会出现语音丢字情况(“开始”和“停止”只输出“始”或只输出“停”),Debug发现DMA下溢错误
debug模式下DAC结构体状态


原因分析:

提示:这里填写问题的分析:

第一步:查看头文件定义,HAL_DAC_STATE_ERROR为在这里插入图片描述
第二步:搜索hdac->State = HAL_DAC_STATE_ERROR;在DAC中断服务函数里,只有DAC_FLAG_DMAUDR1(DMA_underrun)为1时,才会出现HAL_DAC_STATE_ERROR,
在这里插入图片描述
第三步:查看官方手册,出现的原因为:当前所选触发源以高于 DMA 服务能力的频率驱动DAC 1 通道转换。这里有两种情况1)触发源(我这里是定时器)触发频率太快,DMA传输慢导致;2)DMA传输速度慢,或者传输过程中被打断(被打断的情况只会是被DMA高优先级的打断)
在这里插入图片描述
第四步:分析自己代码,首先排查定时器更新频率(触发源),我的定时器更新频率(触发频率)是62.5us,DAC转换速度最慢是6us,加上DMA传输时间,完全来得及在下一次触发前传输并转换完成。排查DMA传输速度,dma传输1个AHB时钟(频率168MHZ)的时间,也没问题。

第五步:分析整体语音输出过程,通过HAL_DAC_Start_DMA()函数把要转换的语音数组从寄存器搬运到外设,又由定时器触发dac转换,然后定时器开启了自动重装载,一直在触发,但是DMA搬运完成后会自动关闭DMA传输,所以会导致触发源频率高于DMA服务能力情况。


解决方案:

提示:这里填写该问题的具体解决方案:

在DAC转换完成回调函数里关闭定时器,在HAL_DAC_Start_DMA()后再开启定时器。
在这里插入图片描述
在这里插入图片描述
卡了一个星期的问题解决,特此记录,希望帮助到有同样问题的人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值