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(); } 是不是擦除过程中,要关闭总中断之类的??如果是的话,要怎么关? |
我用过的是这样的, int FLASH_Erase(const uint32_t start_addr, const uint32_t end_addr) { uint32_t FirstSector = 0, NbOfSectors = 0; uint32_t SECTORError = 0; HAL_StatusTypeDef status = HAL_ERROR; FLASH_EraseInitTypeDef EraseInitStruct; /* Get the 1st sector to erase */ FirstSector = FlashSectorNo(start_addr);//GetSector(start_addr); /* Get the number of sector to erase from 1st sector*/ NbOfSectors = FlashSectorNo(end_addr) - FirstSector + 1;;//GetSector(end_addr) - FirstSector + 1; /* Fill EraseInit structure*/ EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; EraseInitStruct.Sector = FirstSector; EraseInitStruct.NbSectors = NbOfSectors; HAL_FLASH_Unlock(); status = HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError); HAL_FLASH_Lock(); if(HAL_OK==status) return 0; return -1; }复制代码 完整的flash.c文件,在下面帖子附件里面:https://www.stmcu.org.cn/module/forum/thread-625998-1-1.html
我用的是STM32L476RCT6, 调用的擦除函数是“HAL_FLASHEx_Erase()” ,里面只能擦除 FLASH_TYPEERASE_PAGES,和 FLASH_TYPEERASE_MASSERASE; 不能擦除 FLASH_TYPEERASE_SECTORS 有哪位用过这个函数吗?是不是有什么特殊要求,比如中断之类的要关闭或打开??指点一下,谢谢
我的 HAL_FLASHEx_Erase() 代码是采用 CubeMX 5.6.1 自动生成的, 然后支调用。哪位大侠帮忙解决一下,非常感谢
刚换开发板试了一下,一样的固件,竟然可以。开发板的MCU型号是:STM32L476RGT6
难道是我买的芯片有问题?