STM32 USB AUDIO系列 (一) 48k采样率 0进2出 16bit


前言

使用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最小系统板的配置
CubeMX IO 配置

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扬声器即可正常播放音频。
在这里插入图片描述

程序下载

程序下载

<think>好的,我现在要帮用户了解如何使用STM32通过I2S行音频采集,需要给教程和示例代码。首先,我应该回顾下用户提供的引用资料。引用[1]是关于STM32音频播放的,而引用[2]则提到了STM32F4xx的I2S DMA双缓冲配置,特别是使用了ES7243录音芯片。用户的问题集中在音频采集方面,所以重点应该放在配置I2S接口和DMA传输上。 首先,我需要确定使用哪个STM32型号。用户提到的示例是STM32F401,所以我会基于这个型号行说明。接下来,配置I2S模块,需要设置为主模式接收,因为STM32需要从外部音频设备接收数据。时钟极性和相位需要与外设(如ES7243)匹配,这部分可能需要查阅数据手册。 然后是DMA的配置。使用双缓冲可以减少数据丢失的风险,提高效率。双缓冲意味着有两个内存区域,当DMA填充其中个时,应用程序可以处理另个。需要设置DMA为循环模式,并正确配置数据宽度和传输方向。 接下来是示例代码的结构。可能需要使用STM32CubeMX生成的初始化代码,然后添加数据处理的回调函数。在代码中,需要启动I2S和DMA,并在DMA传输完成中断中处理数据。例如,当半缓冲或全缓冲填满时,触发中断,行数据存储或处理。 还需要考虑外设的连接,比如ES7243的配置。可能需要通过I2C或GPIO来设置录音芯片的工作模式,确保其输数据到I2S接口。这部分可能需要初始化I2C外设,并发送相应的配置命令。 另外,用户可能需要了解如何调试和验证音频采集是否正常工作。比如使用调试器查看缓冲区数据,或者通过串口输日志。还要注意采样率、数据格式(16位、24位等)是否匹配,否则会导致数据错误。 最后,确保代码符合STM32的标准库或HAL库的使用规范,避免常见的错误,比如未正确使能时钟或中断配置错误。需要提醒用户根据实际硬件调整引脚和配置参数,并提供相关资源链接供步参考。</think>### STM32 I2S音频采集实现步骤 #### 、硬件配置要点 1. 选择支持I2S协议的STM32系列(如F4/F7/H7系列2. 连接音频编解码器(如ES7243)的I2S接口: - WS(字选择):对应STM32的I2S_WS引脚 - SCK(串行时钟):对应I2S_CK引脚 - SD(数据线):对应I2S_SD引脚 3. 配置MCU时钟树保证I2S时钟精度(通常使用PLLI2S时钟源) #### 二、CubeMX配置流程 1. 在Connectivity中启用I2S外设: ```c Mode: Master Receiver Full-Duplex Standard: Philips Data Format: 16/24/32-bit(需与编解码器匹配) ``` 2. 配置DMA双缓冲: ```c Direction: Peripheral To Memory Mode: Circular Data Width: HalfWord/Word(根据实际数据宽度选择) ``` #### 三、核心代码实现(基于HAL库) ```c // DMA缓冲区定义 #define AUDIO_BUFFER_SIZE 4096 __attribute__((section(".dma_buffer"))) uint16_t audioBuffer[AUDIO_BUFFER_SIZE * 2]; // 双缓冲 // I2S初始化 void MX_I2S2_Init(void) { hi2s2.Instance = SPI2; hi2s2.Init.Mode = I2S_MODE_MASTER_RX; hi2s2.Init.Standard = I2S_STANDARD_PHILIPS; hi2s2.Init.DataFormat = I2S_DATAFORMAT_24B; hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE; hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_48K; HAL_I2S_Init(&hi2s2); } // DMA启动函数 void StartAudioRecord(void) { HAL_I2S_Receive_DMA(&hi2s2, audioBuffer, AUDIO_BUFFER_SIZE*2); } // DMA传输完成回调 void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s) { // 处理前半缓冲区数据 ProcessAudioData(audioBuffer, AUDIO_BUFFER_SIZE); } void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s) { // 处理后半缓冲区数据 ProcessAudioData(audioBuffer + AUDIO_BUFFER_SIZE, AUDIO_BUFFER_SIZE); } ``` #### 四、关键参数说明 1. 采样率计算公式: $$f_{sampling} = \frac{I2S\_clock}{32 \times channel\_length}$$ 其中$channel\_length$为单声道16bit时为16,立体声时为32[^2] 2. 双缓冲工作机制: $$Buffer\_Size = N \times (Word\_Width/8) \times Channel\_Count$$ 当使用24bit立体声时,每个采样点占用6字节 #### 五、调试要点 1. 使用逻辑分析仪验证I2S时序 2. 检查DMA中断触发频率是否符合预期 3. 通过内存查看器确认音频数据有效性 4. 注意电源噪声对音频质量的影响
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值