登录/注册

如何使用flash存储器?如何写入数据?

任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。

更多

使用 Flash 存储器(闪存)需要了解其特性和操作步骤,以下是详细指南:


一、Flash 存储器的特性

  1. 先擦后写:写入前必须擦除目标区域(擦除后所有位为 1),写入操作将 1 改为 0
  2. 块操作
    • 擦除以 扇区(Sector)页(Page) 为单位(如 4KB、64KB)。
    • 写入以 字(Word)半字(Half-Word) 为单位(如 4字节)。
  3. 寿命限制:约 10万次擦写(具体查看芯片手册)。
  4. 安全保护
    • 写操作前需解锁。
    • 禁止写入代码执行区域。

二、操作步骤(以嵌入式STM32为例)

1. 初始化与解锁

#include "stm32f4xx_hal.h"

void Flash_Init(void) {
  HAL_FLASH_Unlock();  // 解锁Flash控制寄存器
}

2. 擦除扇区

#include "stm32f4xx_hal_flash.h"

uint32_t SectorError = 0;
FLASH_EraseInitTypeDef EraseConfig;

// 配置擦除参数(以STM32F4的Sector 5为例)
EraseConfig.TypeErase = FLASH_TYPEERASE_SECTORS;
EraseConfig.Sector = FLASH_SECTOR_5;       // 选择扇区
EraseConfig.NbSectors = 1;                 // 擦除1个扇区
EraseConfig.VoltageRange = FLASH_VOLTAGE_RANGE_3; // 电压范围

// 执行擦除
if (HAL_FLASHEx_Erase(&EraseConfig, &SectorError) != HAL_OK) {
  // 错误处理(如SectorError包含失败扇区号)
}

3. 写入数据

#define FLASH_TARGET_ADDR 0x08020000  // Flash目标地址(例如Sector 5起始地址)

uint32_t data[] = {0x12345678, 0x87654321}; // 待写入数据(32位字)

// 逐个字写入
for (int i = 0; i < sizeof(data)/4; i++) {
  if (HAL_FLASH_Program(
        FLASH_TYPEPROGRAM_WORD,      // 按字(32位)写入
        FLASH_TARGET_ADDR + i*4,     // 目标地址
        data[i]) != HAL_OK) {
    // 写入失败处理
    break;
  }
}

4. 锁定Flash

HAL_FLASH_Lock();  // 重新上锁,防止误操作

5. 读取验证

uint32_t *read_addr = (uint32_t*)FLASH_TARGET_ADDR;
printf("Data: 0x%08X\n", *read_addr); // 输出0x12345678

三、关键注意事项

  1. 地址对齐
    • 写入地址必须是 4字节对齐(32位机)。
    • 擦除地址必须对应扇区起始地址。
  2. 中断与超时
    • 擦写期间禁止中断(或确保代码在RAM中运行)。
    • 添加超时检测(如STM32的 HAL_FLASH_WaitForLastOperation())。
  3. 数据保护
    • 避免频繁擦写,可通过 磨损均衡算法 分散写入区域。
    • 重要数据建议 冗余存储(如写入两份)。
  4. 连接外部Flash(如SPI Flash):
    • 使用厂商提供的指令集(如 Winbond W25Q)。
    • 通过SPI发送 0x02(页编程)和 0x20(扇区擦除)命令。

四、常用工具


五、典型场景代码(SPI Flash示例)

// W25Q128JV SPI Flash操作示例
void SPI_Flash_Write(uint32_t addr, uint8_t *data, uint16_t len) {
  SPI_CS_Low();                         // 片选使能
  SPI_SendByte(0x06);                   // 发送写使能命令(0x06)
  SPI_CS_High();

  SPI_CS_Low();
  SPI_SendByte(0x02);                   // 页编程命令(0x02)
  SPI_SendByte((addr >> 16) & 0xFF);    // 发送24位地址
  SPI_SendByte((addr >> 8) & 0xFF);
  SPI_SendByte(addr & 0xFF);

  for (int i = 0; i < len; i++) {
    SPI_SendByte(data[i]);              // 写入数据
  }
  SPI_CS_High();
}

总结:操作Flash需严格遵循先擦除后写入原则,注意地址对齐寿命管理。不同厂家的Flash操作细节可能不同,务必查阅对应的数据手册(Datasheet)参考手册(Reference Manual)

浅谈flash存储器的特点和优缺点

Flash存储器的写操作具有特殊性,它只能将数据位从1写成0,而不能从0写成1。因此,在对

2024-02-19 11:37:28

stm32 flash数据怎么存储

,包括其结构、特点以及如何写入数据。 一、STM32 Flash的结构 STM32 F

2024-01-31 15:46:03

Flash存储器的工作原理和基本结构

  Flash存储器是一种非易失性存储器,即使在供电电源关闭后仍能保持片内信息。

2023-09-09 16:22:28

【转】PIC单片机的 程序存储器数据存储器,EEPROM区别

PIC的程序存储器是FLASH存储器,主要存储程序代码,掉电不丢失。

资料下载 张国厚 2021-11-16 13:06:01

如何写入tinyAVR系列器件中的闪存和EEPROM

在 tinyAVR® 1 系列器件上,与之前的 tinyAVR 器件相比,对闪存存储器和 EEPROM 的访问方式有所改变。这意味着,必须修改用于在旧款器件上写入闪存和 EEPROM 的现有代码

资料下载 姚小熊27 2021-04-01 09:14:51

存储器阵列间接访问的机制

MMC设备是一种受管理的存储器,它定义了一种对存储器阵列间接访问的机制。这种间接访问通常是由分立的控制器使能的。简介存储器访问的优点是,

资料下载 姚小熊27 2021-03-26 14:43:27

Flash存储器在MCS-51系统中的应用

介绍了 Flash 存储器的特性和应用场合 ,在16 位地址总线中扩展大容量存储的一般方法。讨论了 MCS-51 系列单片机与

资料下载 姚小熊27 2021-03-18 09:50:04

单片机存储器的工作原理和结构与半导体存储器的分类说明

1、存储器构造存储器就是用来存放数据的地方。它是利用电平的高低来存放数据

资料下载 佚名 2019-09-27 17:15:00

如何降低写入放大系数对存储器的影响

TBW(Total Bytes Written)是衡量闪存存储器寿命和耐用性的重要指标。但由于写入放大的影响,实际TBW值可能会偏离理论值。本文将介绍TBW的概念以及

2023-07-25 14:19:39

单板硬件设计:存储器( NAND FLASH)

EEPROM的变种,变成了一类存储器的统称。 狭义的EEPROM: 这种rom的特点是可以随机访问和修改任何一个字节,可以往每个bit中写入0或者1。这是最传统的一种EEPROM,掉电后

2023-05-19 15:59:37

非易失性存储器Flash和EEPROM之间的差异与优缺点

和用于读取,写入和擦除数据的操作略有不同。而EEPROM指的是电可擦可编程只读存储器是一种

2023-04-07 16:42:42

如何使用STM32 FLASH存储器

我正在学习如何在微控制器断电后使用 STM32L431CC FLASH 存储器存储

2023-01-12 07:47:33

Bootloader如何写入Flash

1. Bootloader如何写入Flash ?初学者一般都会遇到如何将程序写入处理器

2021-12-22 07:32:32

FLASH存储器数据读写代码详解

FLASH存储器数据读写代码详解

¥100.00
梦翼师兄

Flash存储器的使用寿命有什么办法延长吗?

嵌入式系统的海量存储器多采用Flash存储器实现扩展,由于Flash

2019-08-16 07:06:12
7天热门专题 换一换
相关标签