news 2026/4/29 1:32:27

STM32 I2S 输入输出切换功能 - 修改总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 切换后频率/位深度不对 硬编码参数 添加参数支持动态配置

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 1:31:17

Spring核心应用场景

Spring 是一套轻量级、一站式 Java 开发框架,核心以IoC 容器、AOP、事务管理为底座,衍生出 Spring Boot、Spring Cloud 全家桶,覆盖从小型单体项目到大型分布式微服务系统的全场景开发,适用范围极广。传统单体 Web 项目开发这是最…

作者头像 李华
网站建设 2026/4/29 1:31:10

麒麟V10服务器版openssh-10.3p1一键升级

查看系统版本和系统架构[rootkyv10sp32403 cache]# nkvers############## Kylin Linux Version #################Release:Kylin Linux Advanced Server release V10 (Halberd)Kernel:4.19.90-89.11.v2401.ky10.aarch64Build:Kylin Linux Advanced Serverrelease V10 SP3 2403/…

作者头像 李华
网站建设 2026/4/29 1:30:57

忆阻器存内计算与XBTorch框架技术解析

1. 忆阻器与存内计算的技术背景忆阻器(Memristor)作为第四种基本电路元件,其独特的非易失性和模拟电阻切换特性,使其成为实现存内计算(Computing-in-Memory)的理想载体。与传统冯诺依曼架构不同&#xff0c…

作者头像 李华
网站建设 2026/4/29 1:12:29

Phi-4-mini-flash-reasoning推理能力展示:解决经典计算机组成原理问题

Phi-4-mini-flash-reasoning推理能力展示:解决经典计算机组成原理问题 1. 开场白:当AI遇上计算机组成原理 最近测试了一款名为Phi-4-mini-flash-reasoning的AI模型,它在技术推理方面的表现让我眼前一亮。特别是当我拿计算机组成原理的经典问…

作者头像 李华
网站建设 2026/4/29 1:11:00

ComfyUI-Impact-Pack:AI图像增强与语义分割的终极工具包

ComfyUI-Impact-Pack:AI图像增强与语义分割的终极工具包 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址: https:…

作者头像 李华