Multiple Definitions Veuillez jeter un œil à HowPo corriger l'erreur de linker Multiple Definitions
La bibliothèque Flashstorage_STM32F1, inspirée de Flashstorage de Cristian Maglie, fournit un moyen pratique de stocker et de récupérer les données de l'utilisateur à l'aide de la mémoire Flash non volatile de STM32F1 / F3, y compris des stands non génuine CH32F103XX, CS32F103XX, etc.
La mémoire flash, généralement utilisée pour stocker le code du firmware, peut également être utilisée pour stocker / récupérer plus de données de l'utilisateur et plus rapidement que depuis EEPROM. Grâce à l' écriture et à la lecture des données tamponnées , le temps d'accès flash est considérablement réduit pour augmenter la durée de vie du flash .
Actuellement, la bibliothèque prend en charge la nouvelle STM32 Core v2.0.0 et la précédente STM32 Core v1.9.0
Arduino IDE 1.8.19+ pour Arduino.Arduino Core for STM32 v2.3.0+ pour les cartes STM32. Le moyen le meilleur et le plus simple est d'utiliser Arduino Library Manager . Recherchez Flashstorage_Stm32F1 , puis sélectionnez / installez la dernière version. Vous pouvez également utiliser ce lien pour des instructions plus détaillées.
Une autre façon d'installer est de:
FlashStorage_STM32F1-main.zip .FlashStorage_STM32F1-mainFlashStorage_STM32F1-main entier dans le répertoire des bibliothèques Arduino tels que ~/Arduino/libraries/ . Pour les cartes Generic STM32F4 series , telles que STM32F407VE , en utilisant LAN8720 , veuillez utiliser STM32 Core v2.2.0 car Breaking Core v2.3.0 crée l'erreur de compilation.
Pour utiliser LAN8720 sur certaines cartes STM32
Vous devez copier les fichiers stm32f4xx_hal_conf_default.h et stm32f7xx_hal_conf_default.h dans le répertoire STM32 STM32 (~ / .arduino15 / packages / stm32 / matériel / stm32 / 2.2.0 / système) pour écraser les anciens fichiers.
En supposant que la version Core STM32 STM32 est 2.2.0. Ces fichiers doivent être copiés dans le répertoire:
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F4xx/stm32f4xx_hal_conf_default.h pour stm32f4.~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F7xx/stm32f7xx_hal_conf_default.h pour Nucleo-144 STM32F7.Chaque fois qu'une nouvelle version est installée, n'oubliez pas de copier ce fichier dans le nouveau répertoire de version. Par exemple, la nouvelle version est x.yy.zz, ces fichiers doivent être copiés dans le répertoire correspondant:
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F4xx/stm32f4xx_hal_conf_default.hPour utiliser Serial1 sur certaines cartes STM32 sans définition Serial1 (Nucleo-144 Nucleo_F767ZI, Nucleo-64 Nucleo_L053R8, etc.) , vous devez copier les fichiers STM32 Variant.H dans STM32 STM32 Directory (~ / .3.0 / packages / stm32 / hardlay / stm32 / 2.3.0). Vous devez modifier les fichiers correspondant à vos cartes, ce n'est qu'une illustration comment faire.
En supposant que la version Core STM32 STM32 est 2.3.0. Ces fichiers doivent être copiés dans le répertoire:
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h pour Nucleo-144 Nucleo_F767Zi.~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_L053R8/variant.h pour nucleo-64 nucleo_l053r8.Chaque fois qu'une nouvelle version est installée, n'oubliez pas de copier ce fichier dans le nouveau répertoire de version. Par exemple, la nouvelle version est x.yy.zz, ces fichiers doivent être copiés dans le répertoire correspondant:
~/.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 L'implémentation actuelle de la bibliothèque, en utilisant xyz-Impl.h au lieu de xyz.cpp standard, crée peut-être certaines erreurs de liaison Multiple Definitions dans certains cas d'utilisation.
Vous pouvez inclure ce fichier .hpp
// Can be included as many times as necessary, without `Multiple Definitions` Linker Error
# include " FlashStorage_STM32F1.hpp " // https://github.com/khoih-prog/FlashStorage_STM32F1 Dans de nombreux fichiers. Mais assurez-vous d'utiliser le fichier .h suivant dans seulement 1 .h , .cpp ou .ino File , qui ne doit être inclus dans aucun autre fichier , pour éviter l'erreur de linker Multiple Definitions
// 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 Vérifiez le nouvel exemple de multifileproject pour une démo HOWTO .
Jetez un œil à la discussion dans un comportement différent en utilisant le SRC_CPP ou SRC_H LIB # 80
La mémoire flash a une quantité limitée de cycles d'écriture. Les souvenirs flash typiques peuvent effectuer environ 10000 écritures de cycles au même bloc flash avant de commencer à "s'use" et commencer à perdre la capacité de conserver les données.
Donc , méfiez-vous: une mauvaise utilisation de cette bibliothèque peut détruire rapidement et en permanence la mémoire flash de votre micro , en particulier, vous devez éviter d'appeler les fonctions put() ou commit() trop souvent et assurez-vous que dans toute la vie du micro, le nombre d'appels à put() ou commit() reste bien en dessous de la limite ci-dessus de 10000 (c'est une bonne règle de la règle pour garder ce nombre à l'esprit, même si le fabricant de la micro garantit un nombre plus important de cycles).
Incluez FlashStorage_STM32F1.h pour obtenir une émulation EEPROM avec la mémoire flash interne.
Voir Erulateeprom Sketch pour un exemple.
L'API est très similaire à l'API arduino eeprom.h bien connu mais avec 4 fonctions supplémentaires:
bool isValid() renvoie true si les données dans le eeprom imité sont valides (les données écrites pour flash au moins une fois par EEPROM.commit() ou EEPROM.put() ). Par ailleurs, les données en Eeprom sont "non définies" et la fonction renvoie false .void commit() Stockez les données EEPROM dans Flash. Utilisez-le avec soin: chaque appel écrit les données complètes de l'eeprom émulées à flasher. Cela réduira les cycles flash restants. N'appelez pas cette méthode dans une boucle ou vous tuerez bientôt votre flash.void setCommitASAP(bool value = true) pour définir ou effacer la variable privée _commitASAP (par défaut est true pour être sûr). Si _Commitasap est faux, l'appel à EEPROM.put() ne forcera pas le EEPROM.commit() pour prolonger la durée de vie du flash. Vous devrez vous soucier d'appeler manuellement EEPROM.commit() pour enregistrer les données imitables-eeprom dans le flash ou les données seront perdues.bool getCommitASAP() pour renvoyer la valeur actuelle de _commitASAP .FlashStorage_Stm32f1 / Exemples / flashstoreAndretrieve / flashstoreArreTrerieve.ino
Lignes 26 à 81 dans CB76B66
Ce qui suit est l'échantillon de sortie de borne lors de l'exécution de l'exemple EEPROM_GET sur STM32F1 Bluepill_F103C8 avec un flash de 64 Ko
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!
===============Ce qui suit est l'échantillon de sortie de terminal lors de l'exécution d'exemple FlashstoreArTrerieve sur STM32F1 BluePill_F103C8 avec 64 Ko Flash
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 nowCe qui suit est l'exemple de sortie de terminal lors de l'exécution de l'exemple EEPROM_WRITE sur STM32F1 BLUEPILL_F103C8 avec 128 Ko 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) = 0Ce qui suit est l'échantillon de sortie de terminal lors de l'exécution d'exemple imitéeprom sur STM32F1 Bluepill_F103C8 avec 128 Ko Flash
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 nowCe qui suit est l'échantillon de sortie de terminal lors de l'exécution d'exemple FlashstoreArretrieve sur STM32F1 générique_f103rctx avec 2564KB Flash

| Stlink | <---> | Générique_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 Oui, vous pouvez déclarer une struct avec plus de champs et appeler un EEPROM.put() pour stocker toute la structure. Voir le nom de STORENAMENDSURS pour comment le faire.
Pas avec STM32F1 / F3.
Non. Si votre planche fournit un intégré-eneprom, il est conseillé de l'utiliser parce que EEPROM a une durée de vie plus longue, un nombre de cycles d'écriture, etc.).
En l'absence d'un intégré-heeprom ou sa taille est trop petit pour votre cas d'utilisation, vous pouvez utiliser cette bibliothèque pour utiliser une mémoire flash à petite partie comme émulé-eeprom, à condition que vous gardez à l'esprit les limites comme en nombre limité d'écritures
Si vous obtenez des erreurs de compilation, le plus souvent, vous devrez peut-être installer une version plus récente du noyau pour les tableaux Arduino.
Parfois, la bibliothèque ne fonctionnera que si vous mettez à jour le noyau de la carte vers la dernière version car j'utilise des fonctions nouvellement ajoutées.
Soumettre les problèmes à: Flashstorage_STM32F1
EEPROM.put() et EEPROM.get() pour lire / écrire toute la structure en eeprom imitémultiple-definitions .Merci beaucoup pour tous les rapports de bogues, une nouvelle fonctionnalité suggérant, testé et contribuant au développement de cette bibliothèque.
![]() Cristian Maglie |
Si vous souhaitez contribuer à ce projet:
Copyright (C) 2021- Khoi Hoang