Kann der Flash-Speicher des Mikrocontroller-Programms zum Speichern der Benutzerkonfiguration verwendet werden?

9

Viele Mikrocontroller, z. B. PIC18F , verfügen über einen Flash-Programmspeicher: "Der Flash-Programmspeicher ist während des normalen Betriebs lesbar und beschreibbar." Bedeutet dies, dass ich einige Benutzerkonfigurationen im Programmspeicher speichern kann?

student1
quelle

Antworten:

12

Ja, du kannst. Ich habe das schon oft gemacht.

Es gibt jedoch einige Nachteile bei der Verwendung eines separaten EEPROM:

  1. Die Anzahl der lebenslangen Schreibvorgänge in den Programm-Flash-Speicher ist erheblich geringer als im Daten-EEPROM.

  2. Der Prozessor geht während der Lösch- und Schreibzeiten zum Mittagessen aus.

  3. Der Programmblitz wird blockweise gelöscht. Sie können nicht einfach ein einzelnes Byte aktualisieren. Normalerweise verwende ich ein Block-Caching-Schema, um damit umzugehen.

Olin Lathrop
quelle
Perfekt, Sie scheinen irgendwie zu wissen , dass meine Frage ist wirklich „ warum die Notwendigkeit für EEPROM , während Sie den Programmspeicher sowohl für Programm- und Anwenderdaten verwenden können“ :)
student1
Olin, wird der gesamte Flash gelöscht, wenn eine neue Firmware-Version in den PIC gebrannt wird? Gibt es eine gute Möglichkeit, um zu verhindern, dass die Benutzerkonfiguration (oder die Kalibrierungsdaten) im Flash beim Herunterladen der Firmware gelöscht werden? Hier geht es um Bequemlichkeit bei der Firmware-Entwicklung. Ich würde mir vorstellen, dass die Benutzerkonfiguration im allerletzten Block oder Flash gespeichert wird.
Nick Alexeev
6
@ Nick: Das liegt an dem PIC-Programmierer, den Sie verwenden. Viele, einschließlich meiner, führen eine Massenlöschung durch, sodass die Kalibrierungsdaten gelöscht werden. Ich habe gelegentlich eine spezielle Programmier-App geschrieben, die die Kalibrierungsdaten las, die Massenlöschung durchführte und dann die Kalibrierungsdaten im Rahmen des normalen Programmierprozesses wieder herausschrieb. Einige der Microchip-Programmierer können möglicherweise nur Teile des Programmspeichers aktualisieren. Beachten Sie, dass der Programmierer beim Aktivieren des Codeschutzes eine Massenlöschung durchführen muss.
Olin Lathrop
Auf Nicht-Harvard-Prozessoren (ich denke an MSP430) können Sie Code in den Arbeitsspeicher kopieren, in den Arbeitsspeicher springen und ausführen, während das Flash-Schreiben / Löschen stattfindet. Ich habe dies für einen Bootloader verwendet, um gleichzeitig neue Daten von einem Radio zu schreiben und zu empfangen.
Markrages
@mark: Ja, dies funktioniert auch auf PIC32, wo es auch möglich ist, aus dem RAM auszuführen. In der Tat ist das schneller.
Olin Lathrop
6

Viele PIC18 verfügen über einen EEPROM-Speicher mit einer Größe von bis zu 1 KB. Leider verweist der PIC18F46J50, auf den Sie verweisen, nicht. Wenn ein EEPROM verfügbar ist, ist es eine viel bessere Wahl, wenn es groß genug für Ihre Daten ist, da das EEPROM mindestens 1.000.000 Lösch- / Schreibzyklen aufweist und der Flash nur 10.000 beträgt.

Der PIC18 verwendet wie die meisten anderen Mikrocontroller eine sogenannte Harvard-Architektur, dh es gibt einen physisch getrennten adressierbaren Bereich für Programme und Daten (dh Sie können eine Programmadresse 4 und eine Datenadresse 4 haben, und diese sind nicht identisch). Daher können Sie Flash-Speicher weder mit den normalen Methoden in C noch in Assemblersprache lesen oder schreiben.

Stattdessen richten Sie in der PIC18-Familie eine Startadresse in einem 22-Bit-Register namens TBLPTR ein. Um Bytes aus dem Flash zu lesen, verwenden Sie eine TBLRD-Anweisung. Es besteht die Möglichkeit, die Adresse nach einem Lesevorgang automatisch zu erhöhen oder zu verringern. Sie müssen dies nicht manuell tun.

Um in den Flash-Speicher zu schreiben, müssen Sie zuerst einen oder mehrere 64-Byte-Blöcke des Flash-Speichers löschen, die überschrieben werden. Nach dem erneuten Einrichten der Startadresse in TBLPTR und der Werte in einigen anderen Registern zum Initialisieren des Löschvorgangs werden Interrupts deaktiviert. Anschließend müssen Sie 0x55 unmittelbar gefolgt von 0xAA in ein Register schreiben. Dadurch wird der Löschbefehl entsperrt und verhindert, dass fehlerhafter Code versehentlich den Speicher löscht. Schließlich wird der Befehl zum tatsächlichen Löschen ausgeführt, gefolgt von der erneuten Aktivierung von Interrupts.

Das Schreiben in den Flash-Speicher ähnelt dem Löschen, außer dass die Blockgröße kleiner ist. Das Schreiben wird tatsächlich unter Verwendung eines TBLWT-Befehls ausgeführt, der auch ein automatisches Inkrementieren / Dekrementieren wie der TBLRD-Befehl ermöglicht.

Das Schreiben in den Flash-Speicher spart nicht nur Konfigurationsdaten, sondern ermöglicht es auch, die Firmware vor Ort mithilfe der sogenannten "Firmware over the Air" zu aktualisieren. Sie benötigen einen festen Firmware-Block, normalerweise zu Beginn des Programmspeichers, der das Update von einem Bluetooth-Modul, Wi-Fi, Mobilfunkmodul oder sogar einer Kabelverbindung empfangen und den Flash über einem bestimmten Punkt in aktualisieren kann das Programm (zB ein "Zaun") mit neuem Code. Nach Abschluss des Updates wird ein Reset eingeleitet und der neue Code verwendet.

Viele andere Mikrocontroller neben der PIC-Familie können ihren Flash-Speicher aktualisieren. Die meisten verwenden eine Kombination aus Konfigurationsregistern, einem Adresszeiger und speziellen Anweisungen, um die Aufgabe auszuführen.

tcrosley
quelle
Diese "Firmware over the Air" -Methode sieht sehr interessant aus. Beseitigt es die Notwendigkeit von In System Programming (ISP)?
student1
@ student1 Die anfängliche Programmierung des Chips über eine ISP-Schnittstelle ist nicht mehr erforderlich, da Sie Firmware auf den Chip legen müssen, um die Updates später verarbeiten zu können. Die auf den Arduino-Boards verwendeten ATmega-Mikrocontroller verfügen bereits über diese Art von Firmware, den so genannten Bootloader. Aus diesem Grund müssen Sie keine ISP-Schnittstelle verwenden, um Skizzen auf ein Arduino herunterzuladen. Wenn Sie jedoch den Bootloader selbst aktualisieren möchten, ist dafür eine ISP-Schnittstelle erforderlich. Dieser Bootloader verarbeitet Updates nur über USB, es handelt sich also nicht wirklich um "Firmware over the Air".
Tcrosley