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

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

2021/12/31 1:49:31

目录

  • 一、STM32的flash介绍
    • 1.1 flash分类
    • 1.2 主存储块的保护
  • 二、Flash地址空间的数据读取
    • 2.1 使用STM32CubeMx配置环境
    • 2.2 通过st-link读取falsh地址
  • 三、基于片内Flash的提示音播放程序
    • 3.1 使用 Adobe Audition 产生正弦波单音
    • 3.2 使用 DAC 输出数字音频歌曲数据转换为模拟音频波形输出
  • 四、总结
  • 参考文章

一、STM32的flash介绍

1.1 flash分类

  根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。 主存储块用于存储程序,我们写的程序一般存储在这里。 信息块又分成两部分:系统存储器、选项字节。 系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoader,然后锁死,用户是无法改变这个区域的。 选项字节存储芯片的配置信息及对主存储块的保护信息。

1.2 主存储块的保护

  可以对主存储块中的数据进行读保护、写保护。 读保护用于保护数据不被非法读出。防止程序泄密。写保护用于保护数据不被非法改写,增强程序的健壮性。

读保护
主存储块启动读保护后,简单的说具有以下特性:
1.从主存储块启动的程序,可以对整个主存储块执行读操作,不允许对主存储块的前4KB进行擦除编程操作,可以对4KB之后的区域进行擦除编程操作。
2.从SRAM启动的程序,不能对主存储块进行读、页擦除、编程操作,但可以进行主存储块整片擦除操作。
3.使用调试接口不能访问主存储块。这些特性足以阻止主存储器数据的非法读出,又能保证程序的正常运行。
只有当RDP选项字节的值为RDPRT键值时,读保护才被关闭,否则,读保护就是启动的。因此,擦除选项字节的操作,将启动主存储块的读保护。如果要关闭读保护,必须将RDP选项字节编程为RDPRT键值。并且,如果编程选项字节,使RDP由非键值变为键值(即由保护变为非保护)时,STM32将会先擦除整个主存储块,再编程RDP。芯片出厂时,RDP会事先写入RDPRT键值,关闭写保护功能。

写保护
STM32主存储块可以分域进行写保护。如果试图对写保护的域进行擦除或编程操作,在闪存状态寄存器(FLASH_SR)中会返回一个写保护错误标志。STM32主存储块每个域4KB,WRP0-WRP3选项字节中的每一位对应一个域,位为0时,写保护有效。对于超过128KB的产品,WRP3.15保护了域31及之后的所有域。显然,擦除选项字节将导致解除主存储块的写保护。

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

2.1 使用STM32CubeMx配置环境

  本次实验使用STM32CubeMX自动生成的框架,配置教程参考的时STM32 进阶教程13——FLASH的读写操作
如果想要直接使用这个博主的代码的话,需要注意一个地方就是要记得修改一个代码的名字,不然会报错(目录比较深,有点难找,根据下图找即可)
在这里插入图片描述
配置完成后,要添加一个flash.c的代码,添加过程依旧可以上面那篇大佬的博客,写的很详细,我也只是依葫芦画瓢。
在这里插入图片描述

2.2 通过st-link读取falsh地址

添加观察窗口
  在keil中通过st-link烧入程序后,点击debug,然后点击View,按照下图添加watchMemory1
在这里插入图片描述
在这里插入图片描述
观察flash地址
  在Memory中输入地址0x0800C000并回车,可以看到之前在代码中添加的测试语句正确的显示了出来,说明Flash写入成功,并成功地根据地址读取到。
在这里插入图片描述
在这里插入图片描述
使用for循环写入数据

  在main,c中修改这部分代码,测试stm32flash的上限,代码如下

	for(int i=0; i<1000; i++)
	{
		FlashWriteBuff( add_test, FlashTest,sizeof(FlashTest) );        // 写入数据到Flash
		add_test = add_test + sizeof(FlashTest);
	
	}

在这里插入图片描述
但好像循环次数太多了,到边界后flash里面写进去的东西读出来都是些乱码
在这里插入图片描述

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

3.1 使用 Adobe Audition 产生正弦波单音

步骤如下
在这里插入图片描述
在这里插入图片描述
依次点击效果->生成基本音色
在这里插入图片描述
预设中选择和弦就会自动生成比较漂亮的正弦波
在这里插入图片描述
随后将文件以wav格式导出
在这里插入图片描述
在这里插入图片描述
此处我使用了一个可以将WAV音频文件转为C语言的软件WavToC,在这个软件中导入刚才的wav文件,点击生成代码,即可得到一个C语言程序。
在这里插入图片描述
在这里插入图片描述
代码保存后,随意使用一个IDE打开即可(我使用的是Dev-c++),将骑宠的这个数组复制下来。
在这里插入图片描述

接下来使用野火提供的一个样例程序(DAC 输出正弦波),将刚才复制的数组替换下面这个数组
(链接:https://pan.baidu.com/s/1ixWoW8xyMe3_hyWXpkd_Tg
提取码:luha)
在这里插入图片描述
在这里插入图片描述

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

使用AU打开一段自己电脑上存在的wav文件,然后导出为
在这里插入图片描述
然后再和之前相同,使用WavToC导出为C语言文件,然后可以点击试听是否音乐是否失真,可以听出,虽然语音听着比源文件要粗糙很多,但是内容还是可以辨识出来的。
在这里插入图片描述


四、总结

  这次实验通过对stm32的Flash进行了读取,并通过st-link软件调试的方法观察了Flash的写入地址,更进一步,因为对stm32f103c8t6的真实flash大小感到好奇,所以接着使用了一个循环语句,对flash进行不断地写入来测试flash的大小,但是对空间的大小的计算还不太熟练,所以没能很精确的算出flash的大小。
  然后又接着做了DAC播放的实验,首先使用AU生成了一个单音正弦波进行测试,再然后又测试了自己本地的一个wav音频文件,过程中都使用了WavToC软件来将wav文件转化为C程序,这让我对音频的本质有了更加深入的理解,对于电脑而言本质都是一些比特流,这为我之后即将需要完成的大作业作了铺垫。


参考文章

STM32 进阶教程 13 – FLASH的读写操作
STM32 Flash做为存储器储存数据