(一)片内FLASH的认识
不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节。市面上 STM32F1 开发板使用的芯片是 STM32F103系列,其 FLASH 容量一般为 512K 字节,属于大容量芯片。大容量产品的 Flash 模块组织结构如图 所示:
STM32F1 的闪存(Flash)模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。下面我们就来介绍下这些组成部分:
①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以看出主存储器的起始地址就是0X08000000, BOOT0、BOOT1 都接 GND 的时候,就是从 0X08000000 开始运行代码的。
②信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能,这里我们不做介绍,大家可以百度了解。
③闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。
在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。
(二) 如何对闪存进行读取、编程和擦除
STM32F1 可通过内部的 I-Code 指令总线或 D-Code 数据总线访问内置闪存模块,本章我们主要讲解数据读写,即通过 D-Code 数据总线来访问内部闪存模块。为了准确读取 Flash 数据,必须根据 CPU 时钟 (HCLK) 频率和器件电源电压在 Flash 存取控制寄存器 (FLASH_ACR)中正确地设置等待周期数(LATENCY)。当电源电压低于 2.1V 时,必须关闭预取缓冲器。 Flash 等待周期与 CPU 时钟频率之间的对应关系,如图 所示:
闪存的编程顺序如下
STM32 的闪存擦除分为两种:页擦除和整片擦除。页擦除过程如下所示:
(三)基于flash的数据提取
项目创建
打开STM32CubeMX创建工程
选择芯片,本次实验我选择的是STM32F103C8T6
引脚配置
RCC设置
SYS设置
NVIC设置,中断配置(保持默认)
时钟树设置
工程设置
设置堆栈的大小,
导出代码,并将先准备好的flash.c 及flash.h加入到工程中
打开keil添加成功
打开main.c加入下列代码
编译成功
电路连接
连接ST-link
Debug设置
调试
点击下载把程序下载到板子上:
(四)基于flash的提示音播放
新建音频文件
插入正弦波
另存为wab文件
生成wav文件之后,用UltraEdit将其打开,Ctrl+A选择全部然后右键点击选择选择范围
复制到notepad++里打开
直接用DAC生成正弦波的工程
然后将生成得到的数据粘贴进入数组即可(记得修改数组大小)
数据粘贴后编译
烧录,可以采用示波器观察
(五)实验心得
由于时间紧任务重,只能先做到这里了,以后可能会补充。
(六)参考链接
https://blog.csdn.net/zhanglifu3601881/article/details/96632971
https://blog.csdn.net/lushoumin/article/details/87694389
UltraEdit软件破解版:
https://pan.baidu.com/s/1K1yGM9SxsfopXxs3DAttzg
下载密码: 5p5v
工程下载链接:
链接:https://pan.baidu.com/s/15SqVhOrC54GLS7Yoyvk1EA
提取码:1234