Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Ole Jansen Newsgroups: de.sci.electronics Subject: Re: STM32FXX Flash Speicher weniger abnutzen Date: Thu, 13 Feb 2020 08:54:52 +0100 Lines: 76 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Trace: individual.net YJpdYDJ274hjaGTods5CGgefihqz40mYUQm3kCvtesvIXvLEFo Cancel-Lock: sha1:UVo519zE5nW6Zm0dhVcWZdFdabg= User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.4.2 In-Reply-To: Xref: csiph.com de.sci.electronics:275367 Moin, Am 12.02.2020 um 16:27 schrieb Andreas Fecht: > Am 12.02.2020 um 14:53 schrieb Ole Jansen: >> >> Die Anzahl der Ereignisse so hoch dass ich Bedenken hätte dass >> die Abnutzung  des Flashspeichers zu hoch wird (Etwa Faktor 40). >> Daher die Frage: >> > > Das geht, das habe ich für einen Betriebsstundenzähler auch schon gemacht Vermutlich wird sowas ja öfter verlangt. > Mann kann bei den einfachen STM-Typen jedes Bit einzeln setzen. Löschen > kann man jedoch nur die gesamte Page. Das war meine Hoffnung. Mein erster Versuch mit Sourcery G++ Lite for ARM EABI war allerdings bislang nicht erfolgreich. Ich verwende die Bibliothek stm32f10x_flash.c und wenn ich die Routinen FLASH_ProgramHalfWord (16bit) oder FLASH_ProgramWord(32bit) auf eine bereits beschriebene Adresse benutze benutze gibt die Funktion einen Fehler zurück und der Speicherinhalt ändert sich nicht. > Man muss aber aufpassen, falls der Controller eine ECC-Korrektur hat, > dann gehts nicht. Dann kann man ein ganzes Wort nur komplett setzten. Weiss ich ehrlich gesagt nicht. Ich muss gestehen dass ich mich beim Durcharbeiten der Datenblätter etwas schwer tue. Es gibt so viele Varianten von dem Chip. Kann man ihn vielleicht einfach selber fragen? Die Funktion FLASH_ProgramHalfWord macht jedenfalls grob Folgendes: // if the previous operation is completed, proceed to program the // new data: FLASH->CR |= CR_PG_Set; *(__IO uint16_t*)Address = Data; //Wait for last operation to be completed status = FLASH_WaitForLastOperation(ProgramTimeout); // Disable the PG Bit FLASH->CR &= CR_PG_Reset; Falls es eine ECC Korrektur gibt ist die nicht in der Software. > Wort kann hier auch 64-Bit auf einmal bedeuten. Die schnelleren > 32-Bit-Typen haben oft ein 64-Bit-Flash-Interface. Datenblatt befragen! Mein Muster hier kann 16bit oder 32bit usw. Wenn sich Footprint und Pinning nicht ändern könnte ich jetzt ggf. auch noch einen anderen Typ auswählen. Plan B wäre stumpf für jedes Inkrement 16 Nullen in die Speicherzellen zu schreiben und einen Chip mit entsprechend viel Flash zu nehmen. 40k Flash Speicher für einen "Betriebsstundenzähler" aufzuwenden ist heutzutage ja möglich aber ich fände es trotzdem häßlich. > Die Bits der Flash-Page können je nach Typ nach dem Löschen alle auf 1 > oder 0 sein. Hier sind sie 0xFF, also 1. Wobei das auch sein kann dass der Speicher physikalisch anders organisiert ist. War jetzt nicht so wichtig für mein Problem, ich bin bloß neugierig bzw. möchte meinen Code möglichst gut portierbar schreiben. Viele Grüße, O.J.