STM32F103双I2S实战:如何用I2S2和I2S3实现录音+播放同步(附完整代码)
STM32F103双I2S实战如何用I2S2和I2S3实现录音播放同步附完整代码在嵌入式音频开发中STM32F103的I2S接口常被用于音频数据的传输。虽然单路I2S是半双工的但通过巧妙配置两路独立的I2S接口我们可以实现录音和播放的同步操作。本文将深入探讨这一技术方案并提供完整的实现代码。1. 硬件架构与设计思路STM32F103系列微控制器通常配备两个I2S接口I2S2和I2S3。每个接口都是半双工的这意味着它们不能同时进行发送和接收。然而通过将一路配置为主接收录音另一路配置为主发送播放我们可以实现伪全双工的音频处理能力。关键硬件配置要点I2S2通常映射到SPI2用于音频输入I2S3通常映射到SPI3用于音频输出需要特别注意GPIO引脚的重映射和复用功能注意使用I2S3时需要禁用JTAG功能以释放相关引脚。这可以通过GPIO重映射配置实现。2. 系统初始化与配置系统初始化是确保I2S正常工作的重要步骤。以下是完整的初始化流程#include bsp_i2s.h #define Rx_Len 1024*24 #define Tx_Len 1024*24 uint32_t I2S2_Rx_Cnt 0; uint32_t I2S3_Tx_Cnt 0; uint8_t I2S2_Buffer_Rx[Rx_Len]; uint8_t I2S3_Buffer_Tx[Tx_Len];2.1 中断优先级配置合理的中断优先级配置对于实时音频处理至关重要static void I2S_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* SPI2 IRQ Channel configuration */ NVIC_InitStructure.NVIC_IRQChannel SPI2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority 2; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); /* SPI3 IRQ channel configuration */ NVIC_InitStructure.NVIC_IRQChannel SPI3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; NVIC_Init(NVIC_InitStructure); }2.2 I2S外设初始化完整的I2S初始化函数包含以下关键步骤启用相关时钟配置GPIO引脚设置I2S工作模式启用中断void STM32F10X_I2S_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; I2S_InitTypeDef I2S_InitStructure; /* 启用相关时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 | RCC_APB1Periph_SPI3, ENABLE); /* 禁用JTAG接口以释放I2S3引脚 */ GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); /* 配置I2S2引脚 */ GPIO_InitStructure.GPIO_Pin GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_Init(GPIOB, GPIO_InitStructure); /* 配置I2S3引脚 */ GPIO_InitStructure.GPIO_Pin GPIO_Pin_3 | GPIO_Pin_5; GPIO_Init(GPIOB, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_15; GPIO_Init(GPIOA, GPIO_InitStructure); /* I2S参数配置 */ I2S_InitStructure.I2S_Standard I2S_Standard_Phillips; I2S_InitStructure.I2S_DataFormat I2S_DataFormat_16b; I2S_InitStructure.I2S_MCLKOutput I2S_MCLKOutput_Enable; I2S_InitStructure.I2S_AudioFreq I2S_AudioFreq_16k; I2S_InitStructure.I2S_CPOL I2S_CPOL_Low; /* 配置I2S2为主接收模式 */ I2S_InitStructure.I2S_Mode I2S_Mode_MasterRx; I2S_Init(SPI2, I2S_InitStructure); /* 配置I2S3为主发送模式 */ I2S_InitStructure.I2S_Mode I2S_Mode_MasterTx; I2S_Init(SPI3, I2S_InitStructure); /* 启用中断 */ SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE); SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_TXE, ENABLE); /* 启用I2S外设 */ I2S_Cmd(SPI2, ENABLE); I2S_Cmd(SPI3, ENABLE); I2S_NVIC_Config(); }3. 中断服务程序实现中断服务程序(ISR)是处理实时音频数据的关键。我们需要为I2S2和I2S3分别实现中断处理函数。3.1 I2S2接收中断void SPI2_IRQHandler() { if (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_IT_RXNE) SET) { I2S2_Buffer_Rx[I2S2_Rx_Cnt] SPI_I2S_ReceiveData(SPI2); } }3.2 I2S3发送中断void SPI3_IRQHandler() { if (SPI_I2S_GetITStatus(SPI3, SPI_I2S_IT_TXE) SET) { SPI_I2S_SendData(SPI3, I2S3_Buffer_Tx[I2S3_Tx_Cnt]); } if (I2S3_Tx_Cnt Tx_Len) { SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_TXE, DISABLE); I2S3_Tx_Cnt 0; } }4. 性能优化与常见问题在实际应用中双I2S配置可能会遇到各种问题。以下是一些常见问题及其解决方案问题现象可能原因解决方案音频数据丢失中断优先级设置不当调整NVIC优先级确保音频中断有足够响应速度噪声或失真时钟配置错误检查I2S时钟分频设置确保音频采样率正确只有一路I2S工作JTAG未正确禁用确认GPIO重映射配置正确数据不同步缓冲区管理不当实现环形缓冲区或双缓冲机制缓冲区管理技巧使用双缓冲技术减少数据丢失合理设置缓冲区大小平衡延迟和内存占用考虑使用DMA传输减轻CPU负担提示对于更高要求的应用可以考虑使用STM32的DMA功能来传输音频数据进一步降低CPU负载。5. 完整代码整合与测试将所有代码模块整合后我们需要进行系统测试。以下是一个简单的测试流程初始化系统时钟和I2S外设准备测试音频数据填充发送缓冲区启动I2S传输监控接收缓冲区数据验证音频质量和同步性int main(void) { SystemInit(); STM32F10X_I2S_Init(); /* 填充测试数据到发送缓冲区 */ for(int i0; iTx_Len; i) { I2S3_Buffer_Tx[i] /* 测试音频数据 */; } while(1) { /* 处理接收到的音频数据 */ if(I2S2_Rx_Cnt Rx_Len) { /* 数据处理逻辑 */ I2S2_Rx_Cnt 0; } } }在实际项目中我发现合理设置缓冲区大小对系统性能影响很大。过小的缓冲区会导致数据丢失而过大的缓冲区会增加延迟。经过多次测试24KB的缓冲区大小在16kHz采样率下能提供良好的平衡。

相关新闻

AI净界RMBG-1.4新功能实测:半透明物体抠图效果大公开

AI净界RMBG-1.4新功能实测:半透明物体抠图效果大公开

AI净界RMBG-1.4新功能实测:半透明物体抠图效果大公开 1. 为什么这次更新值得你立刻试一试 你有没有遇到过这样的尴尬: 一张玻璃水杯的电商主图,边缘泛着光晕,PS里魔棒选不干净,钢笔抠到手抖; 一张带薄纱裙…

2026/7/4 3:23:08 阅读更多 →
Hunyuan-MT-7B实操手册:长文本32K token翻译稳定性测试与分块策略建议

Hunyuan-MT-7B实操手册:长文本32K token翻译稳定性测试与分块策略建议

Hunyuan-MT-7B实操手册:长文本32K token翻译稳定性测试与分块策略建议 1. 开篇:为什么需要关注长文本翻译稳定性 在实际翻译工作中,我们经常遇到长文档处理需求:学术论文、技术文档、商业合同、产品手册等,这些文本往…

2026/7/3 2:04:12 阅读更多 →
语音识别新选择:Whisper多语言转写服务快速上手

语音识别新选择:Whisper多语言转写服务快速上手

语音识别新选择:Whisper多语言转写服务快速上手 1. 引言 1.1 语音识别的实际需求 在日常工作和生活中,我们经常遇到需要将语音转换为文字的场景。无论是会议记录、采访整理、外语学习,还是内容创作,准确快速的语音转文字功能都…

2026/5/17 4:54:10 阅读更多 →

最新新闻

终极GitHub Desktop汉化指南:三分钟让英文界面变中文

终极GitHub Desktop汉化指南:三分钟让英文界面变中文

终极GitHub Desktop汉化指南:三分钟让英文界面变中文 【免费下载链接】GitHubDesktop2Chinese GithubDesktop语言本地化(汉化)工具 【GitHub桌面客户端中文汉化】 项目地址: https://gitcode.com/gh_mirrors/gi/GitHubDesktop2Chinese 还在为GitHub Desktop的…

2026/7/4 3:21:49 阅读更多 →
看懂一个 AI 范式,比用一百个 AI 产品更重要

看懂一个 AI 范式,比用一百个 AI 产品更重要

今年年初,但凡刷点 AI 圈的内容,OpenClaw 就躲都躲不开——GitHub 几天涨几十万 star,各路人喊它「最接近 JARVIS 的东西」,朋友圈里有人连夜部署、半夜被它的 heartbeat 叫醒。然后呢?半年过去,你已经很久没在 timeline 上看到它了,取而代之的是「OpenClaw is dead」的复盘文…

2026/7/4 3:19:48 阅读更多 →
Linux 运维高频故障排查手册(CPU/内存/磁盘/网络/端口/进程一套打通)

Linux 运维高频故障排查手册(CPU/内存/磁盘/网络/端口/进程一套打通)

在日常运维中,大多数线上问题都可以归类为:资源类(CPU/内存/磁盘)、网络类(连通性/丢包/延迟/端口)、服务类(进程挂了/端口占用/依赖不可用)。 本文提供一套“从现象到定位再到验证”…

2026/7/4 3:19:48 阅读更多 →
Anthropic Claude Code 被指用文本隐写术标记用户,失去的信任能否回滚?

Anthropic Claude Code 被指用文本隐写术标记用户,失去的信任能否回滚?

Anthropic 又翻车,Claude Code 暗藏隐写术我们发现,Anthropic 这次又翻车了。6 月 30 日,一名 Reddit 用户发布逆向分析,拆解 Claude Code 2.1.196 的二进制文件,发现一段触发条件具体、行为隐蔽的函数。当使用代理连接…

2026/7/4 3:17:48 阅读更多 →
三星固件下载难题:如何用Kotlin跨平台技术5分钟搞定官方固件获取?

三星固件下载难题:如何用Kotlin跨平台技术5分钟搞定官方固件获取?

三星固件下载难题:如何用Kotlin跨平台技术5分钟搞定官方固件获取? 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 在安卓设备维护和开发领…

2026/7/4 3:17:48 阅读更多 →
python-LangGraph框架(3-32-LangGraph 并行验证)

python-LangGraph框架(3-32-LangGraph 并行验证)

一、LangGraph 并行执行核心优势相比其他工作流框架,LangGraph 的并行能力具备三大核心亮点:极简定义,无冗余代码:无需手动管理线程、协程,框架底层自动处理任务并发,专注业务逻辑即可;状态自动…

2026/7/4 3:15:48 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻