Multiple Definitions Linker -Fehler Bitte werfen Sie einen Blick auf HowTO, um Multiple Definitions für Linkerfehler zu beheben
Die FlashStorage_Stm32F1-Bibliothek, inspiriert von Cristian Maglies FlashStorage, bietet eine bequeme Möglichkeit, die Daten des Benutzers mithilfe von Emuled-Eprom aus dem nichtflüchtigen Flash-Speicher von STM32F1/F3, einschließlich der Nicht-Genuine-Ch32f103xx, CS32F103xx usw., aus.
Der Flash -Speicher, der im Allgemeinen zum Speichern des Firmware -Codes verwendet wird, kann auch zum Speichern / Abrufen von mehr Benutzerdaten und schneller als von EEPROM verwendet werden. Dank des gepufferten Datenschreibens und Lesens wird die Flash -Zugriffszeit stark verkürzt, um die Lebensdauer des Blitzes zu erhöhen .
Derzeit unterstützt die Bibliothek sowohl den neuen STM32 -Core V2.0.0 als auch der vorherige STM32 Core V1.9.0
Arduino IDE 1.8.19+ für Arduino.Arduino Core for STM32 v2.3.0+ für STM32 -Boards. Der beste und einfachste Weg ist die Verwendung Arduino Library Manager . Suchen Sie nach FlashStorage_Stm32f1 und wählen Sie die neueste Version aus / installieren Sie sie. Sie können diesen Link auch für detailliertere Anweisungen verwenden.
Eine andere Möglichkeit zu installieren ist:
FlashStorage_STM32F1-main.zip herunter.FlashStorage_STM32F1-main VerzeichnisFlashStorage_STM32F1-main Ordner in das Verzeichnis von Arduino Libraries wie ~/Arduino/libraries/ . Für Generic STM32F4 series -Boards wie STM32F407VE unter Verwendung von LAN8720 verwenden Sie bitte STM32 CORE v2.2.0 als Breaking Core v2.3.0 Erstellt den Kompilierfehler.
LAN8720 für einige STM32 -Boards verwenden
Sie müssen die Dateien stm32f4xx_hal_conf_default.h und stm32f7xx_hal_conf_default.h in STM32 STM32 -Verzeichnis (~/.arduino15/Pakete/STM32/Hardware/Stm32/2.2.0/System) kopieren, um die alten Dateien zu überschreiben.
Angenommen, die STM32 STM32 -Kernversion ist 2.2.0. Diese Dateien müssen in das Verzeichnis kopiert werden:
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F4xx/stm32f4xx_hal_conf_default.h für STM32F4.~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F7xx/stm32f7xx_hal_conf_default.h für nucleo-144 STM32F7.Wenn eine neue Version installiert ist, denken Sie daran, diese Datei in das neue Versionsverzeichnis zu kopieren. Beispielsweise ist eine neue Version X.yy.zz. Diese Dateien müssen in das entsprechende Verzeichnis kopiert werden:
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F4xx/stm32f4xx_hal_conf_default.hTo use Serial1 on some STM32 boards without Serial1 definition (Nucleo-144 NUCLEO_F767ZI, Nucleo-64 NUCLEO_L053R8, etc.) boards , you have to copy the files STM32 variant.h into STM32 stm32 directory (~/.arduino15/packages/STM32/hardware/stm32/2.3.0). Sie müssen die Dateien ändern, die Ihren Boards entsprechen. Dies ist nur eine Abbildung, wie es geht.
Angenommen, die STM32 STM32 -Kernversion ist 2.3.0. Diese Dateien müssen in das Verzeichnis kopiert werden:
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h für nucleo-144 nucleo_f767zi.~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_L053R8/variant.h für nucleo-64 nucleo_l053r8.Wenn eine neue Version installiert ist, denken Sie daran, diese Datei in das neue Versionsverzeichnis zu kopieren. Beispielsweise ist eine neue Version X.yy.zz. Diese Dateien müssen in das entsprechende Verzeichnis kopiert werden:
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/variants/NUCLEO_F767ZI/variant.h~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/variants/NUCLEO_L053R8/variant.hMultiple Definitions Linker -Fehler Die aktuelle Implementierung der Bibliothek unter Verwendung von xyz-Impl.h anstelle von Standard xyz.cpp erstellt möglicherweise bestimmte Multiple Definitions Linkerfehler in bestimmten Anwendungsfällen.
Sie können diese .hpp -Datei einfügen
// Can be included as many times as necessary, without `Multiple Definitions` Linker Error
# include " FlashStorage_STM32F1.hpp " // https://github.com/khoih-prog/FlashStorage_STM32F1 in vielen Dateien. Verwenden Sie jedoch unbedingt die folgende .h -Datei in nur 1 .h , .cpp oder .ino -Datei , die in keiner anderen Datei enthalten sein darf, um Multiple Definitions zu vermeiden, linker
// To be included only in main(), .ino with setup() to avoid `Multiple Definitions` Linker Error
# include " FlashStorage_STM32F1.h " // https://github.com/khoih-prog/FlashStorage_STM32F1 Überprüfen Sie das neue MultifileProject -Beispiel für eine HOWTO -Demo.
Schauen Sie sich die Diskussion in unterschiedlichem Verhalten unter Verwendung des SRC_CPP oder SRC_H Lib #80 an
Der Flash -Speicher hat eine begrenzte Menge an Schreibzyklen. Typische Flash -Erinnerungen können etwa 10000 Schreibzyklen in denselben Flash -Block ausführen, bevor es mit dem "Abnutzen" beginnt, und die Fähigkeit zu verlieren, Daten zu halten.
Also vorsichtig: Die unangemessene Verwendung dieser Bibliothek kann den Flash-Speicher Ihres Micro schnell und dauerhaft zerstören . Insbesondere sollten Sie vermeiden, den put() oder commit() zu oft aufzurufen und sicherzustellen, dass im gesamten Leben des Mikro die Anzahl der Anrufe, die put() oder commit() weit unterhalb der oben genannten Grenze bleiben (es ist eine gute Anzahl von Zyklen, eine gute Anzahl von Zykeln).
Fügen Sie FlashStorage_STM32F1.h ein, um eine EEPROM -Emulation mit dem internen Flash -Speicher zu erhalten.
Siehe Emulationseeeeeeeeeeeeeeakrom -Skizze für ein Beispiel.
Die API ist der bekannten Arduino eeprom.h -API sehr ähnlich, aber mit 4 zusätzlichen Funktionen:
bool isValid() gibt true zurück, wenn Daten im emulierten Effekt gültig sind (die Daten, die mindestens einmal von EEPROM.commit() oder EEPROM.put() ) geschrieben wurden. Andernfalls sind emulierte Effektdaten "undefiniert" und die Funktion gibt false zurück.void commit() speichern die EEPROM -Daten in Flash. Verwenden Sie dies mit Sorgfalt: Jeder Anruf schreibt die vollständigen emulierten E-E-E-E-Daten, um zu blinken. Dadurch werden die verbleibenden Blitzschreiberzyklen verringert. Nennen Sie diese Methode nicht in einer Schleife, sonst töten Sie Ihren Blitz bald.void setCommitASAP(bool value = true) um die private Variable _commitASAP festzulegen oder zu löschen (Standard ist true , um sicher zu sein). Wenn _commitasap falsch ist, erzwingt der Aufruf an EEPROM.put() das EEPROM.commit() nicht, die Flash -Lebensdauer zu verlängern. Sie müssen sich daran erinnern, EEPROM.commit() manuell anzurufen, um die emulierten Effektdaten in Flash zu speichern, oder Daten gehen verloren.bool getCommitASAP() , um den aktuellen Wert von _commitASAP zurückzugeben.FlashStorage_Stm32f1/Beispiele/FlashStoreAnDretieve/FlashStoreandretreve.ino
Zeilen 26 bis 81 in CB76B66
Im Folgenden ist die Ausgabe des Beispielanschlusss beim Ausführen von Beispiel eeprom_get auf STM32F1 Bluepill_f103c8 mit 64 KB Blitz
Start EEPROM_get on BLUEPILL_F103C8
FlashStorage_STM32F1 v1 .1.0
EEPROM length: 1019
Start Flash Address: 0x800F800
[FLASH] REGISTERED_NUMBER_FLASH_SECTORS (KB) = 64
[FLASH] USING_FLASH_SECTOR_NUMBER = 62
EEPROM doesn ' t store valid data, writing WRITTEN_SIGNATURE and some example data
Float written to EEPROM: 123.456
Done writing custom object to EEPROM:
===============
Field1: 3.14159
Field2: 65
Name: Working!
===============
Reset to see how you can retrieve the values by using EEPROM_get! Start EEPROM_get on BLUEPILL_F103C8
FlashStorage_STM32F1 v1 .1.0
EEPROM length: 1019
Start Flash Address: 0x800F800
[FLASH] REGISTERED_NUMBER_FLASH_SECTORS (KB) = 64
[FLASH] USING_FLASH_SECTOR_NUMBER = 62
EEPROM has valid data with WRITTEN_SIGNATURE. Now read some example data
Read float from EEPROM: 123.456
Read custom object from EEPROM:
===============
Field1: 3.14159
Field2: 65
Name: Working!
===============Im Folgenden finden Sie die Ausgabe des Beispielanterminals beim Ausführen von Beispiel FlashStoreandretieve auf STM32F1 Bluepill_F103C8 mit 64 KB Blitz
Start FlashStoreAndRetrieve on BLUEPILL_F103C8
FlashStorage_STM32F1 v1 .1.0
EEPROM length: 1019
Start Flash Address: 0x800FC00
[FLASH] REGISTERED_NUMBER_FLASH_SECTORS (KB) = 64
[FLASH] USING_FLASH_SECTOR_NUMBER = 63
Number = 0x0
Done writing to emulated EEPROM. You can reset nowStart FlashStoreAndRetrieve on BLUEPILL_F103C8
FlashStorage_STM32F1 v1 .1.0
EEPROM length: 1019
Start Flash Address: 0x800FC00
[FLASH] REGISTERED_NUMBER_FLASH_SECTORS (KB) = 64
[FLASH] USING_FLASH_SECTOR_NUMBER = 63
Number = 0x1
Done writing to emulated EEPROM. You can reset nowIm Folgenden ist die Ausgabe des Beispielanschlusss beim Ausführen von Beispiele eeprom_write auf STM32F1 Bluepill_f103c8 mit 128 KB Flash
Start EEPROM_write on BLUEPILL_F103C8
FlashStorage_STM32F1 v1 .1.0
EEPROM length: 1019
Start Flash Address: 0x801F800
[FLASH] REGISTERED_NUMBER_FLASH_SECTORS (KB) = 128
[FLASH] USING_FLASH_SECTOR_NUMBER = 126
Done writing emulated EEPROM. Time spent (ms) = 29
Done writing emulated EEPROM. Time spent (ms) = 0
Done writing emulated EEPROM. Time spent (ms) = 0
Done writing emulated EEPROM. Time spent (ms) = 0
Done writing emulated EEPROM. Time spent (ms) = 0
Done writing emulated EEPROM. Time spent (ms) = 0Das Folgende ist der Beispielanschlussausgang beim Ausführen von Beispielen auf STM32F1 Bluepill_f103c8 mit 128 KB Blitz
Start EmulatedEEPROM on BLUEPILL_F103C8
FlashStorage_STM32F1 v1 .1.0
EEPROM length: 1019
Start Flash Address: 0x801FC00
[FLASH] REGISTERED_NUMBER_FLASH_SECTORS (KB) = 128
[FLASH] USING_FLASH_SECTOR_NUMBER = 127
EEPROM is empty, writing WRITTEN_SIGNATURE and some example data:
-> 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
Done writing to emulated EEPROM. You can reset now to testStart EmulatedEEPROM on BLUEPILL_F103C8
FlashStorage_STM32F1 v1 .1.0
EEPROM length: 1019
Start Flash Address: 0x801FC00
[FLASH] REGISTERED_NUMBER_FLASH_SECTORS (KB) = 128
[FLASH] USING_FLASH_SECTOR_NUMBER = 127
EEPROM has been written.Signature = 0xBEEFDEED
Here is the content of the next 16 bytes:
-> 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 11913
Clearing WRITTEN_SIGNATURE for next try
Done clearing signature in emulated EEPROM. You can reset nowIm Folgenden finden Sie die Ausgabe des Beispielanterminals beim Ausführen von Beispiel FlashStoreAnDretieve auf STM32F1 generic_f103rctx mit 2564KB Flash

| Stlink | <---> | Generic_f103rctx |
|---|---|---|
| Swclk | <---> | SWCLK / PA14 |
| Swdio | <---> | Swdio / pa13 |
| GND | <---> | GND |
| 3.3 V | <---> | 3.3 V |
Start FlashStoreAndRetrieve on GENERIC_F103RCTX
FlashStorage_STM32F1 v1 .1.0
EEPROM length: 1019
Start Flash Address: 0x803F800
[FLASH] REGISTERED_NUMBER_FLASH_SECTORS (KB) = 256
[FLASH] USING_FLASH_SECTOR_NUMBER = 254
Number = 0xFFFFFFFF
Done writing to emulated EEPROM. You can reset nowStart FlashStoreAndRetrieve on GENERIC_F103RCTX
FlashStorage_STM32F1 v1 .1.0
EEPROM length: 1019
Start Flash Address: 0x803F800
[FLASH] REGISTERED_NUMBER_FLASH_SECTORS (KB) = 256
[FLASH] USING_FLASH_SECTOR_NUMBER = 254
Number = 0x0
Done writing to emulated EEPROM. You can reset now Ja, Sie können eine struct mit mehr Feldern deklarieren und einen EEPROM.put() anrufen, um die gesamte Struktur zu speichern. Sehen Sie sich den StorlenAmands -Name an, wie es geht.
Nicht mit STM32F1/F3.
Nein. Wenn Ihr Vorstand ein integriertes E-E-E-E-E-E-E-E-E-Eanz bietet, ist es ratsam, dies zu verwenden, da EEPROM eine längere Lebensdauer, die Anzahl der Schreibzyklen usw. hat).
In Ermangelung eines integrierten Effekts oder seiner Größe ist zu klein für Ihren Anwendungsfall. Sie können diese Bibliothek verwenden, um einen kleinen Portions-Flash-Speicher als emuliertes E-Effekt zu verwenden, sofern Sie die Grenzen wie in begrenzter Anzahl von Schreibungen beachten,
Wenn Sie Kompilierungsfehler erhalten, müssen Sie möglicherweise eine neuere Version des Kerns für Arduino -Boards installieren.
Manchmal funktioniert die Bibliothek nur, wenn Sie den Board Core auf die neueste Version aktualisieren, da ich neu hinzugefügte Funktionen verwende.
Senden Sie Probleme an: FlashStorage_Stm32f1 Probleme
EEPROM.put() und EEPROM.get() Funktionen zum Lesen/Schreiben der gesamten Struktur in emuliertem Effektmultiple-definitions für Linkerfehler.Vielen Dank für alle für die Meldung von Fehler, neue Funktionen, die vorgeschlagen, testen und zur Entwicklung dieser Bibliothek beitragen.
![]() Cristian Maglie |
Wenn Sie zu diesem Projekt beitragen möchten:
Copyright (C) 2021-Khoi Hoang