前言
使用STM32F407基于CubeMX搭建的简单USB AUDIO 1.0。
该工程只有扬声器输出,没有麦克风输入。
采样率为48k,2通道,2字节模式,16bit。
USB接收PCM音频流数据存放在缓冲区,再用DMA通过I2S发送音频流数据到DAC芯片进行解码,最后输出模拟信号到耳机或音响等设备。
一、开发环境
开发板:正点原子STM32F407ZGT6最小系统板
芯片:STM32F407ZGT6
CubeMX版本:6.13.0
keil 5版本:V5.41.0.0
ARM Compiler:V5.06
二、CubeMX配置
1.IO配置
根据实际使用的芯片和开发板分别配置晶振,usb,i2s相关引脚,以下是正点原子STM32F407ZGT6最小系统板的配置
2.USB配置
打开USB FS功能
选择CubeMX自带的软件包
3.I2S配置
配置I2S,采样率需与USB配置的采样率一致。
CubeMX生成的usb audio数据默认是16bit,故这里也选择16bit。
这里选用PLL时钟,会存在一些误差。(这里显示误差较大的往下看时钟树配置)
配置DMA
4.时钟树配置
先配置好I2S的时钟,尽量是采样率的整数倍,误差会比较小。
可以先关闭USB功能,然后I2S时钟填采样率的整数倍,CubeMX会自动配置最接近的值。
I2S时钟配置完后再配置USB时钟。
5.keil工程修改
5.1 重定义DMA半发送和发送完成回调函数并调用HalfTransfer_CallBack_FS和TransferComplete_CallBack_FS
5.2 在AUDIO_AudioCmd_FS的启动和播放这里添加DMA I2S发送函数
5.3 更改缓冲区大小
若ram不够,可以把包数量改小,这里修改为10
5.4 更改usb描述符
根据实际需求更改VID,PID,字符串等配置。
若当前usb audio配置与之前的不一样,如采样率由44100更改为48000,可能导致设备无法正常工作,可以在设备管理器卸载设备然后重新连接,或直接更改未使用过的VID,PID即可。
6.(可选)使用外部晶振作为I2S的输入时钟
有音频时钟的,可以选择外部音频时钟作为I2S的输入时钟,如48000*1024 = 49.152MHz晶振
配置I2S输入时钟IO
时钟树配置
总结
正点原子STM32F407ZGT6最小系统板上的接线图
上面那些配置完成后,下载程序到芯片上,连接DAC芯片,接上耳机或音响等设备,然后PC端选择STM32扬声器即可正常播放音频。