|
|
@ -151,6 +151,7 @@ static inline void putreg32(uint32_t val, unsigned int addr) |
|
|
|
|
|
|
|
|
|
|
|
static void stm32_flash_wait_idle(void) |
|
|
|
static void stm32_flash_wait_idle(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
__DSB(); |
|
|
|
while (FLASH->SR & FLASH_SR_BSY) { |
|
|
|
while (FLASH->SR & FLASH_SR_BSY) { |
|
|
|
// nop
|
|
|
|
// nop
|
|
|
|
} |
|
|
|
} |
|
|
@ -242,8 +243,9 @@ bool stm32_flash_ispageerased(uint32_t page) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (addr = stm32_flash_getpageaddr(page), count = stm32_flash_getpagesize(page); |
|
|
|
for (addr = stm32_flash_getpageaddr(page), count = stm32_flash_getpagesize(page); |
|
|
|
count; count--, addr++) { |
|
|
|
count; count -= 4, addr += 4) { |
|
|
|
if ((*(volatile uint8_t *)(addr)) != 0xff) { |
|
|
|
uint32_t v = getreg32(addr); |
|
|
|
|
|
|
|
if (v != 0xffffffff) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -280,21 +282,14 @@ bool stm32_flash_erasepage(uint32_t page) |
|
|
|
|
|
|
|
|
|
|
|
stm32_flash_wait_idle(); |
|
|
|
stm32_flash_wait_idle(); |
|
|
|
|
|
|
|
|
|
|
|
if (FLASH->SR) { |
|
|
|
#if defined(STM32F7) && STM32_DMA_CACHE_HANDLING == TRUE |
|
|
|
// an error occurred
|
|
|
|
dmaBufferInvalidate(stm32_flash_getpageaddr(page), stm32_flash_getpagesize(page)); |
|
|
|
FLASH->SR = 0xF3; |
|
|
|
|
|
|
|
stm32_flash_lock(); |
|
|
|
|
|
|
|
#if STM32_FLASH_DISABLE_ISR |
|
|
|
|
|
|
|
chSysRestoreStatusX(sts); |
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stm32_flash_lock(); |
|
|
|
stm32_flash_lock(); |
|
|
|
#if STM32_FLASH_DISABLE_ISR |
|
|
|
#if STM32_FLASH_DISABLE_ISR |
|
|
|
chSysRestoreStatusX(sts); |
|
|
|
chSysRestoreStatusX(sts); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
return stm32_flash_ispageerased(page); |
|
|
|
return stm32_flash_ispageerased(page); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|