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完整工程代码 + 上位机需要的关注评论私信拿!

相关推荐
创思通信3 小时前
树莓派的YOLO智能AI识别系统,识别ESP32还是STM32
人工智能·stm32·yolo
root_dream4 小时前
从stc8g1k08+433MHZ无线点亮led 到stc8k1k17+433MHZ唯一配对并点亮小灯(过程&问题&总结)
单片机·嵌入式硬件·stc8g1k08·433mhz
mc23564 小时前
STM32F103C8T6--定时器
stm32·单片机·嵌入式硬件
会编程是什么感觉...5 小时前
算法 - PEC校验
单片机·算法
清风6666665 小时前
基于单片机的全自动洗衣机控制器设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
AI科技星6 小时前
接近光速运动下的光速不变性:基于张祥前统一场论的推导与验证
数据结构·人工智能·经验分享·算法·计算机视觉
GEO科技6 小时前
AI搜索驱动的品牌传播变革:品牌如何在“被搜索”转向“被理解”的浪潮中重构增长力
经验分享
帅帅兔子8 小时前
2.4寸SPI串口ILI9341芯片彩色LCD驱动
stm32·单片机·嵌入式硬件·mcu
Metaphor6928 小时前
Java操作PDF图层:添加、设置和删除
经验分享
蓝天居士9 小时前
PY32F040单片机介绍(1)
单片机·国产mcu·1024程序员节