0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HAL_FLASHEx_Erase

分享:

HAL_FLASHEx_Erase 是 STM32 微控制器 HAL 库 (硬件抽象层库) 中的一个函数,专门用于执行 闪存 (FLASH) 的擦除操作

中文解释

  1. 作用: 该函数用于擦除 STM32 内部 FLASH 存储器的指定扇区(Sector)或擦除单元
  2. 功能:
    • 它接收一个指向 FLASH_EraseInitTypeDef 结构体的指针作为参数。这个结构体配置擦除操作的具体要求
      • TypeErase: 指定擦除类型,对于主存储区通常是 FLASH_TYPEERASE_SECTORS (擦除扇区)。
      • Sector: 指定要擦除的起始扇区号。
      • NbSectors: 指定要擦除的连续扇区数量。
      • VoltageRange: 指定设备的工作电压范围 (根据具体芯片型号选择,如 FLASH_VOLTAGE_RANGE_3)。
      • Banks: (仅适用于具有双 Bank 结构的 FLASH) 指定擦除哪个 Bank 中的扇区。
    • 根据提供的配置,函数会执行将所选 FLASH 扇区的数据清除为已擦除状态(通常全部变为 0xFF的操作。
  3. 与标准擦除函数的区别: HAL 库还有一个 HAL_FLASH_Erase 函数。
    • HAL_FLASH_Erase: 用于擦除整个信息块 (Option Bytes) 或执行扇区擦除(但功能相对 HAL_FLASHEx_Erase 受限,一般用于信息块擦除)。
    • HAL_FLASHEx_Erase: 属于扩展函数 (Ex),提供更灵活、更强大的主存储区扇区擦除功能。它是擦除主 FLASH 存储区(即存储你的程序代码或数据的地方)扇区的首选函数。它能够控制擦除的起始扇区、连续扇区数量等。
  4. 关键步骤:
    • 解锁 (Unlock): 在执行擦除操作前,必须调用 HAL_FLASH_Unlock() 解锁 FLASH 控制寄存器。
    • 擦除 (Erase): 调用 HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError)
      • &EraseInitStruct: 传入配置好的擦除参数结构体地址。
      • &SectorError: 传入一个 uint32_t 变量的地址。如果函数返回错误 HAL_ERROR,该变量会被设置为导致错误的扇区号。
    • 等待完成: 函数内部会等待擦除操作完成或发生超时/错误。
    • 上锁 (Lock): 在操作完成后,建议调用 HAL_FLASH_Lock() 重新上锁 FLASH 控制寄存器,防止意外修改。
  5. 返回值: 返回 HAL_StatusTypeDef 值,指示操作状态:
    • HAL_OK: 擦除成功。
    • HAL_ERROR: 擦除失败。检查传入参数或 SectorError 变量获得错误详情。
    • HAL_BUSY: FLASH 控制器正忙(可能前一个操作未完成)。
    • HAL_TIMEOUT: 擦除操作超时。

简单示例代码片段 (示意)

FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t SectorError = 0;

// 步骤 1:解锁 FLASH
if (HAL_FLASH_Unlock() != HAL_OK) {
    // 解锁失败处理
    Error_Handler();
}

// 步骤 2:配置擦除参数
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
EraseInitStruct.Sector = FLASH_SECTOR_6; // 例如擦除第 6 扇区
EraseInitStruct.NbSectors = 1;           // 擦除 1 个扇区
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; // 根据芯片型号选择合适的范围
EraseInitStruct.Banks = FLASH_BANK_1;     // 选择 Bank,假设是单 Bank 或需要指定

// 步骤 3:执行擦除
HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);

// 步骤 4:检查擦除结果
if (status != HAL_OK) {
    if (status == HAL_ERROR) {
        printf("Erase Error on Sector: %lu\n", SectorError);
    }
    // 其他错误处理 (BUSY, TIMEOUT)
    Error_Handler();
}

// 步骤 5:重新上锁 FLASH
if (HAL_FLASH_Lock() != HAL_OK) {
    // 上锁失败处理 (通常不是致命错误,但最好检查)
}

总结

HAL_FLASHEx_Erase 是 STM32 HAL 库中用于精细擦除主 FLASH 存储器特定扇区的核心函数。通过配置结构体指定要擦除的扇区范围,程序可以精确控制哪部分 FLASH 空间被清空,为后续的数据写入(例如保存用户数据、进行固件更新)做准备。使用时务必要遵循解锁-操作-上锁的流程,并仔细检查其返回值。

无法使用HAL驱动程序擦除闪存页面?

(HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORerror) != HAL_OK){/*扇区擦除时出错。用户可以在这里添加一些代码来处理这个错误

HengDu 2023-02-08 08:58:43

stm32L151 cubemx写内部FLASH不正常

= FLASH_TYPEERASE_PAGES;f.PageAddress = Address; f.NbPages = 1; HAL_FLASHEx_Erase(&f, &PageError

yudu78 2019-06-05 13:43:34

flash_erase无法无错误地擦除某些闪存页面怎么解决?

_FLASH_Unlock();HAL_FLASHEx_Erase(&erase_param, &err) //erase_param包含正确的page和bank从 HAL_FLASHEx_Erase(&

双11 2022-12-06 06:39:09

关于STM32G0 flash擦除失败问题求解

FlashEraseInit.Page=Page_Mum;//从哪页开始擦除 FlashEraseInit.NbPages=pagenum; if(HAL_FLASHEx_Erase( FlashEraseInit

a732538 2023-09-20 07:06:44

使用删除闪存页面,为什么设置了error = FLASH->SR并阻止擦除闪存?

在我的代码中,我尝试使用删除闪存页面if(HAL_FLASHEx_Erase(&FlashErase,&PageError) != HAL_OK)但总是得到一个 HAL

60user157 2023-01-29 08:49:11

STM32F429与擦除扇区时间如何减少?

);if(HAL_FLASHEx_Erase(&EraseStruct, &SectorError) != HAL_OK) {..}闪存写入时间写入闪存(+ 从文件读取时间)大约需要 20 秒

bairunwanda168 2023-01-31 06:28:24

STM32L072如何擦除从开始位置到结束的所有页面?

= FLASH_TYPEERASE_PAGES;uint32_t pagE;HAL_FLASH_Unlock();//HAL_FLASHEx_Erase(&borrat, &pagE

YYXIAO 2022-12-09 08:04:56

如何使用STM32 FLASH存储器?

_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR);HAL_FLASHEx_Erase

北冥有熊 2023-01-12 07:47:33

将STM32 Flash数据写入内存之前要擦除多少个扇区

and ICRST bits in the FLASH_CR register. */ if (HAL_FLASHEx_Erase(&EraseInitStruct, &

hdfsf 2022-12-23 07:53:31

关于微型STM32F746ZGT7上的闪存编程和闪存擦除问题求解

_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)&_app_validity, 0);HAL_FLASH_Lock();HAL_FLASH_Unlock();res = HAL_FLASHEx_Erase(&

Oo一笑 2022-12-29 11:30:34

STM32F429闪存擦除不​​适用于特定扇区要如何处理?

= FLASH_SECTOR_3; /* Perform Erase Sector */ do {flashStatus = HAL_FLASHEx_Erase(&EraseInitStruct, &

kevinvind 2023-01-31 07:41:23

使用SRAM1_BASE地址跳转到bootloader写入复位类型报错怎么解决?

_FLASH_Unlock();HAL_FLASHEx_Erase(&p_erase_init, &page_error);HAL_FLASH_Lock();return;}当我使用 STM32_Programmer 手动删除页面时,我没有看到任何错误。STM32_Programmer.sh -c port=swd -e [7 25]

牛牛爱吃草 2023-01-12 06:44:39

请问为什么FLASH所有位都为1就不能烧写FLASH?

= GetPage(startAddr);EraseInitStruct.NbPages = 1;status = HAL_FLASHEx_Erase(&EraseInitStruct, &

wjwierw 2023-01-16 06:00:25

将数据写入闪存时一直没有回读任何内容怎么解决?

);EraseInitStruct.Page= GetPage(start_address);EraseInitStruct.NbPages= num_pages;if (HAL_FLASHEx_Erase(&

c1441424 2023-01-06 06:03:17

【小熊派IoT开发板开发板试用连载】--flash读写操作

写入数据的流程是:①.解锁Flash:调用HAL_FLASH_Unlock(void)函数②.擦除Flash:调用HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef

yinwuqing 2020-05-02 19:20:46

「正点原子STM32Mini板资料连载」第三十一章 FLASH 模拟 实验

。和编程函数一样,HAL 提供了一个通用的基于小区擦除的函数 HAL_FLASHEx_Erase,该函数声明如下:HAL_StatusTypeDef HAL_FLASHEx_Erase

正点原子运营官 2020-04-13 10:38:49

「ALIENTEK 阿波罗 STM32F767 开发板资料连载」第四十二章 FLASH 模拟 EEPROM 实验

一个通用的基于小区擦除的函数 HAL_FLASHEx_Erase,该函数声明如下:HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef

正点原子运营官 2020-05-20 14:47:02

「正点原子NANO STM32开发板资料连载」第29章 FLASH 模拟实验

stm32f4xx_hal_flash_ex.c 中定义。和编程函数一样,HAL 提供了一个通用的基于小区擦除的函数 HAL_FLASHEx_Erase,该函数声明如下:HAL

正点原子运营官 2020-04-23 15:04:14

「ALIENTEK 探索者 STM32F407 开发板资料连载」第三十九章 FLASH 模拟 EEPROM 实验

HAL 库提供的擦除函数在 stm32f4xx_hal_flash_ex.c 中定义。和编程函数一样,HAL 提供了一个通用的基于小区擦除的函数 HAL_FLASHEx_Erase,该函数声明如下

正点原子运营官 2020-06-12 15:20:30

「正点原子NANO STM32F103开发板资料连载」第二十八章 FLASH 模拟 EEPROM 实验

数声明如下:HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit,uint32_t *PageError);该

正点原子运营官 2020-05-06 15:26:10

RT-thread通用BootLoader自制的方法介绍

; My_Flash.VoltageRange=VoltageRange; return HAL_FLASHEx_Erase(&My_Flash, &PageError);//调用擦除函数擦除}void

hisysteeoke 2022-05-05 15:40:37

在LoRa Application中使用EEPROM功能,链接器无法导入HAL函数怎么解决?

,但链接器无法导入 HAL 函数。的.\mlm32l07x01\Lora.axf:错误:L6218E:未定义符号 HAL_FLASHEx_DATAEEPROM_Erase(从 eeprom.o 引用

王小琳子 2023-01-13 06:49:51

擦除STM32F207内部闪存的特定扇区总是奔溃怎么解决?

; eraseInitStruct.NbSectors = 1; status = HAL_FLASHEx_Erase_IT(&eraseInitStruct); if (status != HAL_OK) {print("

naugia 2023-01-16 06:46:39

STM32固件解密步骤

_FLASH_PREFETCH_BUFFER_DISABLE(); HAL_FLASHEx_OBGetConfig(OBInit); if(OBInit.RDPLevel != OB_RDP_LEVEL_0) { OBInit.OptionType = OPTIONBYTE_RDP

2021-07-23 09:48:14

STM32H7选项字节编程导致HAL_OK的原因?如何解决?

设置为低。FLASH_OBProgramInitTypeDef OBInit;HAL_FLASHEx_OBGetConfig(&OBInit);log_info("Usertype

h1654155275.6372 2023-01-31 09:00:04

BSP_OSPI_NOR_Erase_Block() 失败怎么解决?

。但是 BSP_OSPI_NOR_Erase_Block() 返回错误。C调用的是MX25LM51245G_BlockErase()然后 HAL_OSPI_Command()然后 status

zhouxk 2022-12-02 07:20:03

使用HAL接口在STM32F4上启用闪存回读保护(级别 1)时出现问题怎么解决?

};HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);if (OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0

dahairenlyy 2022-12-26 06:38:00

STM32G4 如何把BOOT0当作通用GPIO使用---软件设置

_Init();/* USER CODE BEGIN Init */HAL_FLASH_Unlock();HAL_FLASH_OB_Unlock();HAL_FLASHEx_OBGetConfig(&OBInit

Tom121 2021-06-11 17:36:14

如何快速入门HAL库编程 HAL库与裸机编程的比较

如何快速入门HAL库编程 要快速入门HAL库编程,可以遵循以下步骤: 了解基础知识 : 掌握C语言编程基础,包括变量、数据类型、函数、指针等。 了解嵌入式系统的基本概念,如微控制器、中断、外设等

2024-12-02 11:39:56

关于使用STM32H7在用户代码内增加开启读保护代码的问题

Flash_DisableReadProtection(void) { FLASH_OBProgramInitTypeDef OBInit; HAL_FLASHEx

ccly0208 2023-08-07 06:31:56

加载更多
相关标签