搜索
查看: 1877|回复: 5

[讨论] STM32L476 HAL_FLASHEx_Erase() 问题

[复制链接]

该用户从未签到

11

主题

29

帖子

2

蝴蝶豆

中级会员

最后登录
2020-9-22
发表于 2020-9-18 18:21:27 | 显示全部楼层 |阅读模式
        MCU型号: STM32L476RCT6
        大家有用过 HAL_FLASHEx_Erase() 这个函数吗? 我根据官方例程写的代码,读写都能成功,但是擦除失败。        调用擦除函数 HAL_FLASHEx_Erase(),返回 0 = 擦除成功,但是擦除后返回去读,却发现并没有真正的被擦掉,不是0xFF。
       下面是我的代码,各位大侠指点一下,非常感谢!

void Erase_MCU_Flash(uint32_t p_number)
{
    uint8_t state;
    uint32_t addr;

    p_number = 96;
    addr = FLASH_BASE + FLASH_PAGE_SIZE * p_number;

    HAL_FLASH_Unlock();
       
    // Clear OPTVERR bit set on virgin samples
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);

    BankNumber = GetBank(addr);                                        // Get the bank
    EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.Banks       = BankNumber;
    //EraseInitStruct.Banks       = FLASH_BANK_1;
    EraseInitStruct.Page        = p_number;
    EraseInitStruct.NbPages     = 1;       
    //if(HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)                // 这里默认擦除成功
    //{                ;                }
    state =         HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError);    // 测得这里返回0
       
    HAL_FLASH_Lock();
}

是不是擦除过程中,要关闭总中断之类的??如果是的话,要怎么关?


回复

使用道具 举报

该用户从未签到

20

主题

621

帖子

152

蝴蝶豆

论坛元老

最后登录
2023-11-13
发表于 2020-9-18 21:40:02 | 显示全部楼层
我用过的是这样的,
  1. int FLASH_Erase(const uint32_t start_addr, const uint32_t end_addr)
  2. {
  3.         uint32_t FirstSector = 0, NbOfSectors = 0;
  4.         uint32_t SECTORError = 0;
  5.         HAL_StatusTypeDef status = HAL_ERROR;
  6.         FLASH_EraseInitTypeDef EraseInitStruct;
  7.           /* Get the 1st sector to erase */
  8.           FirstSector = FlashSectorNo(start_addr);//GetSector(start_addr);
  9.           /* Get the number of sector to erase from 1st sector*/
  10.           NbOfSectors = FlashSectorNo(end_addr) - FirstSector + 1;;//GetSector(end_addr) - FirstSector + 1;
  11.           /* Fill EraseInit structure*/
  12.           EraseInitStruct.TypeErase     = FLASH_TYPEERASE_SECTORS;
  13.           EraseInitStruct.VoltageRange  = FLASH_VOLTAGE_RANGE_3;
  14.           EraseInitStruct.Sector        = FirstSector;
  15.           EraseInitStruct.NbSectors     = NbOfSectors;
  16.   
  17.           HAL_FLASH_Unlock();
  18.           status = HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError);
  19.                 HAL_FLASH_Lock();
  20.   
  21.           if(HAL_OK==status) return 0;
  22.           return -1;
  23. }
复制代码
完整的flash.c文件,在下面帖子附件里面:https://www.stmcu.org.cn/module/forum/thread-625998-1-1.html

回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

29

帖子

2

蝴蝶豆

中级会员

最后登录
2020-9-22
 楼主| 发表于 2020-9-21 16:42:29 | 显示全部楼层
我用的是STM32L476RCT6, 调用的擦除函数是“HAL_FLASHEx_Erase()” ,里面只能擦除 FLASH_TYPEERASE_PAGES,和 FLASH_TYPEERASE_MASSERASE; 不能擦除 FLASH_TYPEERASE_SECTORS

有哪位用过这个函数吗?是不是有什么特殊要求,比如中断之类的要关闭或打开??指点一下,谢谢
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

29

帖子

2

蝴蝶豆

中级会员

最后登录
2020-9-22
 楼主| 发表于 2020-9-22 11:46:06 | 显示全部楼层
我的 HAL_FLASHEx_Erase() 代码是采用 CubeMX 5.6.1 自动生成的, 然后支调用。哪位大侠帮忙解决一下,非常感谢
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

29

帖子

2

蝴蝶豆

中级会员

最后登录
2020-9-22
 楼主| 发表于 2020-9-22 16:36:41 | 显示全部楼层
刚换开发板试了一下,一样的固件,竟然可以。开发板的MCU型号是:STM32L476RGT6
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

29

帖子

2

蝴蝶豆

中级会员

最后登录
2020-9-22
 楼主| 发表于 2020-9-22 16:37:03 | 显示全部楼层
难道是我买的芯片有问题?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-20 16:37 , Processed in 0.171730 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表