天天看點

STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖

文章目錄

  • 一、硬體原理
  • 二、STM32CubeMX配置
    • 2.1 RCC
    • 2.2 SYS
    • 2.3 I2C1
    • 2.4 USART1
    • 2.5 USB_OTG_FS
    • 2.6 I2S2
    • 2.7 USB_DEVICE
    • 2.8 Clock Configuration
    • 2.9 Project Manager
    • 2.10 生成代碼
  • 三、代碼完善
    • 3.1 WM8978
    • 3.2 usbd_audio_if
  • 四、程式流程圖
    • 4.1 初始化流程
    • 4.2 播放流程

一、硬體原理

基于正點原子STM32F407探索者開發闆,其中音頻部分硬體原理圖如下

其中WM8978是一款全功能音頻處理器,STM32通過控制WM8978即可實作揚聲器/喇叭的音頻播放,麥克風的音頻錄制等功能。

主要控制兩個接口

  • IIC控制接口,實作WM8978寄存器的讀寫
  • I2S數字音頻接口,實作音頻資料傳輸(接收和發送)
    STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖

二、STM32CubeMX配置

2.1 RCC

開發闆外接了兩個晶振

  • 8MHz的高速晶振
  • 32.768kHz的低速晶振
STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖

2.2 SYS

Debug Serial Wire

STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖

2.3 I2C1

  • GPIO口是PB8/PB9
    STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖
    STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖

2.4 USART1

  • 用來列印調試日志,波特率調到1000000,加快日志列印
  • Data Direction: Transmit Only
  • DMA Settings: USART1_TX
  • PA9 / PA10
    STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖
    STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖

2.5 USB_OTG_FS

  • Mode:Device Only
  • global interrupt 勾選
    STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖

2.6 I2S2

  • mode: Full-Duplex Master
  • Audio Frequency: 48KHz
  • DMA Setting: SPI2_TX / I2S2_EXT_RX
  • GPIO Setting
    STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖
    STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖
    STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖

2.7 USB_DEVICE

  • Class For FS IP: Audio Device Class
  • USBD_AUDIO_FREQ: 48000 sample/s
  • 描述符有些部分可以自定義
    STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖
    STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖

2.8 Clock Configuration

STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖
STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖

2.9 Project Manager

  • 堆棧調大0x4000
    STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖

2.10 生成代碼

  • 右上角

    GENERATE CODE

三、代碼完善

STM32 USB AUDIO 基礎篇①——通過STM32CubeMX生成USB Speaker音頻播放Demo(史上最簡單)一、硬體原理二、STM32CubeMX配置三、代碼完善四、程式流程圖

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_START

    AUDIO_CMD_PLAY

    AUDIO_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 初始化流程

4.2 播放流程

覺得好,就一鍵三連呗(點贊+收藏+關注)

繼續閱讀