你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L476 HAL_FLASHEx_Erase() 问题

[复制链接]
yzfy123456 提问时间:2020-9-18 18:21 /
        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();
}

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


收藏 评论5 发布时间:2020-9-18 18:21

举报

5个回答
radio2radio 回答时间: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

yzfy123456 回答时间:2020-9-21 16:42:29
我用的是STM32L476RCT6, 调用的擦除函数是“HAL_FLASHEx_Erase()” ,里面只能擦除 FLASH_TYPEERASE_PAGES,和 FLASH_TYPEERASE_MASSERASE; 不能擦除 FLASH_TYPEERASE_SECTORS

有哪位用过这个函数吗?是不是有什么特殊要求,比如中断之类的要关闭或打开??指点一下,谢谢
yzfy123456 回答时间:2020-9-22 11:46:06
我的 HAL_FLASHEx_Erase() 代码是采用 CubeMX 5.6.1 自动生成的, 然后支调用。哪位大侠帮忙解决一下,非常感谢
yzfy123456 回答时间:2020-9-22 16:36:41
刚换开发板试了一下,一样的固件,竟然可以。开发板的MCU型号是:STM32L476RGT6
yzfy123456 回答时间:2020-9-22 16:37:03
难道是我买的芯片有问题?

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版