STM32 USB AUDIO 基础篇①——通过STM32CubeMX生成USB Speaker音频播放Demo(史上最简单)

本文详细介绍了基于STM32F407探索者开发板的音频播放系统实现,通过STM32CubeMX配置RCC、SYS、I2C1、USART1、USB_OTG_FS和I2S2等模块,并使用WM8978音频处理器。在代码中实现了WM8978的初始化、设置和控制,以及USB设备库的使用,用于音频数据传输。程序流程包括初始化和播放流程,确保音频数据能够正确传输并播放。
摘要由CSDN通过智能技术生成

一、硬件原理

基于正点原子STM32F407探索者开发板,其中音频部分硬件原理图如下

其中WM8978是一款全功能音频处理器,STM32通过控制WM8978即可实现扬声器/喇叭的音频播放,麦克风的音频录制等功能。

主要控制两个接口

  • IIC控制接口,实现WM8978寄存器的读写
  • I2S数字音频接口,实现音频数据传输(接收和发送)
    在这里插入图片描述

二、STM32CubeMX配置

2.1 RCC

开发板外接了两个晶振

  • 8MHz的高速晶振
  • 32.768kHz的低速晶振

在这里插入图片描述

2.2 SYS

Debug Serial Wire
在这里插入图片描述

2.3 I2C1

  • GPIO口是PB8/PB9
    在这里插入图片描述
    在这里插入图片描述

2.4 USART1

  • 用来打印调试日志,波特率调到1000000,加快日志打印
  • Data Direction: Transmit Only
  • DMA Settings: USART1_TX
  • PA9 / PA10
    在这里插入图片描述
    在这里插入图片描述

2.5 USB_OTG_FS

  • Mode:Device Only
  • global interrupt 勾选
    在这里插入图片描述

2.6 I2S2

  • mode: Full-Duplex Master
  • Audio Frequency: 48KHz
  • DMA Setting: SPI2_TX / I2S2_EXT_RX
  • GPIO Setting
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

2.7 USB_DEVICE

  • Class For FS IP: Audio Device Class
  • USBD_AUDIO_FREQ: 48000 sample/s
  • 描述符有些部分可以自定义
    在这里插入图片描述
    在这里插入图片描述

2.8 Clock Configuration

在这里插入图片描述
在这里插入图片描述

2.9 Project Manager

  • 堆栈调大0x4000
    在这里插入图片描述

2.10 生成代码

  • 右上角 GENERATE CODE

三、代码完善

在这里插入图片描述

3.1 WM8978

main.c

  • main函数增加WM8978_Init();
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_I2C1_Init();
  MX_I2S2_Init();
  MX_USART1_UART_Init();
  MX_USB_DEVICE_Init();
  WM8978_Init();
  while (1)
  {
  }
}

wm8978.c

#define	DEVICE_ADDRESS						0x1A
#define	WIRTE_ADDRESS							(DEVICE_ADDRESS << 1 | 0)

extern I2C_HandleTypeDef hi2c1;

uint8_t WM8978_Write(uint8_t reg_addr, uint16_t data)
{
	uint8_t pData[10] =	{ 0 };

	pData[0] = (reg_addr << 1) | ((data >> 8) & 0x01);
	pData[1] = data & 0xFF;
	return HAL_I2C_Master_Transmit(&hi2c1, WIRTE_ADDRESS, pData, 2, 1000);
}

uint32_t WM8978_Init(void)
{
	WM8978_Reset();
	WM8978_Write(1, 0x0F);	// 模拟放大器使能, 使能输出输入缓存区
	WM8978_Write(3, 0x7F);	// 使能左右声道和L\ROUT2
	WM8978_Write(4, 0x10);	// I2S 16bit
	WM8978_Write(6, 0x00);	// MCU提供时钟
	WM8978_Write(10, 0x08);	// 输出音质最好
	WM8978_Write(43, 0x10);	// ROUT2反相
	WM8978_VolumeCtl(0x3F);
	return 0;
}

uint32_t WM8978_Reset(void)
{
	if(WM8978_Write(0, 0)!= HAL_OK)// 软复位
		return 1;
	HAL_Delay(10);
	return 0;
}

3.2 usbd_audio_if

  • AUDIO_AudioCmd_FS中对应AUDIO_CMD_STARTAUDIO_CMD_PLAYAUDIO_CMD_STOP的操作
  • HAL_I2S_TxCpltCallback对应传输完成的USB同步操作
extern I2S_HandleTypeDef hi2s2;
/**
  * @brief  Handles AUDIO command.
  * @param  pbuf: Pointer to buffer of data to be sent
  * @param  size: Number of data to be sent (in bytes)
  * @param  cmd: Command opcode
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t AUDIO_AudioCmd_FS(uint8_t* pbuf, uint32_t size, uint8_t cmd)
{
  switch(cmd)
  {
    case AUDIO_CMD_START:
		HAL_I2S_Transmit_DMA(&hi2s2, (uint16_t*)pbuf, size);
    break;

    case AUDIO_CMD_PLAY:
		HAL_I2S_Transmit_DMA(&hi2s2, (uint16_t*)pbuf, size);
    break;	

    case AUDIO_CMD_STOP:
    	HAL_I2S_DMAStop(&hi2s2);
    break;	
  }
  return (USBD_OK);
}

void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
{
	HalfTransfer_CallBack_FS();
}

void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s)
{
	TransferComplete_CallBack_FS();
}

四、程序流程图

4.1 初始化流程

main hal库 stm32f4xx_hal_map wx8978 usb_device STM32_USB_DEVICE_Library HAL_Init() SystemClock_Config() HAL_Delay(100) MX_GPIO_Init() MX_DMA_Init() MX_I2C1_Init() HAL_I2C_Init() HAL_I2C_MspInit() MX_I2S2_Init() HAL_I2S_Init() HAL_I2S_MspInit() WM8978_Init() MX_USB_DEVICE_Init() USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) USBD_RegisterClass(&hUsbDeviceFS, &USBD_AUDIO) USBD_AUDIO_RegisterInterface(&hUsbDeviceFS, &USBD_AUDIO_fops_FS) USBD_Start(&hUsbDeviceFS) HAL_Delay(100) while(1) main hal库 stm32f4xx_hal_map wx8978 usb_device STM32_USB_DEVICE_Library

4.2 播放流程

STM32_USB_DEVICE_Library usbd_audio_if hal库 AudioCmd(uint8_t *pbuf, uint32_t size, uint8_t cmd) HAL_I2S_Transmit_DMA STM32_USB_DEVICE_Library usbd_audio_if hal库

觉得好,就一键三连呗(点赞+收藏+关注)

  • 14
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
STM32CubeMX是一款官方提供的基于图形界面的STM32芯片初始化配置工具,可以方便快捷地配置STM32芯片的各种功能和参数。使用STM32CubeMX可以打开软件并选择对应的芯片型号,然后选择需要配置的器件并进行相应的配置,最后生成初始化代码并导出到开发工具中。在开发工具中编写应用程序代码,调用相应的库函数即可控制STM32芯片的各个功能。\[1\] 关于USB配置方面,根据引用\[3\]的描述,不同的STM32芯片在配置USB部分时有一些差异。例如,对于STM32F103ZET6、STM32F411CEU和STM32F407VET6等芯片,音频数据发送给DAC使用的是I2S外设;而对于STM32F429IGT6、STM32H743IIT6和STM32H750VBT6等芯片,可以选择使用SAI外设来发送音频数据。具体的USB配置细节可以根据具体的芯片型号和需求进行相应的配置。 #### 引用[.reference_title] - *1* [如何用 STM32CubeMX 配置](https://blog.csdn.net/weixin_42587866/article/details/129453181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32 USB声卡 CUBEMX配置 极简配置十分钟解决 STM32+PCM5102A](https://blog.csdn.net/Fairchild_1947/article/details/122749740)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小康师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值