[bsp][stm32] fix flash bug

This commit is contained in:
SummerGift 2018-12-20 15:04:19 +08:00
parent 938bbb030d
commit 08bc2b3f5d
2 changed files with 14 additions and 4 deletions

View File

@ -91,22 +91,30 @@ static rt_uint32_t GetSector(rt_uint32_t Address)
{ {
sector = FLASH_SECTOR_7; sector = FLASH_SECTOR_7;
} }
#if defined(FLASH_SECTOR_8)
else if((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8)) else if((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8))
{ {
sector = FLASH_SECTOR_8; sector = FLASH_SECTOR_8;
} }
#endif
#if defined(FLASH_SECTOR_9)
else if((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9)) else if((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9))
{ {
sector = FLASH_SECTOR_9; sector = FLASH_SECTOR_9;
} }
#endif
#if defined(FLASH_SECTOR_10)
else if((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10)) else if((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10))
{ {
sector = FLASH_SECTOR_10; sector = FLASH_SECTOR_10;
} }
#endif
#if defined(FLASH_SECTOR_11)
else if((Address < ADDR_FLASH_SECTOR_12) && (Address >= ADDR_FLASH_SECTOR_11)) else if((Address < ADDR_FLASH_SECTOR_12) && (Address >= ADDR_FLASH_SECTOR_11))
{ {
sector = FLASH_SECTOR_11; sector = FLASH_SECTOR_11;
} }
#endif
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx)
else if((Address < ADDR_FLASH_SECTOR_13) && (Address >= ADDR_FLASH_SECTOR_12)) else if((Address < ADDR_FLASH_SECTOR_13) && (Address >= ADDR_FLASH_SECTOR_12))
{ {
@ -219,7 +227,7 @@ int stm32_flash_write(long offset, const rt_uint8_t *buf, size_t size)
HAL_FLASH_Unlock(); HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
for (size_t i = 0; i < size; i++, addr++, buf++) for (size_t i = 0; i < size; i++, addr++, buf++)
{ {
@ -278,17 +286,19 @@ int stm32_flash_erase(long offset, size_t size)
/* Unlock the Flash to enable the flash control register access */ /* Unlock the Flash to enable the flash control register access */
HAL_FLASH_Unlock(); HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
/* Get the 1st sector to erase */ /* Get the 1st sector to erase */
FirstSector = GetSector(addr); FirstSector = GetSector(addr);
/* Get the number of sector to erase from 1st sector*/ /* Get the number of sector to erase from 1st sector*/
NbOfSectors = GetSector(addr + size) - FirstSector + 1; NbOfSectors = GetSector(addr + size - 1) - FirstSector + 1;
/* Fill EraseInit structure*/ /* Fill EraseInit structure*/
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
EraseInitStruct.Sector = FirstSector; EraseInitStruct.Sector = FirstSector;
EraseInitStruct.NbSectors = NbOfSectors; EraseInitStruct.NbSectors = NbOfSectors;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK) if (HAL_FLASHEx_Erase(&EraseInitStruct, (uint32_t *)&SECTORError) != HAL_OK)
{ {
result = -RT_ERROR; result = -RT_ERROR;
goto __exit; goto __exit;

View File

@ -244,7 +244,7 @@ int stm32_flash_erase(long offset, size_t size)
/* Get the 1st page to erase */ /* Get the 1st page to erase */
FirstPage = GetPage(addr); FirstPage = GetPage(addr);
/* Get the number of pages to erase from 1st page */ /* Get the number of pages to erase from 1st page */
NbOfPages = GetPage(addr + size) - FirstPage + 1; NbOfPages = GetPage(addr + size - 1) - FirstPage + 1;
/* Get the bank */ /* Get the bank */
BankNumber = GetBank(addr); BankNumber = GetBank(addr);
/* Fill EraseInit structure*/ /* Fill EraseInit structure*/