FLASH ERASE:CHIP、BLOCK、SECTOR

本文深入探讨了SPI FLASH的擦除技术,包括CHIP、BLOCK、SECTOR三个层面的详细解释。阐述了擦除操作的时间消耗、不同区域的擦除速度及其对程序的影响,并介绍了如何通过寄存器进行参数传递。

FLASH ERASE:CHIP、BLOCK、SECTOR 

           SPI FLASH 的ERASE、READ、WRITE,笔者都用ESL在博文中论述过。ERASE包括CHIP、BLOCK、SECTOR三方面的内容;READ可对指定地址的单个及连续读取数

据;WRITE也有单个及连续写入数据。相关内容可翻阅之前的博文,笔者要强调一下的是现阶段再次接触到的ERASE的内容,随时随地的记录: CHIP:整片FLASH ERASE,视

容量大小占耗时间,是最长的ERASE时间。 BLOCK:大部分的FLASH都以64K为单位空间ERASE,具体可有针对地参考资料查证,特别是FLASH的TOP或BOTTOM容易有差

别。每个BLOCK的ERASE时间较快。 SECTOR:比BLOCK更小的单位,ERASE时间最快。 这三方面的ERASE都带两个参数HIGH ADDRESS及LOW ADDRESS,或可通过寄

存器R0-R7来传递。使用时,可根据利用到的FLASH空间及ERASE时间长短对程序的影响来作出适当的选择。

/* * module_extend_flash.h * * Created on: Feb 23, 2025 * Author: XWM */ #ifndef MODULE_MODULE__EXTEND_FLASH_MODULE_FLASH_EXTEND_H_ #define MODULE_MODULE__EXTEND_FLASH_MODULE_FLASH_EXTEND_H_ #include "main.h" #include <stdint.h> #include <stdbool.h> /* 外部Flash模块编译开关(0=禁用,1=启用) */ #define EXTEND_FLASH_SWITCH (1) /* 外部Flash模块编译开关 */ #if EXTEND_FLASH_SWITCH /* W25X系列/Q系列芯片列表 */ #define W25Q80 (0XEF13) #define W25Q16 (0XEF14) #define W25Q32 (0XEF15) #define W25Q64 (0XEF16) #define W25Q128 (0XEF17) #define W25Q256 (0XEF18) #define NM25Q80 (0X5213) #define NM25Q16 (0X5214) #define NM25Q32 (0X5215) #define NM25Q64 (0X5216) #define NM25Q128 (0X5217) #define NM25Q256 (0X5218) /* 使能器件 */ #define W25QXX_CS_ENABLE() HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_RESET); /* 取消片选 */ #define W25QXX_CS_DISABLE() HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_SET); /* 指令 */ #define W25X_WRITE_ENABLE (0x06) #define W25X_WRITE_DISABLE (0x04) #define W25X_READ_STATUS_REG1 (0x05) #define W25X_READ_STATUS_REG2 (0x35) #define W25X_READ_STATUS_REG3 (0x15) #define W25X_WRITE_STATUS_REG1 (0x01) #define W25X_WRITE_STSTUS_REG2 (0x31) #define W25X_WRITE_STSTUS_REG3 (0x11) #define W25X_READ_DATA (0x03) #define W25X_FAST_READ_DATA (0x0B) #define W25X_FAST_READ_DUAL (0x3B) #define W25X_PAGE_PROGRAM (0x02) #define W25X_BLOCK_ERASE (0xD8) #define W25X_SECTOR_ERASE (0x20) #define W25X_CHIP_ERASE (0xC7) #define W25X_POWER_DOWN (0xB9) #define W25X_RELEASE_POWER_DOWN (0xAB) #define W25X_DEVICE_ID (0xAB) #define W25X_MANUFACT_DEVICE_ID (0x90) #define W25X_JEDEC_DEVICE_ID (0x9F) #define W25X_ENABLE_4BYTE_ADDR (0xB7) #define W25X_EXIT_4Byte_ADDR (0xE9) /* 存储sector分配 */ #define FLASH_SVAE_SECTOR0 (0x0000000)// 4K 账号密码 #define FLASH_SVAE_SECTOR1 (0x0001000)// 4K 时计划任务 #define FLASH_SVAE_SECTOR2 (0x0002000)// 4K 机器参数 #define FLASH_SVAE_SECTOR3 (0x0003000)// 4K 计划任务 #define FLASH_SVAE_SECTOR4 (0x0004000)// 4K RTK #define FLASH_SVAE_SECTOR5 (0x0005000)// 4K NET #define FLASH_SVAE_SECTOR6 (0x0006000)// 4K RADIO #define FLASH_SVAE_SECTOR7 (0x0007000)// 4K BLE #define FLASH_SVAE_SECTOR8 (0x0008000)// 4K 是否从升级中启动 #define FLASH_SVAE_SECTOR9 (0x0009000)// 4K 机器地图 #define FLASH_SVAE_SECTOR10 (0x000A000)// 4K 区域地图0 #define FLASH_SVAE_SECTOR11 (0x000B000)// 4K 区域地图0 #define FLASH_SVAE_SECTOR12 (0x000C000)// 4K 区域地图0 #define FLASH_SVAE_SECTOR13 (0x000D000)// 4K 区域地图0 #define FLASH_SVAE_SECTOR14 (0x000E000)// 4K 区域地图0 #define FLASH_SVAE_SECTOR15 (0x000F000)// 4K 区域地图0 /* 存储block分配 */ #define FLASH_SAVE_BLOCK1 (0x0010000)// 64k 区域0 #define FLASH_SAVE_BLOCK2 (0x0020000)// 64K 区域1 #define FLASH_SAVE_BLOCK3 (0x0030000)// 64K 区域2 #define FLASH_SAVE_BLOCK4 (0x0040000)// 64K 区域3 #define FLASH_SAVE_BLOCK5 (0x0050000)// 64K 区域4 #define FLASH_SAVE_BLOCK6 (0x0060000)// 64K 区域5 #define FLASH_SAVE_BLOCK7 (0x0070000)// 64K 区域6 #define FLASH_SAVE_BLOCK8 (0x0080000)// 64K 区域7 #define FLASH_SAVE_BLOCK9 (0x0090000)// 64K 区域8 #define FLASH_SAVE_BLOCK10 (0x00A0000)// 64K 区域9 #define FLASH_SVAE_SECTOR256 (0x0100000)// 4K FACTORY 大小 #define FLASH_SVAE_SECTOR257 (0x0101000)// 4K FACTOEY 固件 SECTOR257 - ECTOR511 #define FLASH_SVAE_SECTOR512 (0x0200000)// 4K DOWNLOAD 大小 #define FLASH_SVAE_SECTOR513 (0x0201000)// 4K DOWNLOAD 固件 SECTOR513 - SECTOR4096 /* * 函数名 :extend_flash_init * 功能 :外部闪存初始化 * 参数 :无 * 返回值 :无 * 备注 :无 */ void extend_flash_init(void); /* * 函数名 :w25qxx_init * 功能 :W25QXX初始化 * 参数 :无 * 返回值 :无 * 备注 :无 */ void w25qxx_init(void); /* * 函数名 :w25qxx_write * 功能 :写SPI FLASH 在指定地址开始写入指定长度的数据 * 参数 :buffer要写入的数据 * :addr写入FLASH的地址 * :size要写入的字节数(最大65535) * 返回值 :无 * 备注 :该函数带擦除操作! */ void w25qxx_write(uint8_t* buffer, uint32_t addr, uint16_t size); /* * 函数名 :W25QXX_Read * 功能 :读取SPI FLASH 在指定地址开始读取指定长度的数据 * 参数 :pBuffer数据存储区 ReadAddr开始读取的地址(24bit) NumByteToRead要读取的字节数(最大65535) * 返回值 :无 * 备注 :无 */ void w25qxx_read(uint8_t* buffer, uint32_t addr, uint16_t size); /* * 函数名 :w25qxx_read_id * 功能 :读取芯片ID * 参数 :无 * 返回值 :如下 * :0XEF13,表示芯片型号为W25Q80 * :0XEF14,表示芯片型号为W25Q16 * :0XEF15,表示芯片型号为W25Q32 * :0XEF16,表示芯片型号为W25Q64 * :0XEF17,表示芯片型号为W25Q128 * :0XEF18,表示芯片型号为W25Q256 * 备注 :无 */ uint16_t w25qxx_read_id(void); /* * 函数名 :w25qxx_erase_chip * 功能 :擦除整个芯片 * 参数 :无 * 返回值 :无 * 备注 :等待时间超长... */ void w25qxx_erase_chip(void); /* * 函数名 :w25qxx_erase_sector * 功能 :擦除一个扇区 * 参数 :addr扇区地址(根据实际容量设置) * 返回值 :无 * 备注 :擦除一个扇区的最少时间150ms */ void w25qxx_erase_sector(uint32_t addr); #endif #endif /* MODULE_MODULE__EXTEND_FLASH_MODULE_FLASH_EXTEND_H_ */ 给上述添加注释
最新发布
08-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值