热度 2
2023-12-5 09:43
621 次阅读|
1 个评论
以下是一个简单的HC32L073 I2S DMA功能代码示例,用于单通道(左通道)16位数据宽度和48KHz采样率: ```c #include "hc32_i2s.h" void I2S_DMA_Init(void) { I2S_InitTypeDef I2S_InitStructure; DMA_InitTypeDef DMA_InitStructure; // 使能I2S外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_I2Sx, ENABLE); // 配置I2S参数 I2S_InitStructure.I2S_Mode = I2S_Mode_MasterTx; // 主发送模式 I2S_InitStructure.I2S_AudioFreq = 48000; // 采样率为48KHz I2S_InitStructure.I2S_BitsPerSample = I2S_BitsPerSample_16BIT; // 16位数据宽度 I2S_InitStructure.I2S_ChannelSize = I2S_ChannelSize_1; // 单通道 I2S_InitStructure.I2S_CommMode = I2S_CommMode_NoInterrupt; // 无中断模式 I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low; // 低电平有效 I2S_InitStructure.I2S_CPHA = I2S_CPHA_Left; // 左对齐 I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_NonInterleaved; // 非交错格式 I2S_InitStructure.I2S_Prescaler = 256; // 预分频器值为256 I2S_Init(I2Sx, &I2S_InitStructure); // 使能DMA外设时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 配置DMA参数 DMA_DeInit(DMAx); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&I2S_DATA; // I2S数据寄存器地址 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) // 缓冲区地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 外设目标模式 DMA_InitStructure.DMA_BufferSize = sizeof(buffer); // 缓冲区大小 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_Normal; // 正常模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High; // 高优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // DMA到内存不使用内存到内存传输模式 DMA_Init(DMAx, &DMA_InitStructure); // 使能DMA外设 DMA_Cmd(DMAx, ENABLE); } ``` 请注意,您需要根据您的硬件连接和需求修改此代码。例如,您可能需要更改I2S引脚、DMA通道等。此外,您还需要定义一个缓冲区`buffer`来存储音频数据。