STM32 ADC(DMA)双缓冲采集+串口USART(DMA)直接传输12位原始数据到上位机显示并保存WAV格式音频文件 收藏住绝对实用!!!

这是最近微处理器与嵌入式系统综合设计课程所要求做的一个麦克风音频信号采集系统,功能要求其实比较宽泛,主要是围绕这个系统做些东西就行,我做的是使用STM32的ADC(DMA)双缓冲采集音频信号然后使用串口USART(DMA)保证信号完整连续的传输到上位机,在上位机显示采到的音频信号波形,保存音频(.wav格式)并能够播放音频。在这个过程中遇到了一些坑,在后面其他文章我都会详细的介绍解决办法,如果有相同项目或者功能实现的可以参考注意一下。关注评论私信拿完整工程!

一.ADC DMA配置

在配置ADC DMA时需要注意我们最好使用定时器触发(Timer x Trigger Out event),然后我们的ADC是12位的,所以在配置DMA时,Peripheral选择Half Word(16位),Memory也是选择Half Word(16位),接下来是定时器的配置。

二.定时器配置

选择内部时钟,然后下面的分配系数决定信号的采样频率 fs

三.串口USART DMA配置

前面没什么好说的,就是一个异步选择,然后还要波特率的设置,只要是DMA的设置,还记得之前我们的目的吗?串口USART DMA直接发送12位ADC的原始数据,我们12位ADC的原始数据肯定是放在一个16位的数组里面,而我们的串口一次发送8位数据也就是1字节,所以我们发送一个16位的数据需要2字节发送两次,Peripheral选择Half Word(16位),Memory也是选择Byte(8位),这里没有反,我也解释不清楚,反正测试来就得这样。

四.软件代码

1.变量定义

设置的双缓冲区,这里的BUF_SIZE需根据实际情况而定,我的芯片RAM只支持到256

下面的两个变量作为标准位作缓冲区和串口发送的标准位

2.开启采集

开启定时器,并开启ADC DMA采集

3.主程序

在这里有一个很大的坑,就是照现在这样,串口只会发送一次然后就不再发送,我添加了LED观察状态,灯在闪,但是串口却不再发送,经过Debbug发现串口发送完后gState的状态会发生改变,所以我手动在每次发送前更改了gState的状态,这得自己算算时间,因为手动更改可能导致上一次数据并没有传输完,我这倒是没这问题,改了后串口就通过DMA连续发送了,下图只发了一次,原始数据每两个一组,然后解析就得上位机写代码转成想要的格式。

4.回调函数

回调函数里改变两个标志位,进而控制串口发送的数据,最后再次开启ADC DMA采集

五.演示

STM32麦克风音频信号采集系统

stm32完整工程代码 + 上位机需要的关注评论私信拿!

相关推荐
JMchen12315 小时前
Android UDP编程:实现高效实时通信的全面指南
android·经验分享·网络协议·udp·kotlin
三流架构师15 小时前
口腔医学教程资源合集
经验分享
-Springer-15 小时前
STM32 学习 —— 个人学习笔记5(EXTI 外部中断 & 对射式红外传感器及旋转编码器计数)
笔记·stm32·学习
LS_learner15 小时前
树莓派(ARM64 架构)Ubuntu 24.04 (Noble) 系统 `apt update` 报错解决方案
嵌入式硬件
JMchen12316 小时前
Android网络安全实战:从HTTPS到双向认证
android·经验分享·网络协议·安全·web安全·https·kotlin
熊猫不是猫QAQ16 小时前
想要真正的私密分享?NasChat把NAS变成专属TG,隐私+自由
经验分享
掌心向暖RPA自动化16 小时前
影刀RPA如何在网页和桌面软件中实现自动滚动长截图?最好同时支持横向滚动纵向滚动的?
经验分享·自动化·影刀rpa·长截图
来自晴朗的明天16 小时前
16、电压跟随器(缓冲器)电路
单片机·嵌入式硬件·硬件工程
eyun_1850016 小时前
把健康小屋搬进单位 让职工暖心 让履职安心
大数据·人工智能·经验分享