STM32内部Flash读写

前言:把数据存储到到EEPROM或FLASH可以对一些数据进行掉电可存储,STM32L系列才有内部EEPROM,其他系列都只有Flash,操作FLASH也可以达到掉电保存数据的效果。关于存储器件家族介绍用一张图来描述最好不过了,如下:

STM32内部Flash读写_第1张图片

硬件支持:STM32F051C8T6,64KB的FLASH,没有EEPROM。

正文:

按照不同容量,Flash组成部分:主存储器块和一个信息块以及一些闪存存储器和接口寄存器

其中主存储器有三类:321K字节/(小容量)、1281K字节/(中容量)2562K字节/(大容量)。

C8T6有64k的主存储器容量属于中等容量类型。

STM32内部Flash读写_第2张图片

 

FLASH读写流程:

  • 对FLASH写入数据:

    1. 解锁FLASH
    2. 擦除FLASH
    3. 写入数据到FLASH
    4. 锁住FLASH
  • FLASH读取数据:直接读取相应的FLASH地址即可。

先在数据手册上面查看Flash的大小以及起始和终止地址,这里是0x0800 0000 ~ 0x0801 FFFF

 

STM32内部Flash读写_第3张图片

实现函数:

1、解锁。

HAL_StatusTypeDef HAL_FLASH_Unlock(void)

2、在HAL库里面给我们提供了两个函数来写Flash,一个非中断方式一个中断方式

HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data);

 TypeProgram指定了写半字,全字还是双字,所以Data是一个64位的变量。实质是都是每次写16bit,由于一次只能写入16bit的数据,当要写入超过半字的数据时,非中断用的方法是在函数里等待上一次写操作完成,然后再继续写入半字,只是这里HAL库帮我们封装好了而已。

3、Flash擦除,这个函数会对整页进行擦除操作。

void FLASH_PageErase(uint32_t PageAddress);

4、Flash上锁

HAL_StatusTypeDef HAL_FLASH_Lock(void)

具体代码:

1、我们先定义一些扇区地址

STM32内部Flash读写_第4张图片

2、 我们这里使用一个联合体来存储参数

STM32内部Flash读写_第5张图片

3、 编写一些Flash操作函数、

STM32内部Flash读写_第6张图片

4、封装我们的实现函数对参数进行一次性Flash操作

STM32内部Flash读写_第7张图片

6、我们来操作一下验证一下我们的函数

STM32内部Flash读写_第8张图片

现象:

STM32内部Flash读写_第9张图片

我们可以看到Flash读写应该是成功了,因为我们使用的是联合体,我们先给一个参数赋值了,然后写入到Flash中,然后再次改变参数的值,然后从Flash中读取刚刚写入的值,我们可以看到,最后参数的值为我们一开始写入到Flash中的值。

 

 

你可能感兴趣的:(STM32)