Es gibt Stm32l052 mit eingebautem EEPROM (2k). Es werden 4 ADC-Kanäle verwendet, Daten werden alle 40 Mikrosekunden vom Trigger gesammelt. Daten vom ADC werden im Interrupt verarbeitet (bestimmt durch die Ausgabe von Werten über die Grenzen hinaus). Wenn Sie also die Standard-Hal-Bibliotheken verwenden, gehen während der Aufzeichnung in EEPROM-Punkte verloren (3 Millisekunden Standard-Schreibgeschwindigkeit in EEPROM-Daten), selbst wenn Sie ein Byte aus dem Ringpuffer schreiben. Gibt es eine Möglichkeit, den Controller dazu zu bringen, asynchron in das EEPROM zu schreiben, ohne die ADC-Interrupts zu blockieren?
STM32L052
scheint einen einzigen Bank-NVM-Controller zu haben, daher würde ein Schreibzugriff auf eine beliebige EEPROM-Adresse das Lesen und Abrufen von Daten aus dem Flash blockieren.
Es würde nur funktionieren, wenn Sie den gesamten relevanten Code außer der Initialisierung, aber einschließlich der Vektortabelle, in den RAM verschieben können. Es wäre eine ziemliche Herausforderung, dies in 8 kByte zu tun, aber es könnte funktionieren. Vergessen Sie HAL, es hat zu viel Overhead und Komplexität.
Ich würde empfehlen, es so zu machen:
SCB->ICSR=SCB_ICSR_PENDSVSET
) auf.Diese Anordnung würde verhindern, dass irgendein Code im Flash ausgeführt wird, solange ein EEPROM-Schreibvorgang im Gange ist, lässt jedoch Handler mit höherer Priorität laufen, solange sie nicht den nichtflüchtigen Speicher berühren.
Um eine Funktion in den RAM zu verlagern
Verwenden Sie bei gcc __attribute__((section(".data")))
in der Funktionsdeklaration. Führen Sie dies rekursiv mit jeder aufgerufenen Funktion durch. Wird verwendet -ffreestanding
, um zu verhindern, dass gcc unerwartet Aufrufe von Bibliotheksfunktionen generiert. Der .data
Abschnitt wird nach dem Zurücksetzen zusammen mit den initialisierten Variablen durch den Startcode vom Flash in den RAM kopiert.
Zum Verschieben der Vektortabelle
Die Vektortabelle des STM32L052
ist 192 Bytes lang (Referenzhandbuch 12.3 Unterbrechungs- und Ausnahmevektoren). Ich würde einfach den Beginn des RAM im Linker-Skript um 192 Byte nach oben verschieben
RAM (xrw) : ORIGIN = 0x200000C0, LENGTH = 8000 /* 8192 - 192 */
Kopieren Sie die Vektortabelle dorthin und setzen Sie den Vektortabellenzeiger
memcpy((void*)0x20000000, (void*)0x08000000, 192);
SCB->VTOR = 0x20000000;
bevor irgendein Interrupt aktiviert wird.
Stattdessen STM32L072
wäre es möglich, das Programm von Bank 1 laufen zu lassen und EEPROM-Daten in Bank 2 zu platzieren , sie würden sich nicht gegenseitig stören. Natürlich würde es immer noch 3 ms dauern (oder 6 ms, wenn es nicht leer ist), um ein 32-Bit-Wort† in das EEPROM zu schreiben. Der Versuch, mehr Daten zu schreiben, bevor der erste Schreibvorgang abgeschlossen ist, würde immer noch die Programmausführung blockieren, bis der erste abgeschlossen ist. Überprüfen Sie das Referenzhandbuch für das Bank-Layout (3.3.1 NVM-Organisation)
† AFAIK EEPROM-Daten werden in 32-Bit-Einheiten geschrieben, das Schreiben von 1 oder 2 Bytes auf einmal dauert genauso lange wie das Schreiben eines vollen 4-Byte-Wortes.
Chris Stratton
folgte Monica zu Codidact
Jon