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

相关推荐
fengfuyao9859 小时前
STM32如何定位HardFault错误,一种实用方法
stm32·单片机·嵌入式硬件
爱学习的颖颖9 小时前
EXTI外部中断的执行逻辑|以对射式红外传感器计次为例
单片机·嵌入式硬件·exti中断
keer_zu10 小时前
STM32L051 RTC闹钟配置详解
stm32·嵌入式硬件
AI精钢11 小时前
H20芯片与中国的科技自立:一场隐形的博弈
人工智能·科技·stm32·单片机·物联网
Cx330❀11 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
etcix13 小时前
implement copy file content to clipboard on Windows
windows·stm32·单片机
谱写秋天13 小时前
在STM32F103上进行FreeRTOS移植和配置(STM32CubeIDE)
c语言·stm32·单片机·freertos
globbo17 小时前
【嵌入式STM32】I2C总结
单片机·嵌入式硬件
玖別ԅ(¯﹃¯ԅ)18 小时前
SysTick寄存器(嘀嗒定时器实现延时)
stm32·单片机·嵌入式硬件
limitless_peter18 小时前
集成运算放大器(反向比例,同相比例)
嵌入式硬件·硬件工程