STM32读写内部Flash

本文介绍了在STM32F407ZGT6芯片开发中,如何利用其1M的内部Flash进行数据存储。由于外部没有拓展EEPROM,作者详细探讨了STM32F4内部Flash的特性,包括地址、擦除操作和Sector划分。通过定义Flash的页起始地址,可以避免对代码所在的前几个Sector进行读写。操作Flash需要先解锁,然后清除状态寄存器,最后写入数据并上锁。文中提供了具体的解锁、写入和锁定的库函数使用示例。
摘要由CSDN通过智能技术生成

工作中使用STM32F407ZGT6这块芯片开发项目,内部Flash有1M之多,出于数据存储需要,而外部没有拓展EEPROM,就想着将数据存入Flash中。因此研究了一下STM32F4读写内部Flash的一些操作。

以下是关于Flash介绍,部分来自互联网:
【STM32F4 内部Flash的一些信息】

STM32F407ZGTx的内部Flash的地址是:0x08000000,大小是0x00100000。

写Flash的时候,如果发现写入地址的Flash没有被擦出,数据将不会写入。Flash的擦除操作,只能按Sector进行。不能单独擦除一个地址上的数据。因此在写数据之前需要将地址所在Sector的所有数据擦除。

在STM32F4的编程手册上可找到Flash的Sector划分,我们现在只操作Main memory:

这里写图片描述

参考Demo中的例子,将Flash的页的起始地址(基地址)可定义如下:

/* Base address of the Flash sectors */
 #define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Sector 0, 16 Kbytes */
 #define ADDR_FLASH_SECTOR_1     ((uint32_t)0x08004000) /* Sector 1, 16 Kbytes */
 #define ADDR_FLASH_SECTOR_2     ((uint32_t)0x08008000) /* Sector 2, 16 Kbytes */
 #define ADDR_FLASH_SECTOR_3     ((uint32_t)0x0800C000) /* Sector 3, 16 Kbytes */
 #define ADDR_FLASH_SECTOR_4     ((uint32_t)0x08010000) /* Sector 4, 64 Kbytes */
 #define ADDR_FLASH_SECTOR_5     ((uint32_t)0x08020000) /* Sector 5, 128 Kbytes */
 #define ADDR_FLASH_SECTOR_6     ((uint32_t)0x08040000) /* Sector 6, 128 Kbytes */
 #define ADDR_FLASH_SECTOR_7     ((uint32_t)0x08060000) /* Sector 7, 128 Kbytes */
 #define ADDR_FLASH_SECTOR_8     ((uint32_t)0x08080000) /* Sector 8, 128 Kbytes */
 #define ADDR_FLASH_SECTOR_9     ((uint32_t)0x080A0000) /* Sector 9, 128 Kbytes */
 #define ADDR_FLASH_SECTOR_10    ((uint32_t)0x080C0000) /* Sector 10, 128 Kbytes */
 #define ADDR_FLASH_SECTOR_11    ((uint32_t)0x080E0000) /* Sector 11, 128 Kbytes */

实际使用中,由于代码是存在Flash前几个Sector中的,那么自己定义的数据最好存在Flash后几个Sector中,尽量避免对前几个Sector的读写。

有了这些定义之后,我们就可以开始操作Flash了。注意:对Flash的操作不需要Configuration,不像操作其他STM外设,需要先进行相关参数的配置。

首先,要向Flash写入数据需要先将Flash解锁。根据手册定义,解锁Flash需要先向寄存器FLASH_KEYR写入0x45670123之后再向这个寄存器写入0xCDEF89AB。这两个数据在库中已经定义成了:FLASH_KEY1和FLASH_KEY2.

使用库函数时不用这么麻烦,函数FLASH_Unlock()即可完成对Flash的解锁。解锁flash之后,使用函数FLASH_ClearFlag清除Flash的状态寄存器。然后就可以对Flash进行写操作了。数据写入完成以后,需要重新上锁,使用函数FLASH_Lock()。

以下是操作Flash的实际代码(由于实际需要,读写的为double类型数据):

#ifndef _FLASHRW_H
#define _FLASHRW_H
#include "stm32f4xx.h"

#define STORAGE_MAXI    2
#define STORAGE_MAXJ    25
#define STORAGE_SIZE    4       //数据按32位存储,故SIZE为4
#define FLASH_USER_END_ADDR     ((uint32_t)0x080FFFFF) /* End of Flash*/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值