首页 » 智能 » 运用STM32内部Flash额外的空间来存储数据_数据_擦除

运用STM32内部Flash额外的空间来存储数据_数据_擦除

萌界大人物 2024-11-07 07:51:01 0

扫一扫用手机浏览

文章目录 [+]

STM32 芯片内部的 FLASH 存储器,紧张用于存储我们代码。
如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来,存储一些须要掉电保存的数据。

本文以STM32103ZET6为例。
STM32103ZET6属于大容量产品,其闪存模块组织如下:

运用STM32内部Flash额外的空间来存储数据_数据_擦除 智能

其主存储器大小为512KB,分为256页,每页大小都为2KB。
我们的程序一样平常默认烧写到第0页的起始地址(0x08000000)处。
当BOOT0引脚和BOOT1引脚都接GND时,便是从这个地址开始运行代码的。
这个地址在keil中可以看到:

如果我们要下载的程序大小为4.05KB,则第0、1、2页用于保存我们的程序,我们须要掉电保存的数据只能保存在第3页至第255页这一部分空间内。
我们终极要下载的程序大小可在工程对应的.map文件中看到。
.map文件可以双击工程的Target的名字快速打开,如:

下面对STM32的内部FLASH进行大略的读写测试:

STM32的内部FLASH读写测试

过程图如下(省略非常情形,只考虑成功的情形):

示例代码:

本例的关键代码如下:

(1)进行解锁操作

STM32 的闪存编程是由内嵌的闪存编程/擦除掌握器(FPEC)管理 ,这个模块包含的寄存器如下:

STM32 复位后, FPEC 模块是被保护的, 不能写入 FLASH_CR 寄存器; 通过写入特定的序列到 FLASH_KEYR 寄存器可以打开 FPEC 模块(即写入 KEY1 和KEY2) , 只有在写保护被解除后, 我们才能操作干系寄存器。
固件库中的函数为:

void FLASH_Unlock(void);

(2)擦除将要写的页

STM32 的 FLASH 在编程的时候,也必须哀求其写入地址的 FLASH 是被擦除了的(也便是其值必须是 0XFFFF),否则无法写入,在 FLASH_SR 寄存器的 PGERR 位将得到一个警告。
STM32 的闪存擦除分为两种:页擦除和整片擦除。
也便是其最小擦除单位为1页,只管你只需往某页里写10个字节数据或者更少的数据,你也必须先擦除该页(21024个字节)。
我们这里利用按页擦除,固件库中按页擦除的函数为:

FLASH_Status FLASH_ErasePage(uint32_t Page_Address);

其返回值为列举:

(3)往上一步擦写成功的页写入数据

STM32 闪存的编程每次必须写入16 位。
虽然固件库中有如下三个写操作的函数:

分别为按字(32bit)写入、按半字(16bit)写入、按字节(8bit)写入函数。
32 位字节写入实际上是写入的两次 16 位数据,写完第一次后地址+2,这与我们前面讲解的 STM32 闪存的编程每次必须写入 16 位并不抵牾。
写入 8 位实际也是占用的两个地址了,跟写入 16 位基本上没啥差异。

(4)写入操作完成后进行上锁操作

对FLASH进行写操作完成后要进行上锁操作,对应的固件库中函数为:

void FLASH_Lock(void);

(5)读出数据

固件库中并没有与读操作的函数。
读操作实在便是读取FLASH某个地址的数据。

(6)比拟写入的数据与读出的数据是否相等

末了比拟我们写入的数据与读出的数据是否完备同等,若同等则表明读写测试成功,否则失落败。

程序实行结果:

可见,读出的数据与写入的数据同等,表明读写测试成功。

末了

STM32的内部FLASH读写步骤大致如上,有时候我们还须要封装一些读写函数,但步骤大都如上。
写入数据之前须要前辈行擦除操作。
以上便是本次的条记分享,如有缺点,欢迎指出!

标签:

相关文章