STM32-FLASH存储器

一 FLASH存储器
FLASH存储器的英文名称是"Flash Memory",一般简称为"Flash",它属于内存器件的一种,是一种非易失性( Non-Volatile )内存。闪存的物理特性与常见的内存有根本性的差异:目前各类 DDR 、 SDRAM 或者 RDRAM 都属于挥发性内存,只要停止电流供应内存中的数据便无法保持,因此每次电脑开机都需要把数据重新载入内存;闪存在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。

那么FLASH闪存说白了就是断电以后也能存储数据,他不像挥发性内存,掉电以后其中的内容数据会丢失,他经常被用到存储上一次的状态配置等需要存储状态的情况。
二 FLASH的存储原理
STM32-FLASH存储器_第1张图片
单片机将FLASH闪存单元按照页地址进行分类,每一页有1024个字节,我们的程序编译以后就是存储在FLASH中,所以每次重新上电以后程序都不会丢失,程序数据优先存储在页0,从页0开始排列,优先存储在页码位。而后我们自己定义的FLASH数据就要尽量存储在末尾的页码,因为当程序数据与FLASH数据冲突时,就会出现程序跑飞的情况。
三 FLASH的写操作
1 解锁FLASH编程擦除控制器
单片机为了防止程序跑飞或者防止程序被随意更改而设立了FLASH编程擦除控制器,设立其的目的就是保护单片机不被随意更改。
2 清除标志位
清除标志位的作用实际上就是初始化的过程,使用之前都应该进行程序的初始化,清除标志位的作用就是进行初始化。
STM32-FLASH存储器_第2张图片
STM32-FLASH存储器_第3张图片
3 擦除指定的地址页
程序要求擦出数据时要对数据进行整页擦除,哪怕你要更改写入一个bit的数据也要进行整页擦除,记住:“写入之前先擦除!!!”
4 再次清除标志位
5 锁定FLASH编程擦除控制器
在清除标志位等过后,我们就要锁定FLASH编程擦除控制器,以防止其被误操作。
四 函数的具体调用

#define FLASH_START_ADDR  0x0801f000  //定义函数起始地址
​
int main (void)//主函数
{
  u16 a; //定义一个变量用于存储状态
  RCC_Configuration();
  LED_Init();//LED初始化
  KEY_Init();//按键初始化
​
  a = FLASH_R(FLASH_START_ADDR);//将函数起始地址赋给变量a
​
  GPIO_Write(LEDPORT,a); //通过寄存器操作点亮LED
​
  while(1)
  {
    if(!GPIO_ReadInputDataBit(KEYPORT,KEY1))//判断按键是否按下
    {
      delay_ms(20); //延时消抖
      if(!GPIO_ReadInputDataBit(KEYPORT,KEY1))//再次判断按键是否按下
      {
        a++; //按键按下一次就自加一次
        if(a>3)
        {
          a=0; 
        }
        GPIO_Write(LEDPORT,a); 
​
        FLASH_W(FLASH_START_ADDR,a);//将a的状态写入起始地址
​
        while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开
      }
    }
  }

这个函数实现的功能就是按键第一次按下,LED1点亮,再按下一次,LED2点亮,按键第三次按下,LED1和LED2同时点亮。而后再次按下同时熄灭,然后我们随意选择一种状态进行点亮,然后断电,断电以后再次上电,你会发现有了FLASH以后,FLASH会存储状态,重新上电以后还会回到初始状态,这就是FLASH的作用。
关于我:
我是一名爱好电子的学生,我只是个知识的搬用工,记录我的学习例程与经验,我希望能用我浅显易懂的语言来传播更多的知识。欢迎关注我的微信公众号“一昊”我渴望与你一起进步!!
STM32-FLASH存储器_第4张图片

你可能感兴趣的:(STM32)