stm32: Add workaround for flash data cache corruption on read-while-write

This is a know hardware issue on some STM32 see the errata of your model
and if you make use of both memory banks you should enable it.
This commit is contained in:
José Roberto de Souza 2017-03-22 11:12:17 -07:00
parent 09f70c462d
commit b9b4f184a7
2 changed files with 29 additions and 0 deletions

View file

@ -2633,6 +2633,12 @@ config STM32_FLASH_PREFETCH
on F1 parts). Some early revisions of F4 parts do not support FLASH pre-fetch
properly and enabling this option may interfere with ADC accuracy.
config STM32_FLASH_WORKAROUND_DATA_CACHE_CORRUPTION_ON_RWW
bool "Enable the workaround to fix flash data cache corruption when reading from one flash bank while writing on other flash bank"
default n
---help---
See your STM32 errata to check if your STM32 is affected by this problem.
choice
prompt "JTAG Configuration"
default STM32_JTAG_DISABLE

View file

@ -130,6 +130,20 @@ static void flash_lock(void)
modifyreg32(STM32_FLASH_CR, 0, FLASH_CR_LOCK);
}
static void data_cache_disable(void)
{
modifyreg32(STM32_FLASH_ACR, FLASH_ACR_DCEN, 0);
}
static void data_cache_enable(void)
{
/* reset data cache */
modifyreg32(STM32_FLASH_ACR, 0, FLASH_ACR_DCRST);
/* enable data cache */
modifyreg32(STM32_FLASH_ACR, 0, FLASH_ACR_DCEN);
}
/************************************************************************************
* Public Functions
************************************************************************************/
@ -384,6 +398,10 @@ ssize_t up_progmem_write(size_t addr, const void *buf, size_t count)
flash_unlock();
#if defined(CONFIG_STM32_FLASH_WORKAROUND_DATA_CACHE_CORRUPTION_ON_RWW)
data_cache_disable();
#endif
modifyreg32(STM32_FLASH_CR, 0, FLASH_CR_PG);
#if defined(CONFIG_STM32_STM32F40XX)
@ -417,6 +435,11 @@ ssize_t up_progmem_write(size_t addr, const void *buf, size_t count)
}
modifyreg32(STM32_FLASH_CR, FLASH_CR_PG, 0);
#if defined(CONFIG_STM32_FLASH_WORKAROUND_DATA_CACHE_CORRUPTION_ON_RWW)
data_cache_enable();
#endif
sem_unlock();
return written;
}