Multiple Definitions Пожалуйста, посмотрите на то, чтобы исправить ошибку линкеров Multiple Definitions
Библиотека FlashStorage_stm32, вдохновленная Flashstorage Cristian Maglie, предоставляет удобный способ хранения и извлечения данных пользователя с использованием эмулированного EEPROM, из нелетучивой флэш-памяти STM32F/L/H/G/WB/MP1.
Флэш -память, обычно используемая для хранения кода прошивки, также может использоваться для хранения / извлечения большего количества данных пользователя и быстрее, чем из EEPROM. Благодаря написанию и чтению буферизации , время доступа к вспышке значительно сокращается, чтобы увеличить срок службы вспышки .
В настоящее время библиотека поддерживает как новый STM32 Core v2.0.0+ , так и предыдущий STM32 Core v1.9.0-
Arduino IDE 1.8.19+ для Arduino.Arduino Core for STM32 v2.3.0+ для плат STM32. Лучший и самый простой способ - использовать Arduino Library Manager . Поиск flashstorage_stm32 , затем выберите / установите последнюю версию. Вы также можете использовать эту ссылку для более подробных инструкций.
Другой способ установить - это:
FlashStorage_STM32-main.zip .FlashStorage_STM32-mainFlashStorage_STM32-main в каталог библиотек Arduino, такой как ~/Arduino/libraries/ . Для Generic STM32F4 series , таких как STM32F407VE , с использованием LAN8720 , используйте STM32 Core v2.2.0 , так как нарушающий ядро v2.3.0 создает ошибку компиляции.
Использовать LAN8720 на некоторых досках STM32
Вы должны скопировать файлы stm32f4xx_hal_conf_default.h и stm32f7xx_hal_conf_default.h в каталог STM32 STM32 (~/.arduino15/packages/stm32/warmware/stm32/2.2.0/system), чтобы перевернуть старые файлы.
Предположим, что основная версия STM32 STM32 составляет 2.2.0. Эти файлы должны быть скопированы в каталог:
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F4xx/stm32f4xx_hal_conf_default.h для STM32F4.~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F7xx/stm32f7xx_hal_conf_default.h для ucleo-144 STM32F7.Всякий раз, когда установлена новая версия, не забудьте скопировать этот файл в новый каталог версий. Например, новая версия - x.yy.zz, эти файлы должны быть скопированы в соответствующий каталог:
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F4xx/stm32f4xx_hal_conf_default.hЧтобы использовать Serial1 на некоторых платах STM32 без определения последовательного1 (ucleo-144 ucleo_f767zi, nucleo-64 ucleo_l053r8 и т. Д.) , Вы должны скопировать файлы stm32 variant.h intm32 stm32). Вы должны изменить файлы, соответствующие вашим доскам, это просто иллюстрация, как сделать.
Предположим, что основная версия STM32 STM32 составляет 2.3.0. Эти файлы должны быть скопированы в каталог:
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h для ucleo-144 ucleo_f767zi.~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_L053R8/variant.h для нуклео-64 nucleo_l053r8.Всякий раз, когда установлена новая версия, не забудьте скопировать этот файл в новый каталог версий. Например, новая версия - x.yy.zz, эти файлы должны быть скопированы в соответствующий каталог:
~/.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 Текущая реализация библиотеки с использованием xyz-Impl.h вместо стандартной xyz.cpp , возможно, создает определенные ошибки линкера Multiple Definitions в определенных вариантах использования.
Вы можете включить этот файл .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 во многих файлах. Multiple Definitions обязательно используйте следующий файл .h только .h .ino .cpp
// 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 Проверьте новый пример многофилепроекта для демонстрации HOWTO .
Посмотрите на обсуждение в различном поведении, используя SRC_CPP или SRC_H LIB #80
Флэш -память имеет ограниченное количество циклов записи. Типичные воспоминания о вспышке могут выполнить около 10000 записей циклов в тот же флеш -блок, прежде чем начать «износить» и начать терять способность сохранять данные.
Так что будьте осторожны: ненадлежащее использование этой библиотеки может быстро и навсегда уничтожить флэш-память о вашем микроавтографии , в частности, вам следует избегать того, чтобы вы могли вызвать функции put() или commit() слишком часто и убедиться, что на протяжении всей жизни Micro количество вызовов put() или commit() остается намного ниже вышеуказанного предела 10000 (это хорошее правило правила, которое сохраняет это число, даже если производители, гарантирующие, если производители, не имеют номера, если производители номеров в гости.
Включите FlashStorage_STM32.h , чтобы получить эмуляцию EEPROM с внутренней флэш -памятью.
Смотрите эмулят -эскиз для примера.
API очень похож на хорошо известный ARDUINO EEPROM.H API, но с 4 дополнительными функциями:
bool isValid() возвращает true если данные в эмулированном и-эпоме действительны (данные, записанные для вспышки, по крайней мере, один раз EEPROM.commit() или EEPROM.put() ). В противном случае данные эмулированного-эврома «не определены», а функция возвращает false .void commit() сохранить данные eEPROM во флэш -памяти. Используйте это с осторожностью: каждый вызов записывает полные данные об эмулированном эпохе для вспышки. Это уменьшит оставшиеся флеш-записи. Не называйте этот метод в цикле, иначе вы скоро убьете свою вспышку.void setCommitASAP(bool value = true) для установки или очистки частной переменной _commitASAP (по умолчанию true , чтобы быть безопасным). Если _commitasap является ложным, вызов EEPROM.put() не заставит EEPROM.commit() продлить срок службы вспышки. Вам придется помнить, что вы можете позвонить EEPROM.commit() вручную, чтобы сохранить данные эмулированного иэпром во флэш-память, или данные будут потеряны.bool getCommitASAP() для возврата текущего значения _commitASAP .Bi_ethernet_blynk
Bi_ethernet_blynk_email
Bi_ethernet_wm_config
Lan8720_ethernet_blynk
Lan8720_ethernet_blynk_email
Lan8720_ethernet_wm_config
......
и многое другое в библиотеках приходит.
Flashstorage_stm32/Примеры/StorenameandRsurname/StorenameandResurname.ino
Строки с 15 по 106 в BB0DD71
Ниже приведен выводный вывод терминала при запуске примера Ethernet_stm32_lan8720 на STM32F4 Black_f407Ve с LAN8720 Ethernet с использованием библиотеки STM32HERTENTET.
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 HНиже приведен выводный вывод терминала при запуске примера StorenameanderName на STM32H7 Nucleo-144 ucleo_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 nowНиже приведен выводный вывод терминала при запуске примера StorenameandResname на STM32L5 Nucleo-144 ucleo_l552ze_q
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 nowНиже приведен выводный вывод терминала при запуске примера StorenameandRyname на STM32F7 Nucleo-144 ucleo_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 Да, вы можете объявить struct с большим количеством полей и вызвать EEPROM.put() для хранения всей структуры. Посмотрите на StorenameandRsurname, как это сделать.
Не с STM32.
Нет. Если ваша доска предоставляет интегрированный-эпох, желательно использовать это, потому что EEPROM имеет более длительное время жизни, количество циклов записи и т. Д.).
В отсутствие интегрированного эпоха или его размера слишком мал для вашего варианта использования, вы можете использовать эту библиотеку для использования небольшой порционной флэш-памяти в качестве эмулированного-эв.
Если вы получаете ошибки компиляции, чаще всего вам может потребоваться установить более новую версию Core для Arduino Poards.
Иногда библиотека будет работать только в том случае, если вы обновляете ядро платы до последней версии, потому что я использую недавно добавленные функции.
Отправить проблемы: Flashstorage_stm32.
multiple-definitions линкера.allman . Респартамент библиотекаБольшое спасибо всем за отчет о ошибках, новую функцию, предлагающую, тестирование и внесение вклад в разработку этой библиотеки.
![]() Кристиан Магли |
Если вы хотите внести свой вклад в этот проект:
Авторские права (C) 2021- Khoi Hoang