日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2024/3/7 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 USB AUDIO 基础篇①——通过STM32CubeMX生成USB Speaker音频播放Demo(史上最简单) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、硬件原理
  • 二、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探索者開發(fā)板,其中音頻部分硬件原理圖如下

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

主要控制兩個接口

  • IIC控制接口,實現(xiàn)WM8978寄存器的讀寫
  • I2S數(shù)字音頻接口,實現(xiàn)音頻數(shù)據(jù)傳輸(接收和發(fā)送)

二、STM32CubeMX配置

2.1 RCC

開發(fā)板外接了兩個晶振

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

2.2 SYS

Debug Serial Wire

2.3 I2C1

  • GPIO口是PB8/PB9

2.4 USART1

  • 用來打印調(diào)試日志,波特率調(diào)到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

  • 堆棧調(diào)大0x4000

2.10 生成代碼

  • 右上角 GENERATE CODE

三、代碼完善

3.1 WM8978

main.c

  • main函數(shù)增加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); // 模擬放大器使能, 使能輸出輸入緩存區(qū)WM8978_Write(3, 0x7F); // 使能左右聲道和L\ROUT2WM8978_Write(4, 0x10); // I2S 16bitWM8978_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 初始化流程

#mermaid-svg-Pg3ARxCGXRAfsWjh .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .label text{fill:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .node rect,#mermaid-svg-Pg3ARxCGXRAfsWjh .node circle,#mermaid-svg-Pg3ARxCGXRAfsWjh .node ellipse,#mermaid-svg-Pg3ARxCGXRAfsWjh .node polygon,#mermaid-svg-Pg3ARxCGXRAfsWjh .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Pg3ARxCGXRAfsWjh .node .label{text-align:center;fill:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .node.clickable{cursor:pointer}#mermaid-svg-Pg3ARxCGXRAfsWjh .arrowheadPath{fill:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-Pg3ARxCGXRAfsWjh .flowchart-link{stroke:#333;fill:none}#mermaid-svg-Pg3ARxCGXRAfsWjh .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-Pg3ARxCGXRAfsWjh .edgeLabel rect{opacity:0.9}#mermaid-svg-Pg3ARxCGXRAfsWjh .edgeLabel span{color:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-Pg3ARxCGXRAfsWjh .cluster text{fill:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-Pg3ARxCGXRAfsWjh .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Pg3ARxCGXRAfsWjh text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-Pg3ARxCGXRAfsWjh .actor-line{stroke:grey}#mermaid-svg-Pg3ARxCGXRAfsWjh .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .sequenceNumber{fill:#fff}#mermaid-svg-Pg3ARxCGXRAfsWjh #sequencenumber{fill:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh #crosshead path{fill:#333;stroke:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .messageText{fill:#333;stroke:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Pg3ARxCGXRAfsWjh .labelText,#mermaid-svg-Pg3ARxCGXRAfsWjh .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-Pg3ARxCGXRAfsWjh .loopText,#mermaid-svg-Pg3ARxCGXRAfsWjh .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-Pg3ARxCGXRAfsWjh .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-Pg3ARxCGXRAfsWjh .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Pg3ARxCGXRAfsWjh .noteText,#mermaid-svg-Pg3ARxCGXRAfsWjh .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-Pg3ARxCGXRAfsWjh .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-Pg3ARxCGXRAfsWjh .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-Pg3ARxCGXRAfsWjh .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-Pg3ARxCGXRAfsWjh .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Pg3ARxCGXRAfsWjh .section{stroke:none;opacity:0.2}#mermaid-svg-Pg3ARxCGXRAfsWjh .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-Pg3ARxCGXRAfsWjh .section2{fill:#fff400}#mermaid-svg-Pg3ARxCGXRAfsWjh .section1,#mermaid-svg-Pg3ARxCGXRAfsWjh .section3{fill:#fff;opacity:0.2}#mermaid-svg-Pg3ARxCGXRAfsWjh .sectionTitle0{fill:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .sectionTitle1{fill:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .sectionTitle2{fill:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .sectionTitle3{fill:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Pg3ARxCGXRAfsWjh .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-Pg3ARxCGXRAfsWjh .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Pg3ARxCGXRAfsWjh .grid path{stroke-width:0}#mermaid-svg-Pg3ARxCGXRAfsWjh .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-Pg3ARxCGXRAfsWjh .task{stroke-width:2}#mermaid-svg-Pg3ARxCGXRAfsWjh .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Pg3ARxCGXRAfsWjh .taskText:not([font-size]){font-size:11px}#mermaid-svg-Pg3ARxCGXRAfsWjh .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Pg3ARxCGXRAfsWjh .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-Pg3ARxCGXRAfsWjh .task.clickable{cursor:pointer}#mermaid-svg-Pg3ARxCGXRAfsWjh .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Pg3ARxCGXRAfsWjh .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Pg3ARxCGXRAfsWjh .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Pg3ARxCGXRAfsWjh .taskText0,#mermaid-svg-Pg3ARxCGXRAfsWjh .taskText1,#mermaid-svg-Pg3ARxCGXRAfsWjh .taskText2,#mermaid-svg-Pg3ARxCGXRAfsWjh .taskText3{fill:#fff}#mermaid-svg-Pg3ARxCGXRAfsWjh .task0,#mermaid-svg-Pg3ARxCGXRAfsWjh .task1,#mermaid-svg-Pg3ARxCGXRAfsWjh .task2,#mermaid-svg-Pg3ARxCGXRAfsWjh .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-Pg3ARxCGXRAfsWjh .taskTextOutside0,#mermaid-svg-Pg3ARxCGXRAfsWjh .taskTextOutside2{fill:#000}#mermaid-svg-Pg3ARxCGXRAfsWjh .taskTextOutside1,#mermaid-svg-Pg3ARxCGXRAfsWjh .taskTextOutside3{fill:#000}#mermaid-svg-Pg3ARxCGXRAfsWjh .active0,#mermaid-svg-Pg3ARxCGXRAfsWjh .active1,#mermaid-svg-Pg3ARxCGXRAfsWjh .active2,#mermaid-svg-Pg3ARxCGXRAfsWjh .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-Pg3ARxCGXRAfsWjh .activeText0,#mermaid-svg-Pg3ARxCGXRAfsWjh .activeText1,#mermaid-svg-Pg3ARxCGXRAfsWjh .activeText2,#mermaid-svg-Pg3ARxCGXRAfsWjh .activeText3{fill:#000 !important}#mermaid-svg-Pg3ARxCGXRAfsWjh .done0,#mermaid-svg-Pg3ARxCGXRAfsWjh .done1,#mermaid-svg-Pg3ARxCGXRAfsWjh .done2,#mermaid-svg-Pg3ARxCGXRAfsWjh .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-Pg3ARxCGXRAfsWjh .doneText0,#mermaid-svg-Pg3ARxCGXRAfsWjh .doneText1,#mermaid-svg-Pg3ARxCGXRAfsWjh .doneText2,#mermaid-svg-Pg3ARxCGXRAfsWjh .doneText3{fill:#000 !important}#mermaid-svg-Pg3ARxCGXRAfsWjh .crit0,#mermaid-svg-Pg3ARxCGXRAfsWjh .crit1,#mermaid-svg-Pg3ARxCGXRAfsWjh .crit2,#mermaid-svg-Pg3ARxCGXRAfsWjh .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-Pg3ARxCGXRAfsWjh .activeCrit0,#mermaid-svg-Pg3ARxCGXRAfsWjh .activeCrit1,#mermaid-svg-Pg3ARxCGXRAfsWjh .activeCrit2,#mermaid-svg-Pg3ARxCGXRAfsWjh .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-Pg3ARxCGXRAfsWjh .doneCrit0,#mermaid-svg-Pg3ARxCGXRAfsWjh .doneCrit1,#mermaid-svg-Pg3ARxCGXRAfsWjh .doneCrit2,#mermaid-svg-Pg3ARxCGXRAfsWjh .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-Pg3ARxCGXRAfsWjh .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-Pg3ARxCGXRAfsWjh .milestoneText{font-style:italic}#mermaid-svg-Pg3ARxCGXRAfsWjh .doneCritText0,#mermaid-svg-Pg3ARxCGXRAfsWjh .doneCritText1,#mermaid-svg-Pg3ARxCGXRAfsWjh .doneCritText2,#mermaid-svg-Pg3ARxCGXRAfsWjh .doneCritText3{fill:#000 !important}#mermaid-svg-Pg3ARxCGXRAfsWjh .activeCritText0,#mermaid-svg-Pg3ARxCGXRAfsWjh .activeCritText1,#mermaid-svg-Pg3ARxCGXRAfsWjh .activeCritText2,#mermaid-svg-Pg3ARxCGXRAfsWjh .activeCritText3{fill:#000 !important}#mermaid-svg-Pg3ARxCGXRAfsWjh .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Pg3ARxCGXRAfsWjh g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-Pg3ARxCGXRAfsWjh g.classGroup text .title{font-weight:bolder}#mermaid-svg-Pg3ARxCGXRAfsWjh g.clickable{cursor:pointer}#mermaid-svg-Pg3ARxCGXRAfsWjh g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Pg3ARxCGXRAfsWjh g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Pg3ARxCGXRAfsWjh .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-Pg3ARxCGXRAfsWjh .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-Pg3ARxCGXRAfsWjh .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Pg3ARxCGXRAfsWjh .dashed-line{stroke-dasharray:3}#mermaid-svg-Pg3ARxCGXRAfsWjh #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Pg3ARxCGXRAfsWjh #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Pg3ARxCGXRAfsWjh #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Pg3ARxCGXRAfsWjh #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Pg3ARxCGXRAfsWjh #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Pg3ARxCGXRAfsWjh #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Pg3ARxCGXRAfsWjh #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Pg3ARxCGXRAfsWjh #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Pg3ARxCGXRAfsWjh .commit-id,#mermaid-svg-Pg3ARxCGXRAfsWjh .commit-msg,#mermaid-svg-Pg3ARxCGXRAfsWjh .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Pg3ARxCGXRAfsWjh .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Pg3ARxCGXRAfsWjh .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Pg3ARxCGXRAfsWjh g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Pg3ARxCGXRAfsWjh g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-Pg3ARxCGXRAfsWjh g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-Pg3ARxCGXRAfsWjh g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Pg3ARxCGXRAfsWjh g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Pg3ARxCGXRAfsWjh .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Pg3ARxCGXRAfsWjh .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-Pg3ARxCGXRAfsWjh .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-Pg3ARxCGXRAfsWjh .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Pg3ARxCGXRAfsWjh .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-Pg3ARxCGXRAfsWjh .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-Pg3ARxCGXRAfsWjh .edgeLabel text{fill:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Pg3ARxCGXRAfsWjh .node circle.state-start{fill:black;stroke:black}#mermaid-svg-Pg3ARxCGXRAfsWjh .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-Pg3ARxCGXRAfsWjh #statediagram-barbEnd{fill:#9370db}#mermaid-svg-Pg3ARxCGXRAfsWjh .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Pg3ARxCGXRAfsWjh .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-Pg3ARxCGXRAfsWjh .statediagram-state .divider{stroke:#9370db}#mermaid-svg-Pg3ARxCGXRAfsWjh .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-Pg3ARxCGXRAfsWjh .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-Pg3ARxCGXRAfsWjh .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-Pg3ARxCGXRAfsWjh .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-Pg3ARxCGXRAfsWjh .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-Pg3ARxCGXRAfsWjh .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-Pg3ARxCGXRAfsWjh .note-edge{stroke-dasharray:5}#mermaid-svg-Pg3ARxCGXRAfsWjh .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-Pg3ARxCGXRAfsWjh .error-icon{fill:#522}#mermaid-svg-Pg3ARxCGXRAfsWjh .error-text{fill:#522;stroke:#522}#mermaid-svg-Pg3ARxCGXRAfsWjh .edge-thickness-normal{stroke-width:2px}#mermaid-svg-Pg3ARxCGXRAfsWjh .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-Pg3ARxCGXRAfsWjh .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-Pg3ARxCGXRAfsWjh .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-Pg3ARxCGXRAfsWjh .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-Pg3ARxCGXRAfsWjh .marker{fill:#333}#mermaid-svg-Pg3ARxCGXRAfsWjh .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-Pg3ARxCGXRAfsWjh {color: rgba(0, 0, 0, 0.75);font: ;}mainhal庫stm32f4xx_hal_mapwx8978usb_deviceSTM32_USB_DEVICE_LibraryHAL_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)mainhal庫stm32f4xx_hal_mapwx8978usb_deviceSTM32_USB_DEVICE_Library

4.2 播放流程

#mermaid-svg-MN8Y5XQhAt16b4Dt .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .label text{fill:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .node rect,#mermaid-svg-MN8Y5XQhAt16b4Dt .node circle,#mermaid-svg-MN8Y5XQhAt16b4Dt .node ellipse,#mermaid-svg-MN8Y5XQhAt16b4Dt .node polygon,#mermaid-svg-MN8Y5XQhAt16b4Dt .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-MN8Y5XQhAt16b4Dt .node .label{text-align:center;fill:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .node.clickable{cursor:pointer}#mermaid-svg-MN8Y5XQhAt16b4Dt .arrowheadPath{fill:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-MN8Y5XQhAt16b4Dt .flowchart-link{stroke:#333;fill:none}#mermaid-svg-MN8Y5XQhAt16b4Dt .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-MN8Y5XQhAt16b4Dt .edgeLabel rect{opacity:0.9}#mermaid-svg-MN8Y5XQhAt16b4Dt .edgeLabel span{color:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-MN8Y5XQhAt16b4Dt .cluster text{fill:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-MN8Y5XQhAt16b4Dt .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-MN8Y5XQhAt16b4Dt text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-MN8Y5XQhAt16b4Dt .actor-line{stroke:grey}#mermaid-svg-MN8Y5XQhAt16b4Dt .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .sequenceNumber{fill:#fff}#mermaid-svg-MN8Y5XQhAt16b4Dt #sequencenumber{fill:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt #crosshead path{fill:#333;stroke:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .messageText{fill:#333;stroke:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-MN8Y5XQhAt16b4Dt .labelText,#mermaid-svg-MN8Y5XQhAt16b4Dt .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-MN8Y5XQhAt16b4Dt .loopText,#mermaid-svg-MN8Y5XQhAt16b4Dt .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-MN8Y5XQhAt16b4Dt .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-MN8Y5XQhAt16b4Dt .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-MN8Y5XQhAt16b4Dt .noteText,#mermaid-svg-MN8Y5XQhAt16b4Dt .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-MN8Y5XQhAt16b4Dt .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-MN8Y5XQhAt16b4Dt .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-MN8Y5XQhAt16b4Dt .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-MN8Y5XQhAt16b4Dt .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MN8Y5XQhAt16b4Dt .section{stroke:none;opacity:0.2}#mermaid-svg-MN8Y5XQhAt16b4Dt .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-MN8Y5XQhAt16b4Dt .section2{fill:#fff400}#mermaid-svg-MN8Y5XQhAt16b4Dt .section1,#mermaid-svg-MN8Y5XQhAt16b4Dt .section3{fill:#fff;opacity:0.2}#mermaid-svg-MN8Y5XQhAt16b4Dt .sectionTitle0{fill:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .sectionTitle1{fill:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .sectionTitle2{fill:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .sectionTitle3{fill:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MN8Y5XQhAt16b4Dt .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-MN8Y5XQhAt16b4Dt .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MN8Y5XQhAt16b4Dt .grid path{stroke-width:0}#mermaid-svg-MN8Y5XQhAt16b4Dt .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-MN8Y5XQhAt16b4Dt .task{stroke-width:2}#mermaid-svg-MN8Y5XQhAt16b4Dt .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MN8Y5XQhAt16b4Dt .taskText:not([font-size]){font-size:11px}#mermaid-svg-MN8Y5XQhAt16b4Dt .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MN8Y5XQhAt16b4Dt .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-MN8Y5XQhAt16b4Dt .task.clickable{cursor:pointer}#mermaid-svg-MN8Y5XQhAt16b4Dt .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-MN8Y5XQhAt16b4Dt .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-MN8Y5XQhAt16b4Dt .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-MN8Y5XQhAt16b4Dt .taskText0,#mermaid-svg-MN8Y5XQhAt16b4Dt .taskText1,#mermaid-svg-MN8Y5XQhAt16b4Dt .taskText2,#mermaid-svg-MN8Y5XQhAt16b4Dt .taskText3{fill:#fff}#mermaid-svg-MN8Y5XQhAt16b4Dt .task0,#mermaid-svg-MN8Y5XQhAt16b4Dt .task1,#mermaid-svg-MN8Y5XQhAt16b4Dt .task2,#mermaid-svg-MN8Y5XQhAt16b4Dt .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-MN8Y5XQhAt16b4Dt .taskTextOutside0,#mermaid-svg-MN8Y5XQhAt16b4Dt .taskTextOutside2{fill:#000}#mermaid-svg-MN8Y5XQhAt16b4Dt .taskTextOutside1,#mermaid-svg-MN8Y5XQhAt16b4Dt .taskTextOutside3{fill:#000}#mermaid-svg-MN8Y5XQhAt16b4Dt .active0,#mermaid-svg-MN8Y5XQhAt16b4Dt .active1,#mermaid-svg-MN8Y5XQhAt16b4Dt .active2,#mermaid-svg-MN8Y5XQhAt16b4Dt .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-MN8Y5XQhAt16b4Dt .activeText0,#mermaid-svg-MN8Y5XQhAt16b4Dt .activeText1,#mermaid-svg-MN8Y5XQhAt16b4Dt .activeText2,#mermaid-svg-MN8Y5XQhAt16b4Dt .activeText3{fill:#000 !important}#mermaid-svg-MN8Y5XQhAt16b4Dt .done0,#mermaid-svg-MN8Y5XQhAt16b4Dt .done1,#mermaid-svg-MN8Y5XQhAt16b4Dt .done2,#mermaid-svg-MN8Y5XQhAt16b4Dt .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-MN8Y5XQhAt16b4Dt .doneText0,#mermaid-svg-MN8Y5XQhAt16b4Dt .doneText1,#mermaid-svg-MN8Y5XQhAt16b4Dt .doneText2,#mermaid-svg-MN8Y5XQhAt16b4Dt .doneText3{fill:#000 !important}#mermaid-svg-MN8Y5XQhAt16b4Dt .crit0,#mermaid-svg-MN8Y5XQhAt16b4Dt .crit1,#mermaid-svg-MN8Y5XQhAt16b4Dt .crit2,#mermaid-svg-MN8Y5XQhAt16b4Dt .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-MN8Y5XQhAt16b4Dt .activeCrit0,#mermaid-svg-MN8Y5XQhAt16b4Dt .activeCrit1,#mermaid-svg-MN8Y5XQhAt16b4Dt .activeCrit2,#mermaid-svg-MN8Y5XQhAt16b4Dt .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-MN8Y5XQhAt16b4Dt .doneCrit0,#mermaid-svg-MN8Y5XQhAt16b4Dt .doneCrit1,#mermaid-svg-MN8Y5XQhAt16b4Dt .doneCrit2,#mermaid-svg-MN8Y5XQhAt16b4Dt .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-MN8Y5XQhAt16b4Dt .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-MN8Y5XQhAt16b4Dt .milestoneText{font-style:italic}#mermaid-svg-MN8Y5XQhAt16b4Dt .doneCritText0,#mermaid-svg-MN8Y5XQhAt16b4Dt .doneCritText1,#mermaid-svg-MN8Y5XQhAt16b4Dt .doneCritText2,#mermaid-svg-MN8Y5XQhAt16b4Dt .doneCritText3{fill:#000 !important}#mermaid-svg-MN8Y5XQhAt16b4Dt .activeCritText0,#mermaid-svg-MN8Y5XQhAt16b4Dt .activeCritText1,#mermaid-svg-MN8Y5XQhAt16b4Dt .activeCritText2,#mermaid-svg-MN8Y5XQhAt16b4Dt .activeCritText3{fill:#000 !important}#mermaid-svg-MN8Y5XQhAt16b4Dt .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MN8Y5XQhAt16b4Dt g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-MN8Y5XQhAt16b4Dt g.classGroup text .title{font-weight:bolder}#mermaid-svg-MN8Y5XQhAt16b4Dt g.clickable{cursor:pointer}#mermaid-svg-MN8Y5XQhAt16b4Dt g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-MN8Y5XQhAt16b4Dt g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-MN8Y5XQhAt16b4Dt .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-MN8Y5XQhAt16b4Dt .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-MN8Y5XQhAt16b4Dt .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-MN8Y5XQhAt16b4Dt .dashed-line{stroke-dasharray:3}#mermaid-svg-MN8Y5XQhAt16b4Dt #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-MN8Y5XQhAt16b4Dt #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-MN8Y5XQhAt16b4Dt #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-MN8Y5XQhAt16b4Dt #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-MN8Y5XQhAt16b4Dt #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-MN8Y5XQhAt16b4Dt #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-MN8Y5XQhAt16b4Dt #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-MN8Y5XQhAt16b4Dt #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-MN8Y5XQhAt16b4Dt .commit-id,#mermaid-svg-MN8Y5XQhAt16b4Dt .commit-msg,#mermaid-svg-MN8Y5XQhAt16b4Dt .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MN8Y5XQhAt16b4Dt .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MN8Y5XQhAt16b4Dt .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MN8Y5XQhAt16b4Dt g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MN8Y5XQhAt16b4Dt g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-MN8Y5XQhAt16b4Dt g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-MN8Y5XQhAt16b4Dt g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-MN8Y5XQhAt16b4Dt g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-MN8Y5XQhAt16b4Dt .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-MN8Y5XQhAt16b4Dt .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-MN8Y5XQhAt16b4Dt .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-MN8Y5XQhAt16b4Dt .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-MN8Y5XQhAt16b4Dt .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-MN8Y5XQhAt16b4Dt .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-MN8Y5XQhAt16b4Dt .edgeLabel text{fill:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MN8Y5XQhAt16b4Dt .node circle.state-start{fill:black;stroke:black}#mermaid-svg-MN8Y5XQhAt16b4Dt .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-MN8Y5XQhAt16b4Dt #statediagram-barbEnd{fill:#9370db}#mermaid-svg-MN8Y5XQhAt16b4Dt .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-MN8Y5XQhAt16b4Dt .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-MN8Y5XQhAt16b4Dt .statediagram-state .divider{stroke:#9370db}#mermaid-svg-MN8Y5XQhAt16b4Dt .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-MN8Y5XQhAt16b4Dt .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-MN8Y5XQhAt16b4Dt .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-MN8Y5XQhAt16b4Dt .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-MN8Y5XQhAt16b4Dt .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-MN8Y5XQhAt16b4Dt .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-MN8Y5XQhAt16b4Dt .note-edge{stroke-dasharray:5}#mermaid-svg-MN8Y5XQhAt16b4Dt .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-MN8Y5XQhAt16b4Dt .error-icon{fill:#522}#mermaid-svg-MN8Y5XQhAt16b4Dt .error-text{fill:#522;stroke:#522}#mermaid-svg-MN8Y5XQhAt16b4Dt .edge-thickness-normal{stroke-width:2px}#mermaid-svg-MN8Y5XQhAt16b4Dt .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-MN8Y5XQhAt16b4Dt .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-MN8Y5XQhAt16b4Dt .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-MN8Y5XQhAt16b4Dt .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-MN8Y5XQhAt16b4Dt .marker{fill:#333}#mermaid-svg-MN8Y5XQhAt16b4Dt .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-MN8Y5XQhAt16b4Dt {color: rgba(0, 0, 0, 0.75);font: ;}STM32_USB_DEVICE_Libraryusbd_audio_ifhal庫AudioCmd(uint8_t *pbuf, uint32_t size, uint8_t cmd)HAL_I2S_Transmit_DMASTM32_USB_DEVICE_Libraryusbd_audio_ifhal庫

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

總結

以上是生活随笔為你收集整理的STM32 USB AUDIO 基础篇①——通过STM32CubeMX生成USB Speaker音频播放Demo(史上最简单)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。