音频数据的Flash读取与DAC播放

一、内容简介

基于片内Flash的提示音播放程序。

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

2)数字音频还原播放任务:编程读取此段音频,分别通过
stm32f103c8t6自带的DAC通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;

提示:建议先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,通过DAC或PCM音频模块能够基本还原出原始正弦波声音后,再用语音和音乐信号进行实验。

二、stm32的DAC播放与内部flash

1) 关于DAC

数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。
DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。
DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+ 以获得更精确的转换结果。

DAC的主要特征:
  
●  2个DAC转换器:每个转换器对应1个输出通道

●  8位或者12位单调输出

●  12位模式下数据左对齐或者右对齐

●  双DAC通道同时或者分别转换

●  每个通道都有DMA功能

●  外部触发转换

●  输入参考电压VREF+

2) 关于flash

不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节。市面上 STM32F1 开发板使用的芯片是 STM32F103系列,其 FLASH 容量一般为 512K 字节,属于大容量芯片。

STM32F1 的闪存(Flash)模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。

下面我们就来介绍下这些组成部分:

①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以看出主存储器的起始地址就是0X08000000, BOOT0、BOOT1 都接 GND 的时候,就是从 0X08000000 开始运行代码的。

②信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能,这里我们不做介绍,大家可以百度了解。

③闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。

在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。

三、Flash地址空间的数据读取

实验验证: stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。

1) 工程代码

stm32f103c6t8的内部flash工程需要在stm32CubeMX中进行相关配置(具体的配置方法参考博客)后再导出,导出后需要额外添加两个代码文件,这里我就直接将同学分享的源代码附在下面:
链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn
工程打开后如下图所示:
在这里插入图片描述
编译后没有错误;
接下来,下载好ST-LINK驱动,并将其连接到电脑上,就可以进行烧录调试了;

ST-Link驱动安装: 链接:https://pan.baidu.com/s/1EwMTGsOyckWO-XTQbUJH4A
提取码:ykpz

判断ST_Link是否连接成功的标志是:右击此电脑——>管理——>设备管理器——>通用串行总线设备;如果有STM32 STLink,即表示连接成功;
在这里插入图片描述

2) 相关配置

接下来对代码进行调试,点击魔法棒,在Debug页面下进行如下操作:
在这里插入图片描述
点击Settings,选择SW接口模式,并且右边出现内容即可表示连接成功;
在这里插入图片描述
由于使用st-link和keil进行烧录会严格检查stm32型号,如果不是对应的型号烧录会报错,所以我们最好检查一下我们的型号是否正确:
魔法棒——>Device
在这里插入图片描述
最后点击“LOAD”将代码烧录到芯片中,出现以下页面即表示烧录成功;
在这里插入图片描述

3)结果验证

将stm32 芯片的BOOT0和BOOT1都置为0,然后点击调试按钮;
首先,点击“View”——>“Memory Windows”——>"Memory 1"观察存储地址;
在这里插入图片描述
然后点击“View”——>“Watch Windows”——>"Watch 1",将变量FlashWBuffFlashRBuff加入到 Watch 1 观察窗口;
在这里插入图片描述
接下来点击全速运行,即可发现FlashWBuff和FlashRBuff中的内容变得一样了;
在这里插入图片描述
在这里插入图片描述
切换到Memory 1 窗口下,可以发现我们想写入的内容也写入到对应的位置当中去了;
在这里插入图片描述

四、片内Flash的提示音播放程序

1) 通过DAC还原原始正弦波型号

Ⅰ、生成音频文件
首先,在软件Adobe Audition下新建音频文件,具体流程为:

文件——>新建——>音频文件

文件名自行设置,将采样率设置为2000HZ,选择单声道,位深度为16位,具体如下:
在这里插入图片描述
在这里插入图片描述

然后再点击:效果——>生成基本音色
在这里插入图片描述
进行如下调整:
在这里插入图片描述
最后就可以导出音频文件啦!
具体流程为: 文件——>导出——>文件
将文件存储在合适的位置,确保文件的格式为wav,采样类型为2000HZ,单声道,16位深度;
在这里插入图片描述
Ⅱ、导出相关数据
首先,在软件UltraEdit(可以在官网上下载)上打开刚刚生成的音频文件,如下图所示:
在这里插入图片描述
然后ctrl+A选中所有内容,接下来右击选择 十六进制复制选定视图,将内容粘贴到一个新建文件中;
在新建文件中,ctrl+A,右击选择范围输入起始的行号和列号(左右两边都有对应行列数,对应选择即可),确定就可以选中所需内容;
在这里插入图片描述
将选中的内容复制到notepad++中,然后选中第一行,分别在每一个数字前进行如下操作:编辑——>列块编辑——>输入框中输入,0x
最终可以看到如下结果:
在这里插入图片描述Ⅲ、结果验证
DAC生成正弦波的例程代码

链接:https://pan.baidu.com/s/18zsQG5mZXbjafPuAJEUkMg
提取码:706i

工程打开后如下:
在这里插入图片描述

将数据复制到keil文件对应的位置,在下图红框中进行替换;
在这里插入图片描述
最后和上面烧录调试的方法一样,观察结果即可;
我这里没有示波器,就不附上结果图了;

2) 数字音频转换为模拟音频播放

在Adobe Audition下打开音乐文件,然后改变音频的采样率,具体流程为:编辑——>转换采样类型,将采样率设置为6000HZ,选择单声道,位深度为16位,具体如下:
在这里插入图片描述
然后存储选中的5~10秒,点击确定即可;
在这里插入图片描述
之后的步骤跟之前的一样,烧录完成后,借助STM32的音频模块验证能否还原音频信号;
这里由于没有音频播放模块,所以结果也不附上啦!!

五、总结

通过本次实验,我了解了stm32 内flash的数据读取。

六、参考内容

ST-LINK驱动的安装
STM32 进阶教程 13 – FLASH的读写操作
STM32之内部FLASH原理

版权声明:本文为CSDN博主「奔赴美好未来」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/boomboomy/article/details/122225845

一、基于flash的数据读取

1、 STM32的内部 FLASH 简介
STM32芯片内部的FLASH 存储器主要用于存储代码。当在电脑上编写应用程序并使用下载器把编译后的代码文件烧录到内部FLASH中时,由于FLASH存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部FLASH中加载代码并运行。
除使用外部的工具(下载器)读写内部 FLASH 外,STM32 芯片在运行时也能对自身的内部 FLASH 进行读写,因此,若内部 FLASH 存储应用程序后还有剩余的空间,可以把它像外部 SPI-FLASH 那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。
由于访问内部 FLASH 的速度比访问外部 SPI-FLASH 的速度快,因此,在紧急状态下常使用内部 FLASH 存储关键记录。为防止应用程序被抄袭,有的应用会禁止读写内部FLASH 中的内容,或在第一次运行时计算加密信息并记录到某些区域,然后删除自身的部分加密代码。

2、用stm32cubemx创建工程
工程链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn

因为使用stlik驱动程序,所以这里的debug选择serial wire
在这里插入图片描述
调整栈的大小
在这里插入图片描述
将事先准备好的flash.c 及flash.h加入到工程中(flash.h文件放在Inc文件夹下即可)
在这里插入图片描述在main.c中加入如下代码
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
安装stlink驱动程序,使用stlink进行调试,连接如图
在这里插入图片描述在keil中,点击魔法棒,设置调试方式为stlink在这里插入图片描述
点击settings,显示方框中的内容,就成功了
在这里插入图片描述编译在这里插入图片描述
点击load,下载进芯片中
在这里插入图片描述
下载成功
在这里插入图片描述
进行调试
在这里插入图片描述
View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,全速运行程序,观察将要修改的flash区间内容
在这里插入图片描述
View->Watch windows->Watch 打开两个个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1和2 观察窗口
全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样了
在这里插入图片描述
在这里插入图片描述

二、基于片内flash的提示音播放程序

DAC简介:
DAC为数字/模拟转换模块,顾名思义,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与ADC相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。
STM32具有片上DAC外设,它的分辨率可配置为8位或12位的数字输入信号,具有两个DAC输出通道,这两个通道互不影响,每个通道都可以使用DMA功能,都具有出错检测能力,可外部触发。

STM32的DAC外设有固定的输出通道,分别为PA4和PA5,因此实验时直接使用示波器测量PA4和PA5引脚的输出即可。

1、输出一个周期2khz的正弦波(循环)
①菜单栏选择文件→新建→音频文件
在这里插入图片描述
②设置文件名,采样率,声道,位深度
在这里插入图片描述
③设置效果生成基本音色
在这里插入图片描述
④在生成基本音色界面,如图设置
在这里插入图片描述
⑤导出为wav文件,选择文件→导出→文件

2、使用UltraEdit得到相关数据
用UltraEdit打开刚刚保存的wav文件
如图操作,将图中标蓝色的内容粘贴到一个新文件夹中
在这里插入图片描述
在新文件中,将图中内容选择范围输入起始的行号和列号
在这里插入图片描述
在这里插入图片描述
3、使用Notepad++软件添加相关内容
将之前的内容复制下来,添加到Notepad++软件新建的文件夹中
在这里插入图片描述
按下图操作添加
在这里插入图片描述
在这里插入图片描述
最终效果
在这里插入图片描述
打开野火例程的DAC输出正弦波工程
下载链接:http://doc.embedfire.com/products/link/zh/latest/tutorial/ebf_stm32_stdlib_tutorial.html

在这里插入图片描述
打开bsp_dac.c文件,将正弦波数据换成音频文件生成的数据
在这里插入图片描述
最后编译,烧录进硬件中,就可以使用示波器观察
在这里插入图片描述
4、首先需要在Adobe Audition CS6中打开任意一首歌曲(本地保存的)
在这里插入图片描述
选中一段,然后右键,选择存储选区,接着更改采用类型

接下来的操作与之前一样
编译,烧录,使用示波器观察
在这里插入图片描述

三、参考链接

1、https://blog.csdn.net/zhanglifu3601881/article/details/96632971
2、https://blog.csdn.net/qq_45748462/article/details/112392144
3、https://blog.csdn.net/qq_43279579/article/details/111990896

版权声明:本文为CSDN博主「小T归0」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_47794668/article/details/122261555

一、flash地址空间的数据读取

1、stmcubemx配置

(1)选择stm32f103c8t6芯片,开始工程
(2)sys配置
在这里插入图片描述
(3)时钟树配置
在这里插入图片描述
(4)引脚模式
在这里插入图片描述
(5)NVIC配置
在这里插入图片描述
(6)工程项目设置
在这里插入图片描述

2、相关代码

(1)代码下载
源码链接提取码 9467
(2)添加flash.c文件,添加位置如下
在这里插入图片描述
(3)在main.c文件中加入代码(红框标注部分)
在这里插入图片描述
(4)
在这里插入图片描述

编译
在这里插入图片描述
连接ST-link
提取码9467下载链接
接法如下表

ST-link stm32
SWCLK/TCK SWCLK/TCK
SWDIO/TMS SWDIO/TMS
GND GND
VCC VCC

在这里插入图片描述
下载ST-link提取码9467
如图显示安装成功
在这里插入图片描述

在keil设置debug界面
在这里插入图片描述
在这里插入图片描述
连接成功,编译后点击下面的按钮下载烧录
在这里插入图片描述
在这里插入图片描述

3、keil仿真

View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容
在这里插入图片描述
View->Watch windows->Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口
在这里插入图片描述
在这里插入图片描述
点击全速运行
在这里插入图片描述
在这里插入图片描述

二、基于片内Flash的提示音播放程序

生成正弦波数据

新建音频文件
在这里插入图片描述
设置采样率、声道、位深度在这里插入图片描述
在这里插入图片描述
点击工具栏的‘效果’选项,选择‘生成基本音色’
在这里插入图片描述
点击工具栏的’文件‘选项,选择’导出文件‘

在这里插入图片描述
UltraEdit打开wav文件
全选后设置选择范围
在这里插入图片描述
右键点击后十六进制复制选定视图,将十六进制数赋值到notepad++中,选中要添加的行然后Alt+C添加0x
在这里插入图片描述
生成正弦波工程提取码1111
将代码添加如下
在这里插入图片描述
完成后编译下载烧录。
这里由于缺少相关的硬件设备,所以暂时不能测试效果

3、基于DAC的音频播放

由于缺少音频模块加其他事务繁多,关乎这部分就不详细展示,操作与正弦波相同,注意的是提取片段几秒就好

三、总结

这次实验虽然已经精简过了,但是实现条件依旧比较困难,总之多亏了老师同学的耐心指代和帮助。

四、参考资料

https://blog.csdn.net/zhanglifu3601881/article/details/96632971
https://blog.csdn.net/qq_45748462/article/details/112392144
https://blog.csdn.net/qq_43279579/article/details/111990896

版权声明:本文为CSDN博主「卡布布卡」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45893802/article/details/122243718

目录

一、Flash地址空间的数据读取

1.1Flash的原理

1.2内部Flash的构成

二、STM32CubeMx工程的建立

三、MDK5代码编写

四、ST-LINK硬件接线

五、仿真调试

六、基于片内Flash的提示音播放程序

 6.1使用DAC输出周期2khz的正弦波

 6.2使用DAC输出数字音频歌曲数据转换为模拟音频波形输出

6.3 录制音频并播放

总结

参考文献 


一、Flash地址空间的数据读取

1.1Flash的原理

在 STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码,在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部 FLASH 中,由于 FLASH 存 储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行。

Flash的编程原理都是只能将1写为0,而不能将0写为1,所以在进行Flash编程前,必须将对应的块擦除,即将该块的每一位都变为1,块内所有字节变为0xFF。

1.2内部Flash的构成

主存储器:一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用 户应用程序的空间,芯片型号说明中的 256K FLASH、512K FLASH 都是指这个区 域的大小。 主存储器分为 256 页,每页大小为 2KB,共 512KB。这个分页的概念,实质就是 FLASH 存储器的扇区,与其它 FLASH 一样,在写入数据前,要先按页(扇区) 擦除。

系统存储器:系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负 责实现串口、USB 以及 CAN 等 ISP 烧录功能。

选项字节:选项字节用于配置 FLASH 的读写保护、待机/停机复位、软件/硬件看门狗等功能, 这部分共 16 字节。可以通过修改 FLASH 的选项控制寄存器修改。

二、STM32CubeMx工程的建立

1.设置PC13为GPIO_Output,PD0为RCC_OSC_IN,PD1为RCC_OSC_OUT,PA13为SYS_JTMS-SWDIO,PA14为SYS,如下图

2.配置定时器

3.GPIO的引脚设置

4.设置堆栈大小为4K

 然后到处MDK5工程文件

三、MDK5代码编写

将事先准备好的flash.c 及flash.h加入到工程中

2.再主函数里面添加

 

编译没有错误,进行调试。

四、ST-LINK硬件接线

 按下表进行接线调试

ST-LINK STM32
SWCLK/TCK SWCLK/TCK
SWDIO/TMS SWDIO/TMS
GND GND
VCC VCC

在电脑上下载好响应的ST-Link驱动,上电,可以看到STLink在电脑上显示出来了

ST-Link 驱动已经安装完成。接下来只需要在 mdk 工程里面配置一下 ST-Link即可

回到Keil下,在魔法棒Option选项卡进行设置
首先是选择调试器,使用的是 ST-Link,在 Debug 选项卡中,选择ST-Link Debugger 点击settings

然后点击LOAD进行下载

表示烧录成功。 

五、仿真调试

进入debug,如果是仿真调试的话,实际操作发现数组没有产生变化。
于是又用STlink又试了一下,以下主要是STlink调试的过程。

(1)View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容:
(2)View->Watch windows->Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口

(3)全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样了

(5)在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容
(6)断电,重新上电后再次调试,程序刚停在main入口处时还可以看到Flash对应区间的内容保持上一次写入内容值。

 

(7)重复读写入,这里没什么变化 

之后的FF说明数据没有再写入覆盖了

六、基于片内Flash的提示音播放程序

 6.1使用DAC输出周期2khz的正弦波

生成单音正弦波
文件—>新建—>音频文件 

效果->生成->音调,红框为修改的地方

设置相关的数据

设置导出为wav文件

用UltraEdit得到相关数据
用UltraEdit打开刚才保存的wav文件

CTRL+A,接着鼠标右键,选择十六进制复制选定视图,将内容粘贴到一个新建文件中
在新建文件中,选中全部内容,加入0X,这样所有的内容都变成十六进制,如图,

使用DAC生成正弦波的例程代码

链接:https://pan.baidu.com/s/1OjhG9szfc6UylScP8pYCGA 
提取码:lcln 

将内容复制到main.c如图位置处即可

之后写入Flash,再将从FLASH读出的数据,添加到示例代码的数组里,烧录程序。

 6.2使用DAC输出数字音频歌曲数据转换为模拟音频波形输出

修改采样率,其他操作与前面相同

6.3 录制音频并播放

(1)点击录制按钮选择录音时间为2s

 (2)按照上述步骤用ultraEdit打开刚刚生成的.wav文件,

CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建文件中,选出16进制,打开notepad++后,将上面选中的内容复制粘贴到该软件中,点击第一行的每个数字后面,列编辑插入“0x”

(3)写入FLASH

将生成的音频十六进制写入FLASH,具体过程在这篇博客前面有,不再阐述

(4)数字音频还原播放任务

使用代码:

链接:https://pan.baidu.com/s/1n6D4TDhnKX2DxjeOgsxBqQ 
提取码:qwer

(5)添加使用刚刚从FLASH写入并读出的数据,给数组赋值

(6)烧录程序,没有其他模块,这里没有进行播放等其他操作

总结

从个实验里我学习到了flash的大概原理,第一个小实验通过下载大佬的代码,加入了相关的程序和和头文件后一次就成功得到了结果,很开心。后面的几个实验都还没有完全做出来,需要进一步跟着大佬学习。

参考文献 

使用STM32F103的DAC功能实现音频输出_咩咩叫的闲鱼的博客-CSDN博客_stm32f103有dac目录DAC简介准备输出一个周期2khz的正弦波——基于HAL库将一段数字音频歌曲数据转换为模拟音频波形输出(循环)总结参考DAC简介DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与 ADC相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而 ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计 算机处理完成后,再由 DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器 件,使人类易于感知。如音频信号的采集及还原就是https://blog.csdn.net/qq_45748462/article/details/112392144STM32 进阶教程 13 – FLASH的读写操作_张十三的博客-CSDN博客_stm32f103c8t6flash读写前言在嵌入式应用开发中,经常会遇到掉电后还要保存的信息,这些信息通常只能保存在外部的一些存储芯片中,如外部flash,外部EEPROM, 其实这些信息同样可以保存在STM32自带的内部flash中,本节将带领大家来实现这一操作。示例详解基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是STM32F103c8t6, 使用stm32cubemx 工具自动产生的配...https://blog.csdn.net/zhanglifu3601881/article/details/96632971【嵌入式22】STM32F1C8T6音频数据的Flash读取与DAC播放_噗噗的罐子博客-CSDN博客本文主要介绍STM32F103C8T6下音频数据的Flash读取与DAC播放https://blog.csdn.net/qq_46467126/article/details/122098829?spm=1001.2014.3001.5501

基于STM32F103C8T6的FLASH的DAC音频输出_Laul Ken-Yi的博客-CSDN博客目录一、知识点二、音频准备2.1 生成wav文件2.2 提取.wav文件十六进制2.3 notepad++2.4 录制“您好欢迎光临”三、编写程序3.1 写入FLASH​3.2数字音频还原播放任务四、总结一、知识点DAC简介DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与 ADC相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而 ADC把电压模拟信号转换成易于计算机...https://blog.csdn.net/qq_60678931/article/details/122225830?spm=1001.2014.3001.5501

版权声明:本文为CSDN博主「亚大贼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_48729490/article/details/122240467

实验要求

预备实验:
1)在SD卡创建一个test-speed.txt文件,循环(不加延时)分批一次写入256字节,累计写入不少于64KB字节;然后读取此文件数据,通过串口显示出来。分析写入和读取的速率。
2)Flash地址空间的数据读取。stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。
(用cubemx写stm32f103c8t6的内部Flash)
基于片内Flash的提示音播放程序:
1)实验数据准备:用Adobe audition或goldwave等音频编辑软件录制“您好欢迎光临!”的几秒钟的声音(8khz采样、8bit量化编码的单声道wav格式),确保音频数据尽量小(最大不超64KB)。然后编程将其分批次写入stm32f103c8t6芯片内部flash区域。
2)数字音频还原播放任务:编程读取此段音频,通过 stm32f103c8t6自带的DAC通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;
提示:建议先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,通过DAC或PCM音频模块能够基本还原出原始正弦波声音后,再用语音和音乐信号进行实验。

一、Flash地址空间的数据读取

1、STM32 的内部 FLASH 简介

在 STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部 FLASH 中,由于 FLASH 存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行。

Flash的编程原理都是只能将1写为0,而不能将0写为1
所以在进行Flash编程前,必须将对应的块擦除
即将该块的每一位都变为1,块内所有字节变为0xFF。

STM32F1 的闪存(Flash)模块:主存储器、信息块、闪存存储器接口寄存器
主存储块
用于存储程序,我们写的程序一般存储在这里,对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。
信息块
该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。
闪存存储器接口寄存器
该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。

在执行闪存写操作时,任何对闪存的读操作都会锁住总线
在写操作完成后读操作才能正确地进行;
既在进行写或擦除操作时,不能进行代码或数据的读取操作。

在这里插入图片描述

2、工程验证

1、工程下载

flash工程下载链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn

2、工程修改

stm32_Flash\Drivers\CMSIS\Device\ST\STM32F1xx\Include下的system_stm32f1xx_20190722_092746.h文件修改为system_stm32f1xx.h
在这里插入图片描述
打开工程,main.c自定义写入flash中的内容
在这里插入图片描述
编译无错误
在这里插入图片描述
前期配置
点击Options->Debug->右边使用硬件ST-Link Debugger
在这里插入图片描述
接着点击S T-Link Debugger右边的Settings
在这里插入图片描述

在这里插入图片描述

依次点击Flash Download->勾选Reset and Run->Add->选择STM32F10x Med-density Flash->Add->确定即可
在这里插入图片描述
若发现
在这里插入图片描述
则上一步作废,不再操作,最后点击OK完成硬件配置

由于要连接硬件ST-Link,所以要下载一个STLink驱动,不然下载不成功
链接:https://pan.baidu.com/s/13k0PVQfg5qAHXBKJ2IZiYA
提取码:1234
接线说明
在这里插入图片描述

在这里插入图片描述
点击左上角的LOAD按钮将程序下载到STM32中
在这里插入图片描述
现在点击dubug按钮,进入硬件仿真调试
在这里插入图片描述
点击View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800C000,观察将要修改的flash区间区容:
在这里插入图片描述
其中点击某一字符右击可选择显示格式
继续View->Watch windows->Watch 1打开一个变量观察窗口
在这里插入图片描述将变量FlashWBuff 和FlashRBuff加入到Watch 1观察窗口
在这里插入图片描述
在这里插入图片描述
另外View->勾选Periodic Windows Update,开启变量自动更新
在这里插入图片描述
全速运行
这时就可以看到Watch 1窗口的数组FlashRBuff中的内容与数组FlashWBuff中的内容是一样的
在这里插入图片描述在这里插入图片描述
同时在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容

在这里插入图片描述
断电后再重新上电进行调试,程序停在main入口处时还可以看到Flash对应区间的内容保持上一次写入内容值
在这里插入图片描述

二、基于片内Flash的提示音播放程序

1.使用DAC输出周期2khz的正弦波

建议先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,通过DAC或PCM音频模块能够基本还原出原始正弦波声音后,再用语言/音乐信号进行实验。
生成单音正弦波
文件—>新建—>音频文件
在这里插入图片描述
效果->生成->音调
在这里插入图片描述
在这里插入图片描述
文件->导出->设置导出为wav文件即可
用UltraEdit得到相关数据
用UltraEdit打开刚才保存的wav文件
在这里插入图片描述
CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建文件中
在新建文件中,CTRL+A,接着鼠标右键,选择范围输入起始的行号和列号,确定就选中了整个我们需要的内容
复制到notepad++中
Edit编辑->列块编辑->输入0x
在这里插入图片描述
DAC生成正弦波的例程代码
链接:https://pan.baidu.com/s/18zsQG5mZXbjafPuAJEUkMg
提取码:706i
在这里插入图片描述
在这里插入图片描述
之后,编译下载,看能否观察到预期的正弦波。

2.数字音频还原播放

和上面操作一致,采样率修改一下,其他不变
在这里插入图片描述
由于硬件缺失,这里无法演示

三、总结

由于要给我们减负,这里的实验操作内容还是减少了的,在实验过程中还是会遇到一些硬件问题,没办法,头大,这里也同样参考了一些大佬的博客,希望继续努力。

四、参考链接

https://blog.csdn.net/qq_46467126/article/details/122098829
https://blog.csdn.net/qq_40147893/article/details/107423621
https://blog.csdn.net/zhanglifu3601881/article/details/96632971
https://blog.csdn.net/Ace_Shiyuan/article/details/78196648

版权声明:本文为CSDN博主「加菲猫不爱吃猫粮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_48609250/article/details/122179642

一:Flash地址空间的数据读取

Flash原理:

不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节。市面上 STM32F1 开发板使用的芯片是 STM32F103系列,其 FLASH 容量一般为 512K 字节,属于大容量芯片。

Flash的编程原理都是只能将1写为0,而不能将0写为1,所以在进行Flash编程前,必须将对应的块擦除,即将该块的每一位都变为1,块内所有字节变为0xFF。

STM32F1 的闪存(Flash)模块:主存储器、信息块、闪存存储器接口寄存器

①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。

②信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。

③闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。

在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。
二:cubeMX工程的建立

SYS配置

引脚配置

GPIO配置

中断设置

时钟配置

设置堆栈大小

然后生成代码

三:相关代码 

将flash.c工程文件夹加入到刚刚建立的keil工程中

在main.c文件中添加代码

 修改完后编译,进行调试

四:ST-Link的使用和仿真调试

在电脑上安装ST-Link

安装完成后,只需要在 mdk 工程里面配置一下 ST-Link即可

在keil中进行相关配置

然后进行编译下载

在这里插入图片描述

将工程烧录到芯片中

然后仿真调试

 

View->Watch windows->Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口


 

 

 

 F5全速运行

 

可以看一下起始位置的数据0x08000000

 

 五:基于片内flash的提示音播放程序

先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,
生成单音正弦波

在这里插入图片描述

生成基本音色

 

 

设置导出为wav文件

用UltraEdit得到相关数据
用UltraEdit打开刚才保存的wav文件

 

然后复制到notepad++中,Edit编辑里的列块编辑输入0x

将内容复制到keil文件对应的位置,在下图红框中进行替换。

 

编译下载,观察现象

使用DAC输出数字音频歌曲数据转换为模拟音频波形输出

操作同上

 

编辑好后编辑好代码,借助耳机或者音频模块看是否与还原。

六:总结 

本次实验有点难度,不管是代码方面还是实验操作方面都非常有难度,在此期间遇到了许多问题,所以实验没有很是顺利的完成。但是通过这次实验让我了解了Flash的作用,可以不借助外设即可实现存放。

七:参考文献

(25条消息) STM32 进阶教程 13 – FLASH的读写操作_张十三的博客-CSDN博客_stm32f103c8t6flash读写

(25条消息) 使用STM32F103的DAC功能实现音频输出_咩咩叫的闲鱼的博客-CSDN博客_stm32f103有dac

版权声明:本文为CSDN博主「张小龙儿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_61905840/article/details/122223949

一、什么是Flash?

Flash 是存储芯片的一种,通过特定的程序可以修改里面的数据。Flash 存储器又称闪存,它结合了ROM 和RAM 的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据(NVRAM 的优势), U 盘和MP3里用的就是这种存储器。在过去的20年里,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备,然而近年来Flash 全面代替了ROM(EPROM)在嵌入式系统中的地位,用作存储Bootloader 以及操作系统或者程序代码或者直接当硬盘使用(U 盘)。

Flash的编程原理都是将1写为0,但不能将0写为1,所以在进行Flash编程前,必须将对应的块擦除,即将该块的每一位都变为1,块内所有字节变为0xFF。

STM32的闪存(Flash)模块主要包括:主存储器、信息块和闪存存储器接口寄存器。

①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页
2K字节。注意,小容量和中容量产品则每页只有 1K 字节。

②信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接
V3.3,BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。

③闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。

二、怎么进行Flash的读取?

Flash地址空间的数据读取。stm32f103c8t6只有20KB
内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。

三、Flash实验

本次实验主要是要通过读取片内Flash的提示音播放波形声音

1.创建CUBEMX工程

配置定时器在这里插入图片描述
打开外部时钟
在这里插入图片描述
配置时钟
在这里插入图片描述
将PC13设置为output在这里插入图片描述
设置堆栈大小为4k,生成文件

2.在keil5中打开文件

将flash.c和flash.h添加到工程中
添加flash.c的时候选第二行
在这里插入图片描述
在main.c中分别添加如下代码(定义一下)

uint8_t FlashWBuff [255];
uint8_t FlashRBuff [255];
uint8_t i;
uint8_t FlashTest[] = “Hello This is Flash Test DEMO”;

将将程序下载到STM32里。
点击进入Debug模式。
点击View->memory windows,选择 memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容
在这里插入图片描述
点击View->Watch windows,选择Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口
在这里插入图片描述
全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样,而定义好的句子写到了地址0x0800c000中了。
在这里插入图片描述

二、基于片内Flash的提示音播放程序

1.生成正弦波

可以用专业的音频处理软件AU等做,我这里为了方便直接用格式工厂转化一下。并输出
在这里插入图片描述
用UltraEdit打开刚才保存的wav文件
在这里插入图片描述

2.将DAC导入程序

打开下载好的DAC输出正弦波的程序,在bsp_dac.c中用上述内容替换框选内容,就可以输出不同的波形。在这里插入图片描述
随后将程序下载到STM32里。
接入同学的喇叭后,正弦波会发出嘟嘟嘟的声音。表明实验还算成功了。
由于没有示波器,最后波形不予展示。

参考资料

https://blog.csdn.net/qq_46467126/article/details/122098829?spm=1001.2014.3001.5501

版权声明:本文为CSDN博主「惹毛了就重启」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_54658073/article/details/122524885

音频数据的Flash读取与DAC播放

原理介绍

flash

在 STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码,我们在电脑上编写

好应用程序后,使用下载器把编译后的代码文件烧录到该内部 FLASH 中,由于 FLASH 存

储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并

运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uQbyBtmA-1640943853238)(音频数据的Flash读取与DAC播放/image-20211231121500865.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k7k4N7K6-1640943853239)(音频数据的Flash读取与DAC播放/image-20211231122753889.png)]

DAC

DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对

应的模拟电压输出,它的功能与 ADC 相反。在常见的数字信号系统中,大部分传感器信号

被化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、处理的数字编码,由计

算机处理完成后,再由 DAC 输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器

件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。

STM32 具有片上 DAC 外设,它的分辨率可配置为 8 位或 12 位的数字输入信号,具有

两个 DAC 输出通道,这两个通道互不影响,每个通道都可以使用 DMA 功能,都具有出错

检测能力,可外部触发。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ubSaq2Pg-1640943853240)(音频数据的Flash读取与DAC播放/image-20211231122911381.png)]

flash读取

配置cubmax

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFvEsDvC-1640943853240)(音频数据的Flash读取与DAC播放/image-20211231123718251.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwnqXoUU-1640943853241)(音频数据的Flash读取与DAC播放/image-20211231123754170.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lAUkwPxI-1640943853241)(音频数据的Flash读取与DAC播放/image-20211231123832742.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J8arRi0R-1640943853242)(音频数据的Flash读取与DAC播放/image-20211231124141131.png)]

工程代码修改

将falsh.c和falsh.h文件加入工程中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RVW9QpMD-1640943853242)(音频数据的Flash读取与DAC播放/image-20211231135105940.png)]

在main.c中添加代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uHYCiZcm-1640943853242)(音频数据的Flash读取与DAC播放/image-20211231134834842.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4lordqVD-1640943853243)(音频数据的Flash读取与DAC播放/image-20211231140222818.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EAFSlgSa-1640943853243)(音频数据的Flash读取与DAC播放/image-20211231140249032.png)]

stlink调试

ST-LINK STM32F103
SWCLK/TCK SWCLK/TCK
SWDIO/TMS SWDIO/TMS
GND GND
VCC VCC

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KFPGFC2T-1640943853243)(音频数据的Flash读取与DAC播放/image-20211231145712603.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j8rbCFgX-1640943853244)(音频数据的Flash读取与DAC播放/image-20211231150125830.png)]

若IDCODE显示出来,连接成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BPT8dgbH-1640943853244)(音频数据的Flash读取与DAC播放/image-20211231145746754.png)]

点击load

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OUK9icoH-1640943853244)(音频数据的Flash读取与DAC播放/image-20211231153550666.png)]

完成烧录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ipQMY4iE-1640943853245)(音频数据的Flash读取与DAC播放/image-20211231153513482.png)]

点击调试

添加memory1、watch1和watch2查看变量变化情况

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbaJskEr-1640943853245)(音频数据的Flash读取与DAC播放/image-20211231160445871.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D8BOsIH8-1640943853245)(音频数据的Flash读取与DAC播放/image-20211231161422383.png)]

点击全速运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1cPp08qr-1640943853246)(音频数据的Flash读取与DAC播放/image-20211231160542407.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MmUi26dk-1640943853246)(音频数据的Flash读取与DAC播放/image-20211231161403070.png)]

看出内容一样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nEXtXAQ5-1640943853246)(音频数据的Flash读取与DAC播放/image-20211231155834997.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CmcfyvkC-1640943853246)(音频数据的Flash读取与DAC播放/image-20211231155847231.png)]

基于 Flash 的提示音 DAC 播放

使用 DAC 产生 2khz 周期的正弦波输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-46ZlnRUc-1640943853247)(音频数据的Flash读取与DAC播放/image-20211231163154461.png)]

修改参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F13MX1qC-1640943853247)(音频数据的Flash读取与DAC播放/image-20211231163321018.png)]

点击效果->生成基本音色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q6uGsgWQ-1640943853247)(音频数据的Flash读取与DAC播放/image-20211231163747968.png)]

修改参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zs0xfK6Y-1640943853247)(音频数据的Flash读取与DAC播放/image-20211231163939493.png)]

点击如下,输出文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLjtM5UD-1640943853248)(音频数据的Flash读取与DAC播放/image-20211231164009000.png)]

点开UltraEdit ,打开刚才au输出的wav文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kBHLBYnz-1640943853248)(音频数据的Flash读取与DAC播放/image-20211231164325246.png)]

点击Ctrl+a 全选,鼠标右键,16进制复制选定视图,将其复制到新的文件下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J9DLFlg8-1640943853248)(音频数据的Flash读取与DAC播放/image-20211231165646926.png)]

Ctrl+a,鼠标右键,选择范围,输入起始列号和结束列号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LseK4QDU-1640943853248)(音频数据的Flash读取与DAC播放/image-20211231165306629.png)]

复制到notepad++

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kTFA1IcO-1640943853249)(音频数据的Flash读取与DAC播放/image-20211231165337482.png)]

在野火提供的样例程序——DAC 输出正弦波中添加数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GZK2cHKe-1640943853250)(音频数据的Flash读取与DAC播放/image-20211231173034809.png)]

编译无误,即可烧录,用示波器得到波形

使用 DAC 输出数字音频歌曲数据转换为模拟音频波形输出

将歌曲转化为wav后,在au中打开,选择存储选区,完成后,步骤和上面一样用示波器得到波形

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BLhVBHrO-1640943853250)(音频数据的Flash读取与DAC播放/image-20211231173810268.png)]

总结

本次学习对内部flash和DAC有了更多的了解,同时对声音的处理也有了粗略的了解。

版权声明:本文为CSDN博主「gjish」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gjish/article/details/122260553

一:Flash地址空间的数据读取

Flash原理:

不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节。市面上 STM32F1 开发板使用的芯片是 STM32F103系列,其 FLASH 容量一般为 512K 字节,属于大容量芯片。

Flash的编程原理都是只能将1写为0,而不能将0写为1,所以在进行Flash编程前,必须将对应的块擦除,即将该块的每一位都变为1,块内所有字节变为0xFF。

STM32F1 的闪存(Flash)模块:主存储器、信息块、闪存存储器接口寄存器

①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。

②信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。

③闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。

在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。
二:cubeMX工程的建立

SYS配置

引脚配置

GPIO配置

中断设置

时钟配置

设置堆栈大小

然后生成代码

三:相关代码 

将flash.c工程文件夹加入到刚刚建立的keil工程中

在main.c文件中添加代码

 修改完后编译,进行调试

四:ST-Link的使用和仿真调试

在电脑上安装ST-Link

安装完成后,只需要在 mdk 工程里面配置一下 ST-Link即可

在keil中进行相关配置

然后进行编译下载

在这里插入图片描述

将工程烧录到芯片中

然后仿真调试

 

View->Watch windows->Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口


 

 

 

 F5全速运行

 

可以看一下起始位置的数据0x08000000

 

 五:基于片内flash的提示音播放程序

先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,
生成单音正弦波

在这里插入图片描述

生成基本音色

 

 

设置导出为wav文件

用UltraEdit得到相关数据
用UltraEdit打开刚才保存的wav文件

 

然后复制到notepad++中,Edit编辑里的列块编辑输入0x

将内容复制到keil文件对应的位置,在下图红框中进行替换。

 

编译下载,观察现象

使用DAC输出数字音频歌曲数据转换为模拟音频波形输出

操作同上

 

编辑好后编辑好代码,借助耳机或者音频模块看是否与还原。

六:总结 

本次实验有点难度,不管是代码方面还是实验操作方面都非常有难度,在此期间遇到了许多问题,所以实验没有很是顺利的完成。但是通过这次实验让我了解了Flash的作用,可以不借助外设即可实现存放。

七:参考文献

(25条消息) STM32 进阶教程 13 – FLASH的读写操作_张十三的博客-CSDN博客_stm32f103c8t6flash读写

(25条消息) 使用STM32F103的DAC功能实现音频输出_咩咩叫的闲鱼的博客-CSDN博客_stm32f103有dac

版权声明:本文为CSDN博主「张小龙儿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_61905840/article/details/122223949

一、基于flash的数据读取

1、 STM32的内部 FLASH 简介
STM32芯片内部的FLASH 存储器主要用于存储代码。当在电脑上编写应用程序并使用下载器把编译后的代码文件烧录到内部FLASH中时,由于FLASH存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部FLASH中加载代码并运行。
除使用外部的工具(下载器)读写内部 FLASH 外,STM32 芯片在运行时也能对自身的内部 FLASH 进行读写,因此,若内部 FLASH 存储应用程序后还有剩余的空间,可以把它像外部 SPI-FLASH 那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。
由于访问内部 FLASH 的速度比访问外部 SPI-FLASH 的速度快,因此,在紧急状态下常使用内部 FLASH 存储关键记录。为防止应用程序被抄袭,有的应用会禁止读写内部FLASH 中的内容,或在第一次运行时计算加密信息并记录到某些区域,然后删除自身的部分加密代码。

2、用stm32cubemx创建工程
工程链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn

因为使用stlik驱动程序,所以这里的debug选择serial wire
在这里插入图片描述
调整栈的大小
在这里插入图片描述
将事先准备好的flash.c 及flash.h加入到工程中(flash.h文件放在Inc文件夹下即可)
在这里插入图片描述在main.c中加入如下代码
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
安装stlink驱动程序,使用stlink进行调试,连接如图
在这里插入图片描述在keil中,点击魔法棒,设置调试方式为stlink在这里插入图片描述
点击settings,显示方框中的内容,就成功了
在这里插入图片描述编译在这里插入图片描述
点击load,下载进芯片中
在这里插入图片描述
下载成功
在这里插入图片描述
进行调试
在这里插入图片描述
View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,全速运行程序,观察将要修改的flash区间内容
在这里插入图片描述
View->Watch windows->Watch 打开两个个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1和2 观察窗口
全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样了
在这里插入图片描述
在这里插入图片描述

二、基于片内flash的提示音播放程序

DAC简介:
DAC为数字/模拟转换模块,顾名思义,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与ADC相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。
STM32具有片上DAC外设,它的分辨率可配置为8位或12位的数字输入信号,具有两个DAC输出通道,这两个通道互不影响,每个通道都可以使用DMA功能,都具有出错检测能力,可外部触发。

STM32的DAC外设有固定的输出通道,分别为PA4和PA5,因此实验时直接使用示波器测量PA4和PA5引脚的输出即可。

1、输出一个周期2khz的正弦波(循环)
①菜单栏选择文件→新建→音频文件
在这里插入图片描述
②设置文件名,采样率,声道,位深度
在这里插入图片描述
③设置效果生成基本音色
在这里插入图片描述
④在生成基本音色界面,如图设置
在这里插入图片描述
⑤导出为wav文件,选择文件→导出→文件

2、使用UltraEdit得到相关数据
用UltraEdit打开刚刚保存的wav文件
如图操作,将图中标蓝色的内容粘贴到一个新文件夹中
在这里插入图片描述
在新文件中,将图中内容选择范围输入起始的行号和列号
在这里插入图片描述
在这里插入图片描述
3、使用Notepad++软件添加相关内容
将之前的内容复制下来,添加到Notepad++软件新建的文件夹中
在这里插入图片描述
按下图操作添加
在这里插入图片描述
在这里插入图片描述
最终效果
在这里插入图片描述
打开野火例程的DAC输出正弦波工程
下载链接:http://doc.embedfire.com/products/link/zh/latest/tutorial/ebf_stm32_stdlib_tutorial.html

在这里插入图片描述
打开bsp_dac.c文件,将正弦波数据换成音频文件生成的数据
在这里插入图片描述
最后编译,烧录进硬件中,就可以使用示波器观察
在这里插入图片描述
4、首先需要在Adobe Audition CS6中打开任意一首歌曲(本地保存的)
在这里插入图片描述
选中一段,然后右键,选择存储选区,接着更改采用类型

接下来的操作与之前一样
编译,烧录,使用示波器观察
在这里插入图片描述

三、参考链接

1、https://blog.csdn.net/zhanglifu3601881/article/details/96632971
2、https://blog.csdn.net/qq_45748462/article/details/112392144
3、https://blog.csdn.net/qq_43279579/article/details/111990896

版权声明:本文为CSDN博主「小T归0」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_47794668/article/details/122261555

实验要求

预备实验:
1)在SD卡创建一个test-speed.txt文件,循环(不加延时)分批一次写入256字节,累计写入不少于64KB字节;然后读取此文件数据,通过串口显示出来。分析写入和读取的速率。
2)Flash地址空间的数据读取。stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。
(用cubemx写stm32f103c8t6的内部Flash)
基于片内Flash的提示音播放程序:
1)实验数据准备:用Adobe audition或goldwave等音频编辑软件录制“您好欢迎光临!”的几秒钟的声音(8khz采样、8bit量化编码的单声道wav格式),确保音频数据尽量小(最大不超64KB)。然后编程将其分批次写入stm32f103c8t6芯片内部flash区域。
2)数字音频还原播放任务:编程读取此段音频,通过 stm32f103c8t6自带的DAC通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;
提示:建议先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,通过DAC或PCM音频模块能够基本还原出原始正弦波声音后,再用语音和音乐信号进行实验。

一、Flash地址空间的数据读取

1、STM32 的内部 FLASH 简介

在 STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部 FLASH 中,由于 FLASH 存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行。

Flash的编程原理都是只能将1写为0,而不能将0写为1
所以在进行Flash编程前,必须将对应的块擦除
即将该块的每一位都变为1,块内所有字节变为0xFF。

STM32F1 的闪存(Flash)模块:主存储器、信息块、闪存存储器接口寄存器
主存储块
用于存储程序,我们写的程序一般存储在这里,对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。
信息块
该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。
闪存存储器接口寄存器
该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。

在执行闪存写操作时,任何对闪存的读操作都会锁住总线
在写操作完成后读操作才能正确地进行;
既在进行写或擦除操作时,不能进行代码或数据的读取操作。

在这里插入图片描述

2、工程验证

1、工程下载

flash工程下载链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn

2、工程修改

stm32_Flash\Drivers\CMSIS\Device\ST\STM32F1xx\Include下的system_stm32f1xx_20190722_092746.h文件修改为system_stm32f1xx.h
在这里插入图片描述
打开工程,main.c自定义写入flash中的内容
在这里插入图片描述
编译无错误
在这里插入图片描述
前期配置
点击Options->Debug->右边使用硬件ST-Link Debugger
在这里插入图片描述
接着点击S T-Link Debugger右边的Settings
在这里插入图片描述

在这里插入图片描述

依次点击Flash Download->勾选Reset and Run->Add->选择STM32F10x Med-density Flash->Add->确定即可
在这里插入图片描述
若发现
在这里插入图片描述
则上一步作废,不再操作,最后点击OK完成硬件配置

由于要连接硬件ST-Link,所以要下载一个STLink驱动,不然下载不成功
链接:https://pan.baidu.com/s/13k0PVQfg5qAHXBKJ2IZiYA
提取码:1234
接线说明
在这里插入图片描述

在这里插入图片描述
点击左上角的LOAD按钮将程序下载到STM32中
在这里插入图片描述
现在点击dubug按钮,进入硬件仿真调试
在这里插入图片描述
点击View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800C000,观察将要修改的flash区间区容:
在这里插入图片描述
其中点击某一字符右击可选择显示格式
继续View->Watch windows->Watch 1打开一个变量观察窗口
在这里插入图片描述将变量FlashWBuff 和FlashRBuff加入到Watch 1观察窗口
在这里插入图片描述
在这里插入图片描述
另外View->勾选Periodic Windows Update,开启变量自动更新
在这里插入图片描述
全速运行
这时就可以看到Watch 1窗口的数组FlashRBuff中的内容与数组FlashWBuff中的内容是一样的
在这里插入图片描述在这里插入图片描述
同时在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容

在这里插入图片描述
断电后再重新上电进行调试,程序停在main入口处时还可以看到Flash对应区间的内容保持上一次写入内容值
在这里插入图片描述

二、基于片内Flash的提示音播放程序

1.使用DAC输出周期2khz的正弦波

建议先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,通过DAC或PCM音频模块能够基本还原出原始正弦波声音后,再用语言/音乐信号进行实验。
生成单音正弦波
文件—>新建—>音频文件
在这里插入图片描述
效果->生成->音调
在这里插入图片描述
在这里插入图片描述
文件->导出->设置导出为wav文件即可
用UltraEdit得到相关数据
用UltraEdit打开刚才保存的wav文件
在这里插入图片描述
CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建文件中
在新建文件中,CTRL+A,接着鼠标右键,选择范围输入起始的行号和列号,确定就选中了整个我们需要的内容
复制到notepad++中
Edit编辑->列块编辑->输入0x
在这里插入图片描述
DAC生成正弦波的例程代码
链接:https://pan.baidu.com/s/18zsQG5mZXbjafPuAJEUkMg
提取码:706i
在这里插入图片描述
在这里插入图片描述
之后,编译下载,看能否观察到预期的正弦波。

2.数字音频还原播放

和上面操作一致,采样率修改一下,其他不变
在这里插入图片描述
由于硬件缺失,这里无法演示

三、总结

由于要给我们减负,这里的实验操作内容还是减少了的,在实验过程中还是会遇到一些硬件问题,没办法,头大,这里也同样参考了一些大佬的博客,希望继续努力。

四、参考链接

https://blog.csdn.net/qq_46467126/article/details/122098829
https://blog.csdn.net/qq_40147893/article/details/107423621
https://blog.csdn.net/zhanglifu3601881/article/details/96632971
https://blog.csdn.net/Ace_Shiyuan/article/details/78196648

版权声明:本文为CSDN博主「加菲猫不爱吃猫粮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_48609250/article/details/122179642

音频数据的Flash读取与DAC播放

原理介绍

flash

在 STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码,我们在电脑上编写

好应用程序后,使用下载器把编译后的代码文件烧录到该内部 FLASH 中,由于 FLASH 存

储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并

运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uQbyBtmA-1640943853238)(音频数据的Flash读取与DAC播放/image-20211231121500865.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k7k4N7K6-1640943853239)(音频数据的Flash读取与DAC播放/image-20211231122753889.png)]

DAC

DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对

应的模拟电压输出,它的功能与 ADC 相反。在常见的数字信号系统中,大部分传感器信号

被化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、处理的数字编码,由计

算机处理完成后,再由 DAC 输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器

件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。

STM32 具有片上 DAC 外设,它的分辨率可配置为 8 位或 12 位的数字输入信号,具有

两个 DAC 输出通道,这两个通道互不影响,每个通道都可以使用 DMA 功能,都具有出错

检测能力,可外部触发。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ubSaq2Pg-1640943853240)(音频数据的Flash读取与DAC播放/image-20211231122911381.png)]

flash读取

配置cubmax

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFvEsDvC-1640943853240)(音频数据的Flash读取与DAC播放/image-20211231123718251.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwnqXoUU-1640943853241)(音频数据的Flash读取与DAC播放/image-20211231123754170.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lAUkwPxI-1640943853241)(音频数据的Flash读取与DAC播放/image-20211231123832742.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J8arRi0R-1640943853242)(音频数据的Flash读取与DAC播放/image-20211231124141131.png)]

工程代码修改

将falsh.c和falsh.h文件加入工程中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RVW9QpMD-1640943853242)(音频数据的Flash读取与DAC播放/image-20211231135105940.png)]

在main.c中添加代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uHYCiZcm-1640943853242)(音频数据的Flash读取与DAC播放/image-20211231134834842.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4lordqVD-1640943853243)(音频数据的Flash读取与DAC播放/image-20211231140222818.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EAFSlgSa-1640943853243)(音频数据的Flash读取与DAC播放/image-20211231140249032.png)]

stlink调试

ST-LINK STM32F103
SWCLK/TCK SWCLK/TCK
SWDIO/TMS SWDIO/TMS
GND GND
VCC VCC

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KFPGFC2T-1640943853243)(音频数据的Flash读取与DAC播放/image-20211231145712603.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j8rbCFgX-1640943853244)(音频数据的Flash读取与DAC播放/image-20211231150125830.png)]

若IDCODE显示出来,连接成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BPT8dgbH-1640943853244)(音频数据的Flash读取与DAC播放/image-20211231145746754.png)]

点击load

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OUK9icoH-1640943853244)(音频数据的Flash读取与DAC播放/image-20211231153550666.png)]

完成烧录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ipQMY4iE-1640943853245)(音频数据的Flash读取与DAC播放/image-20211231153513482.png)]

点击调试

添加memory1、watch1和watch2查看变量变化情况

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbaJskEr-1640943853245)(音频数据的Flash读取与DAC播放/image-20211231160445871.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D8BOsIH8-1640943853245)(音频数据的Flash读取与DAC播放/image-20211231161422383.png)]

点击全速运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1cPp08qr-1640943853246)(音频数据的Flash读取与DAC播放/image-20211231160542407.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MmUi26dk-1640943853246)(音频数据的Flash读取与DAC播放/image-20211231161403070.png)]

看出内容一样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nEXtXAQ5-1640943853246)(音频数据的Flash读取与DAC播放/image-20211231155834997.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CmcfyvkC-1640943853246)(音频数据的Flash读取与DAC播放/image-20211231155847231.png)]

基于 Flash 的提示音 DAC 播放

使用 DAC 产生 2khz 周期的正弦波输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-46ZlnRUc-1640943853247)(音频数据的Flash读取与DAC播放/image-20211231163154461.png)]

修改参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F13MX1qC-1640943853247)(音频数据的Flash读取与DAC播放/image-20211231163321018.png)]

点击效果->生成基本音色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q6uGsgWQ-1640943853247)(音频数据的Flash读取与DAC播放/image-20211231163747968.png)]

修改参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zs0xfK6Y-1640943853247)(音频数据的Flash读取与DAC播放/image-20211231163939493.png)]

点击如下,输出文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLjtM5UD-1640943853248)(音频数据的Flash读取与DAC播放/image-20211231164009000.png)]

点开UltraEdit ,打开刚才au输出的wav文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kBHLBYnz-1640943853248)(音频数据的Flash读取与DAC播放/image-20211231164325246.png)]

点击Ctrl+a 全选,鼠标右键,16进制复制选定视图,将其复制到新的文件下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J9DLFlg8-1640943853248)(音频数据的Flash读取与DAC播放/image-20211231165646926.png)]

Ctrl+a,鼠标右键,选择范围,输入起始列号和结束列号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LseK4QDU-1640943853248)(音频数据的Flash读取与DAC播放/image-20211231165306629.png)]

复制到notepad++

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kTFA1IcO-1640943853249)(音频数据的Flash读取与DAC播放/image-20211231165337482.png)]

在野火提供的样例程序——DAC 输出正弦波中添加数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GZK2cHKe-1640943853250)(音频数据的Flash读取与DAC播放/image-20211231173034809.png)]

编译无误,即可烧录,用示波器得到波形

使用 DAC 输出数字音频歌曲数据转换为模拟音频波形输出

将歌曲转化为wav后,在au中打开,选择存储选区,完成后,步骤和上面一样用示波器得到波形

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BLhVBHrO-1640943853250)(音频数据的Flash读取与DAC播放/image-20211231173810268.png)]

总结

本次学习对内部flash和DAC有了更多的了解,同时对声音的处理也有了粗略的了解。

版权声明:本文为CSDN博主「gjish」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gjish/article/details/122260553

目录

一、Flash地址空间的数据读取

1.1Flash的原理

1.2内部Flash的构成

二、STM32CubeMx工程的建立

三、MDK5代码编写

四、ST-LINK硬件接线

五、仿真调试

六、基于片内Flash的提示音播放程序

 6.1使用DAC输出周期2khz的正弦波

 6.2使用DAC输出数字音频歌曲数据转换为模拟音频波形输出

6.3 录制音频并播放

总结

参考文献 


一、Flash地址空间的数据读取

1.1Flash的原理

在 STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码,在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部 FLASH 中,由于 FLASH 存 储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行。

Flash的编程原理都是只能将1写为0,而不能将0写为1,所以在进行Flash编程前,必须将对应的块擦除,即将该块的每一位都变为1,块内所有字节变为0xFF。

1.2内部Flash的构成

主存储器:一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用 户应用程序的空间,芯片型号说明中的 256K FLASH、512K FLASH 都是指这个区 域的大小。 主存储器分为 256 页,每页大小为 2KB,共 512KB。这个分页的概念,实质就是 FLASH 存储器的扇区,与其它 FLASH 一样,在写入数据前,要先按页(扇区) 擦除。

系统存储器:系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负 责实现串口、USB 以及 CAN 等 ISP 烧录功能。

选项字节:选项字节用于配置 FLASH 的读写保护、待机/停机复位、软件/硬件看门狗等功能, 这部分共 16 字节。可以通过修改 FLASH 的选项控制寄存器修改。

二、STM32CubeMx工程的建立

1.设置PC13为GPIO_Output,PD0为RCC_OSC_IN,PD1为RCC_OSC_OUT,PA13为SYS_JTMS-SWDIO,PA14为SYS,如下图

2.配置定时器

3.GPIO的引脚设置

4.设置堆栈大小为4K

 然后到处MDK5工程文件

三、MDK5代码编写

将事先准备好的flash.c 及flash.h加入到工程中

2.再主函数里面添加

 

编译没有错误,进行调试。

四、ST-LINK硬件接线

 按下表进行接线调试

ST-LINK STM32
SWCLK/TCK SWCLK/TCK
SWDIO/TMS SWDIO/TMS
GND GND
VCC VCC

在电脑上下载好响应的ST-Link驱动,上电,可以看到STLink在电脑上显示出来了

ST-Link 驱动已经安装完成。接下来只需要在 mdk 工程里面配置一下 ST-Link即可

回到Keil下,在魔法棒Option选项卡进行设置
首先是选择调试器,使用的是 ST-Link,在 Debug 选项卡中,选择ST-Link Debugger 点击settings

然后点击LOAD进行下载

表示烧录成功。 

五、仿真调试

进入debug,如果是仿真调试的话,实际操作发现数组没有产生变化。
于是又用STlink又试了一下,以下主要是STlink调试的过程。

(1)View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容:
(2)View->Watch windows->Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口

(3)全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样了

(5)在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容
(6)断电,重新上电后再次调试,程序刚停在main入口处时还可以看到Flash对应区间的内容保持上一次写入内容值。

 

(7)重复读写入,这里没什么变化 

之后的FF说明数据没有再写入覆盖了

六、基于片内Flash的提示音播放程序

 6.1使用DAC输出周期2khz的正弦波

生成单音正弦波
文件—>新建—>音频文件 

效果->生成->音调,红框为修改的地方

设置相关的数据

设置导出为wav文件

用UltraEdit得到相关数据
用UltraEdit打开刚才保存的wav文件

CTRL+A,接着鼠标右键,选择十六进制复制选定视图,将内容粘贴到一个新建文件中
在新建文件中,选中全部内容,加入0X,这样所有的内容都变成十六进制,如图,

使用DAC生成正弦波的例程代码

链接:https://pan.baidu.com/s/1OjhG9szfc6UylScP8pYCGA 
提取码:lcln 

将内容复制到main.c如图位置处即可

之后写入Flash,再将从FLASH读出的数据,添加到示例代码的数组里,烧录程序。

 6.2使用DAC输出数字音频歌曲数据转换为模拟音频波形输出

修改采样率,其他操作与前面相同

6.3 录制音频并播放

(1)点击录制按钮选择录音时间为2s

 (2)按照上述步骤用ultraEdit打开刚刚生成的.wav文件,

CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建文件中,选出16进制,打开notepad++后,将上面选中的内容复制粘贴到该软件中,点击第一行的每个数字后面,列编辑插入“0x”

(3)写入FLASH

将生成的音频十六进制写入FLASH,具体过程在这篇博客前面有,不再阐述

(4)数字音频还原播放任务

使用代码:

链接:https://pan.baidu.com/s/1n6D4TDhnKX2DxjeOgsxBqQ 
提取码:qwer

(5)添加使用刚刚从FLASH写入并读出的数据,给数组赋值

(6)烧录程序,没有其他模块,这里没有进行播放等其他操作

总结

从个实验里我学习到了flash的大概原理,第一个小实验通过下载大佬的代码,加入了相关的程序和和头文件后一次就成功得到了结果,很开心。后面的几个实验都还没有完全做出来,需要进一步跟着大佬学习。

参考文献 

使用STM32F103的DAC功能实现音频输出_咩咩叫的闲鱼的博客-CSDN博客_stm32f103有dac目录DAC简介准备输出一个周期2khz的正弦波——基于HAL库将一段数字音频歌曲数据转换为模拟音频波形输出(循环)总结参考DAC简介DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与 ADC相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而 ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计 算机处理完成后,再由 DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器 件,使人类易于感知。如音频信号的采集及还原就是https://blog.csdn.net/qq_45748462/article/details/112392144STM32 进阶教程 13 – FLASH的读写操作_张十三的博客-CSDN博客_stm32f103c8t6flash读写前言在嵌入式应用开发中,经常会遇到掉电后还要保存的信息,这些信息通常只能保存在外部的一些存储芯片中,如外部flash,外部EEPROM, 其实这些信息同样可以保存在STM32自带的内部flash中,本节将带领大家来实现这一操作。示例详解基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是STM32F103c8t6, 使用stm32cubemx 工具自动产生的配...https://blog.csdn.net/zhanglifu3601881/article/details/96632971【嵌入式22】STM32F1C8T6音频数据的Flash读取与DAC播放_噗噗的罐子博客-CSDN博客本文主要介绍STM32F103C8T6下音频数据的Flash读取与DAC播放https://blog.csdn.net/qq_46467126/article/details/122098829?spm=1001.2014.3001.5501

基于STM32F103C8T6的FLASH的DAC音频输出_Laul Ken-Yi的博客-CSDN博客目录一、知识点二、音频准备2.1 生成wav文件2.2 提取.wav文件十六进制2.3 notepad++2.4 录制“您好欢迎光临”三、编写程序3.1 写入FLASH​3.2数字音频还原播放任务四、总结一、知识点DAC简介DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与 ADC相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而 ADC把电压模拟信号转换成易于计算机...https://blog.csdn.net/qq_60678931/article/details/122225830?spm=1001.2014.3001.5501

版权声明:本文为CSDN博主「亚大贼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_48729490/article/details/122240467

一、什么是Flash?

Flash 是存储芯片的一种,通过特定的程序可以修改里面的数据。Flash 存储器又称闪存,它结合了ROM 和RAM 的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据(NVRAM 的优势), U 盘和MP3里用的就是这种存储器。在过去的20年里,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备,然而近年来Flash 全面代替了ROM(EPROM)在嵌入式系统中的地位,用作存储Bootloader 以及操作系统或者程序代码或者直接当硬盘使用(U 盘)。

Flash的编程原理都是将1写为0,但不能将0写为1,所以在进行Flash编程前,必须将对应的块擦除,即将该块的每一位都变为1,块内所有字节变为0xFF。

STM32的闪存(Flash)模块主要包括:主存储器、信息块和闪存存储器接口寄存器。

①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页
2K字节。注意,小容量和中容量产品则每页只有 1K 字节。

②信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接
V3.3,BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。

③闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。

二、怎么进行Flash的读取?

Flash地址空间的数据读取。stm32f103c8t6只有20KB
内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。

三、Flash实验

本次实验主要是要通过读取片内Flash的提示音播放波形声音

1.创建CUBEMX工程

配置定时器在这里插入图片描述
打开外部时钟
在这里插入图片描述
配置时钟
在这里插入图片描述
将PC13设置为output在这里插入图片描述
设置堆栈大小为4k,生成文件

2.在keil5中打开文件

将flash.c和flash.h添加到工程中
添加flash.c的时候选第二行
在这里插入图片描述
在main.c中分别添加如下代码(定义一下)

uint8_t FlashWBuff [255];
uint8_t FlashRBuff [255];
uint8_t i;
uint8_t FlashTest[] = “Hello This is Flash Test DEMO”;

将将程序下载到STM32里。
点击进入Debug模式。
点击View->memory windows,选择 memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容
在这里插入图片描述
点击View->Watch windows,选择Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口
在这里插入图片描述
全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样,而定义好的句子写到了地址0x0800c000中了。
在这里插入图片描述

二、基于片内Flash的提示音播放程序

1.生成正弦波

可以用专业的音频处理软件AU等做,我这里为了方便直接用格式工厂转化一下。并输出
在这里插入图片描述
用UltraEdit打开刚才保存的wav文件
在这里插入图片描述

2.将DAC导入程序

打开下载好的DAC输出正弦波的程序,在bsp_dac.c中用上述内容替换框选内容,就可以输出不同的波形。在这里插入图片描述
随后将程序下载到STM32里。
接入同学的喇叭后,正弦波会发出嘟嘟嘟的声音。表明实验还算成功了。
由于没有示波器,最后波形不予展示。

参考资料

https://blog.csdn.net/qq_46467126/article/details/122098829?spm=1001.2014.3001.5501

版权声明:本文为CSDN博主「惹毛了就重启」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_54658073/article/details/122524885

生成海报
点赞 0

惹毛了就重启

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

将音频编解码器添加到嵌入式系统的 5 个技巧

嵌入式系统播放音频的能力正在成为一个相当普遍的功能。音频为用户提供了很好的反馈,但如今有如此多的高保真音频可用,使用哔哔声和啁啾声不再削减它。开发人员当然可以使用分立组件和 DAC 从系统中获得不错的音频&#xff0