音频/视频应用中 DMA 使用示例
I2S + DMA 音频数据传输示例:
c
复制代码
void I2S_DMA_Init(void)
{
// 配置 I2S 外设
I2S_HandleTypeDef hi2s;
hi2s.Instance = SPI2; // I2S 使用 SPI 外设
hi2s.Init.Mode = I2S_MODE_MASTER_TX;
hi2s.Init.Standard = I2S_STANDARD_PHILIPS;
hi2s.Init.DataFormat = I2S_DATAFORMAT_16B;
hi2s.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
HAL_I2S_Init(&hi2s);
// 配置 DMA
DMA_HandleTypeDef hdma_i2s_tx;
hdma_i2s_tx.Instance = DMA1_Stream4;
hdma_i2s_tx.Init.Channel = DMA_CHANNEL_0;
hdma_i2s_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_i2s_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_i2s_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_i2s_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_i2s_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_i2s_tx.Init.Mode = DMA_CIRCULAR;
hdma_i2s_tx.Init.Priority = DMA_PRIORITY_HIGH;
HAL_DMA_Init(&hdma_i2s_tx);
__HAL_LINKDMA(&hi2s, hdmatx, hdma_i2s_tx);
// 启动 I2S 和 DMA
HAL_I2S_DMAStart(&hi2s, (uint16_t*)audio_buffer, BUFFER_SIZE);
}
在这个示例中,音频数据通过 I2S 外设传输,并通过 DMA 直接将音频数据送到外部音频 DAC,实现了高效的音频输出。
|