外设基本介绍
Flash是一种非易失性存储技术
在单片机中,它放在哪呢?一般flash,我们操控单片会放在所分配flash中,stm32f103c8t6分配的的空间是64K,也就代码从基地址0x08000000-080010000这一段空间用来存放代码,但我们每个人代码都会有64K吗,我们一般都是使用不完的,在kill编译代码时,我们可以看到编译完成的数据,里面就有你代码和数据的大小,上传时,会先擦除芯片,不会全擦除,stm32最小操作单位是1k,也就是说,假如我代码的大小是1.5k,实际上会擦除2k,在进行烧录,那剩下的空间都是空闲的,也就是说我现在有(64-2)k的数据数可以存放数据。

为什么要使用flash?
依据flash的特性(掉电不丢失),依据这样的特性,我们不仅可以拓充在运行中使用的内存,还可以利用它掉电不丢失的特性去存储一些东西,使单片机灵活的跑起来,当单片机的RAM在运行过程中,我们除了可以去调节单片机堆和栈的大小,还可以利用flash.
例1
我要存储大量的数据,且还要拥有掉电不丢失的特性时,这时我们使用变量去存储,就不太合适了,因为这样,不仅浪费内存,还不能做到掉电不丢失,除非你用的是一个永远不用修改的变量,但这就体现出flash的优势了,它不仅能实现大量数据的存储,掉电不丢失,还能修改并保存!
例2
什么什么传感器那些,假说我做一个需要单片机协同驱动的传感器,用户需求需要设置一些寄存器的配置(例如,串口波特率,及串口相关配置等),需要下次上电后保持相关配置,根据这些寄存器进行相关外设的初始化,例如那个ESP01s wifi模块,有没有印象,使用AT指令去改变波特率后,下一次使用,就变成你修改的波特率了,他无非使用的芯片的flash或者外接flash去设计寄存器,去存储相关数据
Flash操作指南
下面我们详细介绍flash的操作,使用芯片STM32F103C8T6单片机
该怎么操作它呢?
操作该外设不需要进行初始化,包含相应的32驱动头文件即可直接使用,官方封装得很好。
除了读取flash,操作前都需要解锁,操作完成后上锁

1.存储前先进性擦除

查出方式分两种,中断查出,直接擦除
2.检验擦除
擦除之后,所有位都变为了1,可以像这样对擦出的地址空间进行检查

3.写入

4.读取
读取就是直接读取,很简单,可以8/16/32进行读取,还是蛮简单,你可以使用memcpy进行对一整片空间进行操作,也比较方便。
操作的时候我们需要注意什么呢?
1.操作flash时,我们需要注意,不要操作代码空间段,在操作时有一个很好的办法可以规避这个问题,就是我们从基地址+flash的最大空间(也就是最后往前分配)往前存放(例如,08000000+FA00)
2.以K为单位(stm32f103c8t6),也就是1024k,例如我们存放512字节数据,我们要实际操作1k的flash,分配空时也是如此(例如,1024= 400,(08000000+FB00~08000000+FFFF)
3.操作最低字节数(stm32f103c8t6的话最低16bit的存储,而有的单片机支持最低8位),这个一定要注意,不然会发生触发异常中断(硬中断),导致程序卡死,可以在flash驱动头文件中找到操作字节数对应的宏

什么样的情况下适合使用flash?
需要大量的数据存储;
例如照片数据,历史数据等
需要掉电不丢失;
需要可更改的特性;
寄存器属性等