之前做了一个使用STM32的DAC功能播放音频的项目,其中与官方例程不同的是,我采用了DMA功能搬运数据。
CubeMX配置
这一部分没什么好说的,使用CubeMX勾选相应的选项
首先是DAC功能,在DMA功能选项卡下绑定DMA通道,在DMA配置里面数据宽度选择Byte

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

播放音乐
这里通过HAL库开启DMA的搬运
1 | HAL_DAC_Start_DMA( |
然而你会发现这个函数会返回错误
这个错误其实是CubeMX的bug
CubeMX生成的初始化代码的顺序有误:其默认的顺序是先初始化DAC后初始化DMA功能,导致DAC初始化的时候DMA没有准备好
这里在CubeMX -> Project Manager -> Advanced Settings里面调整顺序:

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