项目场景:
项目场景:
STM32F407DAC+TIM触发+DMA进行语音输出,输出语音为四个字(开始和停止)
问题描述
提示:这里描述项目中遇到的问题:
运行过程中会出现语音丢字情况(“开始”和“停止”只输出“始”或只输出“停”),Debug发现DMA下溢错误
原因分析:
提示:这里填写问题的分析:
第一步:查看头文件定义,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()后再开启定时器。
卡了一个星期的问题解决,特此记录,希望帮助到有同样问题的人。