#include "stm32f4xx.h"

#define I2S3_WS_PIN GPIO_Pin_4 #define I2S3_SCK_PIN GPIO_Pin_5 #define I2S3_SD_PIN GPIO_Pin_7 #define I2S3_WS_SOURCE GPIO_PinSource4 #define I2S3_SCK_SOURCE GPIO_PinSource5 #define I2S3_SD_SOURCE GPIO_PinSource7

#define AUDIO_BUFFER_SIZE 512

uint16_t audio_buffer[AUDIO_BUFFER_SIZE];

void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

GPIO_InitStructure.GPIO_Pin = I2S3_WS_PIN | I2S3_SCK_PIN | I2S3_SD_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOC, I2S3_WS_SOURCE, GPIO_AF_SPI3); GPIO_PinAFConfig(GPIOC, I2S3_SCK_SOURCE, GPIO_AF_SPI3); GPIO_PinAFConfig(GPIOC, I2S3_SD_SOURCE, GPIO_AF_SPI3); }

void I2S_Configuration(void) { I2S_InitTypeDef I2S_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);

I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_44k; I2S_InitStructure.I2S_Standard = I2S_Standard_LSB; I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b; I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low; I2S_InitStructure.I2S_Mode = I2S_Mode_MasterRx; I2S_Init(SPI3, &I2S_InitStructure);

I2S_Cmd(SPI3, ENABLE); }

void DMA_Configuration(void) { DMA_InitTypeDef DMA_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);

DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI3->DR); DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)audio_buffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = AUDIO_BUFFER_SIZE; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream0, &DMA_InitStructure);

DMA_Cmd(DMA1_Stream0, ENABLE);

SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Rx, ENABLE); }

int main(void) { GPIO_Configuration(); I2S_Configuration(); DMA_Configuration();

while (1) { // Wait for DMA transfer complete while (DMA_GetFlagStatus(DMA1_Stream0, DMA_FLAG_TCIF0) == RESET);

// Process audio data
for (uint32_t i = 0; i < AUDIO_BUFFER_SIZE; i++)
{
  uint16_t pcm_value = audio_buffer[i] >> 8; // Keep only the upper 8 bits (discard the lower 8 bits)
  // Do something with the PCM value...
}

// Clear DMA transfer complete flag
DMA_ClearFlag(DMA1_Stream0, DMA_FLAG_TCIF0);

} }

STM32F4 Discovery I2S单声道音频数据PCM解码完整C代码

原文地址: https://www.cveoy.top/t/topic/oYq0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录