STM32 I2S 输入输出切换功能 - 修改总结
一、问题背景使用 STM32F4 的 I2S 接口实现音频输入录音和输出播放切换。原始代码 HAL_I2S_Receive_DMA() 能正常接收数据但自定义的 I2S_Start_RX() 函数切换到输入模式后数据全为0。二、修改文件清单 1. MY_I2S.c - I2S 切换逻辑核心实现修改内容 - 添加 extern DMA_HandleTypeDef hdma_spi2_rx; 和 extern DMA_HandleTypeDef hdma_spi2_tx; 声明- 重写 I2S_Start_RX() 函数- 添加 HAL_I2S_DeInit() 防止重复初始化冲突- 添加 __HAL_LINKDMA() 链接 DMA 句柄- 添加 HAL_I2S_Receive_DMA() 启动 DMA 接收- 重写 I2S_Start_TX() 函数- 支持参数传入采样率44/48和数据格式16/24bit- 添加 PLL 时钟动态配置- 添加 __HAL_LINKDMA() 链接 DMA 句柄void I2S_Start_RX(uint16_t *pData, uint16_t Size) { HAL_I2S_DMAStop(hi2s2); __HAL_I2S_DISABLE(hi2s2); hi2s2.Instance SPI2; hi2s2.Init.Mode I2S_MODE_MASTER_RX; // ... 其他配置 ... HAL_I2S_DeInit(hi2s2); HAL_I2S_Init(hi2s2); __HAL_LINKDMA(hi2s2, hdmarx, hdma_spi2_rx); HAL_I2S_Receive_DMA(hi2s2, pData, Size); } void I2S_Start_TX(uint8_t hz, uint32_t dataformat) { // 根据采样率配置 PLL if (hz 48) { plli2sn 159; plli2sr 2; } else if (hz 44) { plli2sn 158; plli2sr 2; } // ... I2S 配置 ... __HAL_LINKDMA(hi2s2, hdmatx, hdma_spi2_tx); }i2s.c - 添加 TX 的 DMA 配置修改内容 - 添加 DMA_HandleTypeDef hdma_spi2_tx; 定义- 在 HAL_I2S_MspInit() 中添加 TX DMA 初始化hdma_spi2_tx.Instance DMA1_Stream4; hdma_spi2_tx.Init.Channel DMA_CHANNEL_0; hdma_spi2_tx.Init.Direction DMA_MEMORY_TO_PERIPH; // ... 其他配置 ... HAL_DMA_Init(hdma_spi2_tx); __HAL_LINKDMA(i2sHandle, hdmatx, hdma_spi2_tx);stm32f4xx_it.c - 中断处理函数extern DMA_HandleTypeDef hdma_spi2_tx; void DMA1_Stream4_IRQHandler(void) { HAL_DMA_IRQHandler(hdma_spi2_tx); }添加 void DMA1_Stream4_IRQHandler(void); 声明添加 DMA1_Stream4_IRQn 的 NVIC 启用HAL_NVIC_SetPriority(DMA1_Stream4_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn);核心问题与解决方案I2S_Start_RX() 数据全为0 未链接 DMA 句柄未启动 DMA 接收 添加 __HAL_LINKDMA() 和 HAL_I2S_Receive_DMA() TX DMA 中断不触发 NVIC 未启用 Stream4 中断 在 dma.c 中添加 HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn) 播放 24bit WAV 有噪音 I2S 配置 24bit 但数据已转 16bit 统一使用 16bit 模式输出 TX 切换后频率/位深度不对 硬编码参数 添加参数支持动态配置
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2564131.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!