解决STM32 DAC DMA功能错误

之前做了一个使用STM32DAC功能播放音频的项目,其中与官方例程不同的是,我采用了DMA功能搬运数据。

CubeMX配置

这一部分没什么好说的,使用CubeMX勾选相应的选项

首先是DAC功能,在DMA功能选项卡下绑定DMA通道,在DMA配置里面数据宽度选择Byte

image-20211103095907633

然后配置TIM6定时器,定时器频率根据系统时钟和音频采样率进行计算:

image-20211103100032732

播放音乐

这里通过HAL库开启DMA的搬运

1
2
3
4
5
6
7
HAL_DAC_Start_DMA(
&hdac,
DAC_CHANNEL_1,
(uint32_t*)audio_buffer,
audio_buf[audio_flip].len,
DAC_ALIGN_8B_R
);

然而你会发现这个函数会返回错误

这个错误其实是CubeMXbug

CubeMX生成的初始化代码的顺序有误:其默认的顺序是先初始化DAC后初始化DMA功能,导致DAC初始化的时候DMA没有准备好

这里在CubeMX -> Project Manager -> Advanced Settings里面调整顺序:

image-20211103100955316

MX_DAC_Init移动到MX_DMA_Init下方后重新生成代码发现程序能够正常工作了!