Es mag eine dumme Frage sein, aber ich kann nicht herausfinden, in welchen Fällen ein Flash-Massenlöschen aus der In-Application-Programmierung (IAP) relevant ist, da es auch den Benutzercode löschen würde?
Für STM32-Geräte stellt ST Beispielcode in Referenzhandbüchern wie diesem bereit :
A.2.4 Beispiel für einen Massenlöschsequenzcode
/* (1) Set the MER bit in the FLASH_CR register to enable mass erasing */
/* (2) Set the STRT bit in the FLASH_CR register to start the erasing */
/* (3) Wait until the BSY bit is reset in the FLASH_SR register */
/* (4) Check the EOP flag in the FLASH_SR register */
/* (5) Clear EOP flag by software by writing EOP at 1 */
/* (6) Reset the PER Bit to disable the mass erase */
FLASH->CR |= FLASH_CR_MER; /* (1) */
FLASH->CR |= FLASH_CR_STRT; /* (2) */
while ((FLASH->SR & FLASH_SR_BSY) != 0) /* (3) */
{
/* For robust implementation, add here time-out management */
}
if ((FLASH->SR & FLASH_SR_EOP) != 0) /* (4)*/
{
FLASH->SR = FLASH_SR_EOP; /* (5) */
}
else
{
/* Manage the error cases */
}
FLASH->CR &= ~FLASH_CR_MER; /* (6) */
Ich verstehe nicht, wie die CPU die Anweisungen von (3) bis (6) erreichen kann.
Sollte man sie nicht schon löschen?
Das Programm wird möglicherweise nicht vom Flash ausgeführt. Der STM32 kann Code aus SRAM oder externem Speicher (über FMC) ausführen; Code, der von diesen Speicherorten ausgeführt wird, könnte den Flash-Speicher sicher* löschen.
Einige STM32-Teile haben auch zwei Flash-Speicherbänke. Der Code könnte von einer Bank ausgeführt werden und die andere Bank löschen.
*: Nun, meistens sicher. Ein Stromausfall während eines Lösch-/Programmierzyklus würde das Teil leer lassen.
Hans
Oldtimer