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

相关推荐
_Ningye1 天前
STM32 — 2.2 新建工程
stm32·单片机·嵌入式硬件
森利威尔电子-1 天前
森利威尔SL3062替代 LM3485 60V降压恒压芯片
单片机·嵌入式硬件·集成电路·芯片·电源芯片
_Ningye1 天前
STM32 — 3.1 GPIO输出
stm32·单片机·嵌入式硬件
学嵌入式的小杨同学1 天前
STM32 进阶封神之路(十九):ADC 深度解析 —— 从模拟信号到数字转换(底层原理 + 寄存器配置)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
青桔柠薯片1 天前
51单片机(STC89C52RC)学习总结:从裸机编程到外设驱动
嵌入式硬件·学习·51单片机
weiyvyy1 天前
从开发视角看硬件接口:接口开发的本质与全景图
驱动开发·单片机·嵌入式硬件·硬件工程
老李的森林1 天前
杂谈--如何与AI高效率的对话
人工智能·stm32·嵌入式硬件·机械
_Ningye1 天前
STM32 —2.1 软件安装
stm32
weixin_462901971 天前
esp32wifi的AP模式
单片机·嵌入式硬件
2501_918126911 天前
学习所有6502写游戏动画的语句
汇编·嵌入式硬件·学习·程序人生·游戏