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

相关推荐
LCG米6 小时前
STM32硬件CRC外设实测:多项式固定陷阱、CRC-32校验不匹配根因与软件查表法耗时对比落地
stm32·单片机·嵌入式硬件
La Pulga10 小时前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
2501_9432050511 小时前
【366期】Campfire:跨启动器的我的世界联机工具箱
经验分享
QVeris Friends12 小时前
QVeris MCP 连接到 ChatGPT:让 AI 调用专业数据
经验分享
女神下凡13 小时前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
瑞通软件源头厂家14 小时前
全栈国产化技术方案的五个关键层级与落地逻辑
经验分享
上海广测检测科技有限公司14 小时前
手机充电器 CCC 认证:2024 年 8 月后的目录口径、技术要点与单元划分
经验分享
Zw-awa14 小时前
从 CH340 到 HC-05 和 HC-06:让小车脱离电脑
stm32
硅基手札15 小时前
【Linux 内核专栏 19】20 · 嵌入式子系统 — GPIO·pinctrl·clock·regulator
linux·运维·单片机·linux内核·嵌入式开发·调试定位
何粥学17 小时前
Vivado 2024.2 开发记录(AC820 Zynq-7020)——软件使用,点亮led灯
单片机·嵌入式硬件·zynq