STM32F1C8T6Flash读取音频和DAC播放

一、Flash简介

1、Flash原理

Flash全名叫做Flash Memory,从名字就能看出,是种数据存储设备,存储设备有很多类,Flash属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device)。关于什么是非易失性/易失性,从名字中就可以看出,非易失性就是不容易丢失,数据存储在这类设备中,即使断电了,也不会丢失,这类设备,除了Flash,还有其他比较常见的入硬盘,ROM等,与此相对的,易失性就是断电了,数据就丢失了,比如大家常用的内存,不论是以前的SDRAM,DDR SDRAM,还是现在的DDR2,DDR3等,都是断电后,数据就没了。

典型的Flash内存单元的物理结构:
在这里插入图片描述

2、STM32F1中的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地址空间的数据读取

1、题目要求

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

2、CUbeMX工程建立

配置定时器:
在这里插入图片描述
管脚设置:
在这里插入图片描述
如图将PC13设置为GPIO OUT

系统时钟树:
请添加图片描述
RCC:
请添加图片描述
NVIC:
请添加图片描述
设置堆栈大小后输出工程:
在这里插入图片描述

3、Keil工程修改

首先在生成的工程中加入flash.c和flash.h文件。
链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn
记得将.c文件保存在Src中,将.h文件保存在Inc中。
在工程中右键添加:
在这里插入图片描述
在main.c中添加头文件:

#include "flash.h"

在这里插入图片描述

/* USER CODE BEGIN 0 */
uint8_t FlashWBuff[255];
uint8_t FlashRBuff[255];	
/* USER CODE END 0 */

在这里插入图片描述

  /* USER CODE BEGIN SysInit */
FlashWriteBuff( DEVICE_INFO_ADDRESS,FlashTest,sizeof(FlashTest));  //写入数据到Flash
for(i=0;i<255;i++)
	FlashWBuff[i]=i;
FlashWriteBuff( DEVICE_INFO_ADDRESS+sizeof(FlashTest),FlashWBuff,255);  //写入数据到Flash
FlashReadBuff ( DEVICE_INFO_ADDRESS+sizeof(FlashTest),FlashRBuff,255);  //从Flash中读取数
  /* USER CODE END SysInit */

在这里插入图片描述
编译调试:
在这里插入图片描述
看到没有错误。

4、STlink调试说明

接线

ST-LINKSTM32
SWCLK/TCKSWCLK/TCK
SWDIO/TMSSWDIO/TMS
GNDGND
VCCVCC

回到Keil下,在魔法棒Option选项卡进行设置
首先是选择调试器,如果使用的是 ST-Link,在 Debug 选项卡中,请选择ST-Link Debugger
在这里插入图片描述
安装好ST-Link驱动
选择好ST-Link Debugger后点击Setting进行设置:
在这里插入图片描述
看到如图中出现红框内的信息说明连接成功。

点击如图中的下载烧录即可。

5、调试运行

点击debug进入调试
在视图中选择内存窗口选择内存1,即memory窗口:
在这里插入图片描述
同样的在观测窗口点击观测1,然后添加两个变量FlashWBuff 和 FlashRBuff:
在这里插入图片描述
点击全速运行再关闭,看到芯片的PC13口由灭变亮。
在这里插入图片描述
看到FlashWBuff 和 FlashRBuff变量中分别写入了数据。
在这里插入图片描述
在这里插入图片描述

在memory窗口中输入FLASH地址0x0800C000,右键点击选择Ascii进行观察:
在这里插入图片描述
看到我们在main中的数据成功写入了该地址。

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

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

软件需要:Adobe Audition CS6
首先用Adobe Audition CS6产生正弦波进行测试,如果播放成功那么音乐是同样的原理就都可以成功。

首先新建音频文件:
在这里插入图片描述
在效果中点击生成基本音色:
在这里插入图片描述
然后选择正弦波,设置频率振幅等参数:
在这里插入图片描述
然后在文件中导出文件:
请添加图片描述
选择导出文件名,选择导出位置,然后这里默认是与导出类型与新建的类型和频率相同,我们也可以在这里更改:
在这里插入图片描述
用UltraEdit文本编辑器打开音频文件。
在这里插入图片描述
ctrl+A全选,右键点击十六进制复制选定视图,然后新建一个文件,将复制的内容粘贴进去。
在这里插入图片描述
ctrl+A全选后右键选择范围。
在这里插入图片描述
在这里插入图片描述
这样就选中了我们需要 的内容。
上面选中的内容复制粘贴到notepad++中。
在这里插入图片描述

在编辑中选择列块编辑。
在这里插入图片描述
输入0x
在这里插入图片描述
这里借用DAC生成正弦波的例程代码
链接:https://pan.baidu.com/s/18zsQG5mZXbjafPuAJEUkMg
提取码:706i
将红框内的数字替换:
在这里插入图片描述
之后,编译下载,看能否观察到预期的正弦波。

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

1.使用Audition截取一段喜欢的音乐
①选择文件->打开,找到对应的音乐
②选中一段,然后右键,选择存储选区,接着更改采用类型
在这里插入图片描述
在这里插入图片描述
编辑好代码后,烧录,借助音频模块听听看能否还原

四、总结

本次实验验证使用了Flash存储读取数据,理解了Flash的原理。

五、参考资料

https://www.cnblogs.com/yuanqiangfei/p/9400435.html

https://blog.csdn.net/lushoumin/article/details/87694389

https://blog.csdn.net/qq_43279579/article/details/111990896

https://blog.csdn.net/zhanglifu3601881/article/details/96632971