Multiple Definitions Veuillez jeter un œil à HowPo corriger l'erreur de linker Multiple Definitions
La bibliothèque Flashstorage_Stm32, 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 la mémoire flash non volatile de STM32F / L / H / G / WB / MP1.
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 fois le nouveau 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_Stm32 , 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_STM32-main.zip .FlashStorage_STM32-mainFlashStorage_STM32-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_STM32.hpp " // https://github.com/khoih-prog/FlashStorage_STM32 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_STM32.h " // https://github.com/khoih-prog/FlashStorage_STM32 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_STM32.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 .Bi_ethernet_blynk
Bi_ethernet_blynk_email
Bi_ethernet_wm_config
LAN8720_ETHERNET_BLYNK
Lan8720_ethernet_blynk_email
Lan8720_ethernet_wm_config
......
Et bien d'autres aux bibliothèques viennent.
Flashstorage_Stm32 / Exemples / StorenameAnSurname / StorenameAnSurname.ino
Lignes 15 à 106 dans BB0DD71
Ce qui suit est l'exemple de sortie de terminal lors de l'exécution de l'exemple Ethernet_STM32_LAN8720 sur STM32F4 BLACK_F407VE avec LAN8720 Ethernet à l'aide de la bibliothèque STM32Ethernet.
Start Ethernet_STM32_LAN8720 on BLACK_F407VE
Ethernet Shield type : LAN8720 Ethernet & STM32Ethernet Library
Ethernet_Manager_STM32 v1 .3.2
DoubleResetDetector_Generic v1 .8.1
EEPROM size = 16384 , start = 0
Flag read = 0xd0d04321
No doubleResetDetected
SetFlag write = 0xd0d01234
[ETM] EEPROMsz: 4096
[ETM] EEPROM Length ():16384
[ETM] CCSum=0xaed,RCSum=0x4d385471
[ETM] ChkCrR:CrCCsum=0x21dd,CrRCsum=0x3338
[ETM] InitCfgFile,sz=60
[ETM] SaveEEPROM,Sz=16384,DataSz=0,WCSum=0x569
[ETM] CrCCSum=0xc30
[ETM] Start connectEthernet using DHCP
[ETM] MAC:FE-98-FC-DD-D9-BA
[ETM] Dynamic IP OK, connected
[ETM] IP:192.168.2.169
[ETM] bg: isForcedConfigPortal = false
[ETM] bg:Stay forever in CP:No ConfigDat
Connected! IP address: 192.168.2.169
Your stored Credentials :
MQTT Server = blank
Port = blank
MQTT UserName = blank
MQTT PWD = blank
Subs Topics = blank
Pubs Topics = blank
HStop doubleResetDetecting
ClearFlag write = 0xd0d04321
HHHHH[ETM] h:Updating EEPROM. Please wait for reset
[ETM] SaveEEPROM,Sz=16384,DataSz=0,WCSum=0x729
[ETM] CrCCSum=0x1087
[ETM] h:Rst
Start Ethernet_STM32_LAN8720 on BLACK_F407VE
Ethernet Shield type : LAN8720 Ethernet & STM32Ethernet Library
Ethernet_Manager_STM32 v1 .3.2
DoubleResetDetector_Generic v1 .8.1
EEPROM size = 16384 , start = 0
Flag read = 0xd0d04321
No doubleResetDetected
SetFlag write = 0xd0d01234
[ETM] EEPROMsz: 4096
[ETM] EEPROM Length ():16384
[ETM] CCSum=0x729,RCSum=0x729
[ETM] ChkCrR:CrCCsum=0x1087,CrRCsum=0x1087
[ETM] CrCCSum=1087,CrRCSum=1087
[ETM] Valid Stored Dynamic Data
[ETM] ======= Start Stored Config Data =======
[ETM] Header=STM32, BoardName=Black_V407VE
[ETM] StaticIP=blank
[ETM] Start connectEthernet using DHCP
[ETM] MAC:FE-98-FD-D6-DA-BA
[ETM] Dynamic IP OK, connected
[ETM] IP:192.168.2.170
[ETM] begin:Ethernet Connected.
Connected! IP address: 192.168.2.170
Your stored Credentials :
MQTT Server = mqtt_server
Port = 1883
MQTT UserName = mqtt_user
MQTT PWD = mqtt_pass
Subs Topics = Subs
Pubs Topics = Pubs
HStop doubleResetDetecting
ClearFlag write = 0xd0d04321
HSetFlag write = 0xd0d01234
[ETM] EEPROMsz:4096
[ETM] EEPROM Length():16384
[ETM] CCSum=0x729,RCSum=0x729
[ETM] ChkCrR:CrCCsum=0x1087,CrRCsum=0x1087
[ETM] CrCCSum=1087,CrRCSum=1087
[ETM] Valid Stored Dynamic Data
[ETM] ======= Start Stored Config Data =======
[ETM] Header=STM32, BoardName=Black_V407VE
[ETM] StaticIP=blank
[ETM] Start connectEthernet using DHCP
[ETM] MAC:FE-98-FD-D6-DB-BA
[ETM] Dynamic IP OK, connected
[ETM] IP:192.168.2.149
[ETM] begin:Ethernet Connected.
Connected! IP address: 192.168.2.149
Your stored Credentials :
MQTT Server = mqtt_server
Port = 1883
MQTT UserName = mqtt_user
MQTT PWD = mqtt_pass
Subs Topics = Subs
Pubs Topics = Pubs
HStop doubleResetDetecting
ClearFlag write = 0xd0d04321
HHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH
HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH
HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH
HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HCe qui suit est l'échantillon de sortie de terminal lors de l'exécution de l'exemple de STORENAMANDSURNE sur STM32H7 Nucleo-144 Nucleo_H743ZI2
Start StoreNameAndSurname on NUCLEO_H743ZI2
FlashStorage_STM32 v1 .2.0
EEPROM length: 16384
EEPROM is empty, writing WRITTEN_SIGNATURE and some example data:
Insert your name : My_Name
Insert your surname : My_Surname
<< Your name: My_Name
. Your surname: My_Surname
>> have been saved. Thank you!Start StoreNameAndSurname on NUCLEO_H743ZI2
FlashStorage_STM32 v1 .2.0
EEPROM length: 16384
Hi My_Name
My_Surname
, nice to see you again :-)
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 de l'exemple de STORENAMANDSURNAM
Start StoreNameAndSurname on NUCLEO_L552ZE_Q
FlashStorage_STM32 v1 .2.0
EEPROM length: 2048
EEPROM is empty, writing WRITTEN_SIGNATURE and some example data:
Insert your name : My_Name
Insert your surname : My_Surname
<< Your name: My_Name
. Your surname: My_Surname
>> have been saved. Thank you!Start StoreNameAndSurname on NUCLEO_L552ZE_Q
FlashStorage_STM32 v1 .2.0
EEPROM length: 2048
Hi My_Name
My_Surname
, nice to see you again :-)
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 de l'exemple de STORENAMANDSURNE sur STM32F7 Nucleo-144 Nucleo_F767ZI
Start StoreNameAndSurname on NUCLEO_F767ZI
FlashStorage_STM32 v1 .2.0
EEPROM length: 16384
EEPROM is empty, writing WRITTEN_SIGNATURE and some example data:
Insert your name : My_Name
Insert your surname : My_Surname
<< Your name: My_Name
. Your surname: My_Surname
>> have been saved. Thank you!Start StoreNameAndSurname on NUCLEO_F767ZI
FlashStorage_STM32 v1 .2.0
EEPROM length: 16384
Hi My_Name
My_Surname
, nice to see you again :-)
Clearing WRITTEN_SIGNATURE for next try
Done clearing signature in 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 STM32.
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_STM32
multiple-definitions .allman . Restyle la bibliothèqueMerci 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