Multiple Definitions Пожалуйста, посмотрите на то, чтобы исправить ошибку линкеров Multiple Definitions
Библиотека FlashStorage_stm32f1, вдохновленная Flashstorage Cristian Maglie, предоставляет удобный способ хранения и извлечения данных пользователя с использованием эмулированного-EEPROM, из нелетуальной флэш-памяти STM32F1/F3, в том числе негенюин CH32F103XX, CS32F103XX и т. Д.
Флэш -память, обычно используемая для хранения кода прошивки, также может использоваться для хранения / извлечения большего количества данных пользователя и быстрее, чем из EEPROM. Благодаря написанию и чтению буферизации , время доступа к вспышке значительно сокращается, чтобы увеличить срок службы вспышки .
В настоящее время библиотека поддерживает как новый STM32 Core v2.0.0 , так и предыдущий ядро STM32 v1.9.0
Arduino IDE 1.8.19+ для Arduino.Arduino Core for STM32 v2.3.0+ для плат STM32. Лучший и самый простой способ - использовать Arduino Library Manager . Поиск flashstorage_stm32f1 , затем выберите / установите последнюю версию. Вы также можете использовать эту ссылку для более подробных инструкций.
Другой способ установить - это:
FlashStorage_STM32F1-main.zip .FlashStorage_STM32F1-mainFlashStorage_STM32F1-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_STM32F1.hpp " // https://github.com/khoih-prog/FlashStorage_STM32F1 во многих файлах. Multiple Definitions обязательно используйте следующий файл .h только .h .ino .cpp
// 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 Проверьте новый пример многофилепроекта для демонстрации HOWTO .
Посмотрите на обсуждение в различном поведении, используя SRC_CPP или SRC_H LIB #80
Флэш -память имеет ограниченное количество циклов записи. Типичные воспоминания о вспышке могут выполнить около 10000 записей циклов в тот же флеш -блок, прежде чем начать «износить» и начать терять способность сохранять данные.
Так что будьте осторожны: ненадлежащее использование этой библиотеки может быстро и навсегда уничтожить флэш-память о вашем микроавтографии , в частности, вам следует избегать того, чтобы вы могли вызвать функции put() или commit() слишком часто и убедиться, что на протяжении всей жизни Micro количество вызовов put() или commit() остается намного ниже вышеуказанного предела 10000 (это хорошее правило правила, которое сохраняет это число, даже если производители, гарантирующие, если производители, не имеют номера, если производители номеров в гости.
Включите FlashStorage_STM32F1.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 .Flashstorage_stm32f1/Примеры/FlashstoreAndretrieve/FlashstoreAndretrieve.ino
Строки с 26 до 81 в CB76B66
Ниже приведен выводный вывод терминала при запуске примера eEPROM_GET на STM32F1 BLUEPILL_F103C8 с 64 -километровой вспышкой
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!
===============Ниже приведен выводный вывод терминала при запуске примера FlashstoreAndretrieve на STM32F1 bluepill_f103c8 с 64 -километровой вспышкой.
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 nowНиже приведен выводный вывод терминала при запуске примера eEPROM_WRITE на STM32F1 BLUEPILL_F103C8 с помощью 128 КБ 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) = 0Ниже приведен выводный вывод терминала при запуске примера Emulateeprom на STM32F1 Bluepill_f103C8 с 128 КБ вспышкой
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 nowНиже приведен выводный вывод терминала при запуске примера FlashStoreAndretrieve на STM32F1 Generic_f103RCTX с 2564KB Flash

| Stlink | <---> | Generic_f103rctx |
|---|---|---|
| Swclk | <---> | SWCLK / PA14 |
| SWDIO | <---> | SWDIO / PA13 |
| Гнездо | <---> | Гнездо |
| 3,3 В. | <---> | 3,3 В. |
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 Да, вы можете объявить struct с большим количеством полей и вызвать EEPROM.put() для хранения всей структуры. Посмотрите на StorenameandRsurname, как это сделать.
Не с STM32F1/F3.
Нет. Если ваша доска предоставляет интегрированный-эпох, желательно использовать это, потому что EEPROM имеет более длительное время жизни, количество циклов записи и т. Д.).
В отсутствие интегрированного эпоха или его размера слишком мал для вашего варианта использования, вы можете использовать эту библиотеку для использования небольшой порционной флэш-памяти в качестве эмулированного-эв.
Если вы получаете ошибки компиляции, чаще всего вам может потребоваться установить более новую версию Core для Arduino Poards.
Иногда библиотека будет работать только в том случае, если вы обновляете ядро платы до последней версии, потому что я использую недавно добавленные функции.
Отправить проблемы: Flashstorage_stm32f1.
EEPROM.put() и EEPROM.get() функционирует для чтения/записи всей структуры в эмулированном эпохеmultiple-definitions линкера.Большое спасибо всем за отчет о ошибках, новую функцию, предлагающую, тестирование и внесение вклад в разработку этой библиотеки.
![]() Кристиан Магли |
Если вы хотите внести свой вклад в этот проект:
Авторские права (C) 2021- Khoi Hoang