你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

基于stm32片内Flash数据的DAC输出

2021/12/31 4:02:11

stm32片内Flash的提示音播放

  • 前言
  • 一、DAC简介
  • 二、使用DAC输出单周期的正弦波
  • 三、PCM模块输出音频


前言

使用用Adobe audition音频编辑软件录制“您好欢迎光临!”的几秒钟的声音(8khz采样、8bit量化编码的单声道wav格式),确保音频数据尽量小(最大不超64KB),然后编程将其分批次写入Stm32f103芯片内部flash区域。

然后将数字音频还原播放,编程读取此段音频,我们这里通过stm32f103自带的DAC通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;


一、DAC简介

DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与 ADC相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而 ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器件,使人类易于感知。

如音频信号的采集及还原就是这样一个过程。
STM32 具有片上 DAC 外设,它的分辨率可配置为 8 位或 12 位的数字输入信号,具有两个 DAC输出通道,这两个通道互不影响,每个通道都可以使用 DMA 功能,都具有出错检测能力,可外部触发。

功能框图

在这里插入图片描述
DAC原理

DAC的运行过程,其实就是由定时器定时触发DAC转换数据,每当出现定时器更新事件,由DMA运送新的数据到达DAC的寄存器,DAC输出新的数据,而由于这些数据正是一个周期的正弦波的数字形式(我们使用软件生成),经过一个周期的DAC转换,就能输出一个连续的模拟正弦波数据了。

了解了DAC的工作原理,我们不仅可以控制生成正弦波,通过控制配置定时器分频因子和时钟周期就可以控制正弦波的频率了。

具体公式如下

fsin=1/Tsysclk(TIM_Prescaler+1)(TIM_Period+1)*N
其中N为正弦波单个周期的点数

在这里插入图片描述

二、使用DAC输出单周期的正弦波

我本次用到了野火的例程,野火例程里的正弦波输出,在其代码基础上稍微修改一下,使其输出频率为2KHZ的正弦波

首先我们打开野火关于正弦波的文件,然后打开matlab采样脚本

在这里插入图片描述
使用matlab打开一下文件

在这里插入图片描述
在其中修改采样点数,可以看到matlab绘制的波形图

在这里插入图片描述
我们把这个把输出的采样点数据复制到野火提供的例程代码中

在这里插入图片描述
存放在下面数组中

在这里插入图片描述

然后我们编译,将代码烧到开发板中即可,使用示波器观察PA4、PA5通道即可,这里由于实验条件限制,所以没有使用示波器观测现象。


三、PCM模块输出音频

我们先使用录音软件录制一段“你好,欢迎光临”的声音,然后使用Adobe Audition软件打开录制好的音频,截取片段并生成.wav文件

在这里插入图片描述
上图生成的波形是立体声波形,我们点击右键–提取声道为单声道文件

在这里插入图片描述
然后选中生成的单声道文件,框选想要录制的音频区域,然后右键选择存储选区(注意截取的音频不要太长,STM32内部flash存储空间可能不够)

在这里插入图片描述

配置如下

在这里插入图片描述
将生成的文件使用Ultraedit打开

在这里插入图片描述

然后CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建的UltraEdit文件中

在这里插入图片描述
在新建文件中,CTRL+A,接着鼠标右键,选择范围输入起始的行号和列号,选中我们需要的内容

在这里插入图片描述
然后CTRL+C,将所选文本复制到notepad++所创建的一个新文件去

然后ALT+C,进入列块编辑模式,输入想要插入的内容,如下图所示

在这里插入图片描述
然后将生成的十六进制文件数据放到刚刚的数组中,烧录后观察现象。

参考

STM32 基础系列教程 16 - I2S(模拟)

STM32F103使用TIM DMA DAC实现播放WAV音乐

STM32笔记–DAC(正弦波发生)

STM32F103的DAC——输出声音效果

详细介绍Audition输出一个周期2khz的正弦波(循环)。将一段数字音频歌曲数据转换为模拟音频波形输出(循环)

【Audio】I2S传输PCM音频数据分析总结(二)