如何使用flash存储器?如何写入数据?
任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。
使用 Flash 存储器(闪存)需要了解其特性和操作步骤,以下是详细指南:
一、Flash 存储器的特性
- 先擦后写:写入前必须擦除目标区域(擦除后所有位为
1),写入操作将1改为0。 - 块操作:
- 擦除以 扇区(Sector) 或 页(Page) 为单位(如 4KB、64KB)。
- 写入以 字(Word) 或 半字(Half-Word) 为单位(如 4字节)。
- 寿命限制:约 10万次擦写(具体查看芯片手册)。
- 安全保护:
- 写操作前需解锁。
- 禁止写入代码执行区域。
二、操作步骤(以嵌入式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
三、关键注意事项
- 地址对齐:
- 写入地址必须是 4字节对齐(32位机)。
- 擦除地址必须对应扇区起始地址。
- 中断与超时:
- 擦写期间禁止中断(或确保代码在RAM中运行)。
- 添加超时检测(如STM32的
HAL_FLASH_WaitForLastOperation())。
- 数据保护:
- 避免频繁擦写,可通过 磨损均衡算法 分散写入区域。
- 重要数据建议 冗余存储(如写入两份)。
- 连接外部Flash(如SPI Flash):
- 使用厂商提供的指令集(如 Winbond W25Q)。
- 通过SPI发送
0x02(页编程)和0x20(扇区擦除)命令。
四、常用工具
- STM32CubeProgrammer:官方烧录工具,支持擦写和校验。
- J-Flash:通过J-Link调试器操作Flash。
- 逻辑分析仪:调试SPI Flash通信时序。
五、典型场景代码(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)。
如何写入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
如何降低写入放大系数对存储器的影响
TBW(Total Bytes Written)是衡量闪存存储器寿命和耐用性的重要指标。但由于写入放大的影响,实际TBW值可能会偏离理论值。本文将介绍TBW的概念以及
2023-07-25 14:19:39
单板硬件设计:存储器( NAND FLASH)
EEPROM的变种,变成了一类存储器的统称。 狭义的EEPROM: 这种rom的特点是可以随机访问和修改任何一个字节,可以往每个bit中写入0或者1。这是最传统的一种EEPROM,掉电后
FLASH存储器数据读写代码详解
FLASH存储器数据读写代码详解
¥100.00
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 芯片的工作原理是什么?
- ssd是什么意思
- 什么是蓝牙?它的主要作用是什么?
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- dtmb信号覆盖城市查询
- 怎样挑选路由器?
- 华为芯片为什么受制于美国?
- 元宇宙概念股龙头一览
- type-c四根线接法图解
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- BLDC电机技术分析
- 复位电路的原理及作用
- dsp是什么意思?有什么作用?
- iphone13promax电池容量是多少毫安
- 苹果无线充电器怎么使用?
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 传感器常见类型有哪些?
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机