Multiple Definitions链接器错误请查看如何修复Multiple Definitions链接器错误
FlashStorage_stm32f1库受到Cristian Maglie的FlashStorage的启发,它提供了一种便利的方法,可以从STM32F1/F3的非挥发性闪存中使用模拟 - EPROM存储和检索用户的数据,包括非生机的ch32f103xx,CS32F103XX,CS32F103XX,等等。
通常用于存储固件代码的闪存也可以用来存储 /检索用户的数据更多,并且比EEPROM更快。得益于缓冲的数据编写和阅读,闪光访问时间大大减少以增加闪光灯的寿命。
目前,该库支持新的STM32 Core v2.0.0和先前的STM32 Core v1.9.0
Arduino IDE 1.8.19+ for Arduino。Arduino Core for STM32 v2.3.0+ 。 最好和最简单的方法是使用Arduino Library Manager 。搜索flashstorage_stm32f1 ,然后选择 /安装最新版本。您也可以使用此链接以获取更详细的说明。
安装的另一种方法是:
FlashStorage_STM32F1-main.zip 。FlashStorage_STM32F1-main目录FlashStorage_STM32F1-main文件夹复制到arduino库的目录,例如~/Arduino/libraries/ 。对于使用LAN8720的Generic STM32F4 series板,例如STM32F407VE ,请使用STM32 Core v2.2.0作为Breaking Core v2.3.0会产生编译错误。
在某些STM32板上使用LAN8720
您必须将文件STM32F4XX_HAL_CONF_DEFAULT.H和STM32F7XX_HAL_HAL_CONF_DEFAULT.H复制到STM32 STM32 Directory(〜/.arduino15/packages/stm32/stm32/hardware/hardware/stm32/2.2.0/systep)中,以覆盖旧文件。
假设STM32 STM32核心版本为2.2.0。这些文件必须复制到目录中:
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F4xx/stm32f4xx_hal_conf_default.h for stm32f4。~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F7xx/stm32f7xx_hal_conf_default.h用于nucleo-144 stm32f7。每当安装新版本时,请记住将此文件复制到新版本目录中。例如,新版本是x.yy.zz,这些文件必须复制到相应的目录中:
~/.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).您必须修改与董事会相对应的文件,这只是一个插图。
假设STM32 STM32核心版本为2.3.0。这些文件必须复制到目录中:
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h用于nucleo-144 nucleo_f767zi。~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_L053R8/variant.h用于nucleo-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在许多文件中。但是,请确保仅在1 .h , .cpp或.ino文件中使用以下.h文件(不得包含在任何其他文件中),以避免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检查HOWTO演示的新的多胎示例。
使用src_cpp或src_h lib#80来查看不同行为的讨论
闪存的写周期数量有限。典型的闪光记忆可以在开始“磨损”之前,可以将大约10000个循环写入同一闪存块,并开始失去保留数据的能力。
因此,请当心:不当使用该库可以迅速而永久破坏您的微观的闪存,特别是您应该避免拨打put()或commit()函数,并确保在微观的一生中确保put()或commits()或commit()的次数()保持在10000的限制以下(即使是较大的数量,也可以保持较大的数量,以确保较大的数量。
包括FlashStorage_STM32F1.h ,以获得内部闪存的EEPROM仿真。
有关一个示例,请参见EmulateEprom草图。
API与众所周知的Arduino eeprom.h API非常相似,但具有4个其他功能:
EEPROM.commit()或EEPROM.put() )编写给flash一次的数据,则bool isValid()将返回true 。否则,模拟 - EPROM数据是“未定义的”,并且该函数返回false 。void commit()将EEPROM数据存储在Flash中。小心地使用此功能:每个呼叫都将完整的模拟 - EPROM数据写入闪存。这将减少剩余的闪光灯循环。不要以循环方式调用此方法,否则您会尽快杀死闪光灯。void setCommitASAP(bool value = true)设置或清除_commitASAP private变量(默认是true )。如果_commitasap为false,则呼叫EEPROM.put()不会迫使EEPROM.commit()延长闪存寿命。您必须记住要手动调用EEPROM.commit()以将模拟 - EPROM数据保存到闪存中,否则将丢失数据。bool getCommitASAP()返回_commitASAP的当前值。flashstorage_stm32f1/示例/flashstoreandretrieve/flashstoreandretrieve.ino
CB76B66中的第26至81行
以下是在sTM32F1上运行示例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 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!
===============以下是在sTM32F1 BluePill_F103C8上运行示例flashstoreanDretrieve时的样本终端输出
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以下是运行示例示例eprom_write在stm32f1 bluepill_f103c8上使用128kb 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以下是在运行示例启用STM32F1 BluePill_F103C8上的样本终端输出,带有128KB闪存
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以下是在sTM32F1上运行示例flashstoreandretrieve时的示例终端输出

| 静止 | <---> | generic_f103rctx |
|---|---|---|
| Swclk | <---> | SWCLK / PA14 |
| SWDIO | <---> | SWDIO / PA13 |
| gnd | <---> | gnd |
| 3.3V | <---> | 3.3V |
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()以存储整个结构。请参阅Storenameandsurname有关如何做的。
不使用STM32F1/F3。
否。如果您的董事会提供了一个集成的EPROM,则建议使用它,因为EEPROM的寿命更长,写周期数等)。
在没有集成的EPROM或其大小太小的情况下,对于您的用例来说,您可以使用此库将较小的闪存作为模拟EPROM,前提
如果您遇到汇编错误,则通常需要安装Arduino Board的核心版本的较新版本。
有时,只有在您使用新添加的功能时,只有将板核更新为最新版本时,库才能正常工作。
提交问题:flashstorage_stm32f1问题
EEPROM.put()和EEPROM.get()函数以读取/写入仿真 - eprommultiple-definitions链接器错误。非常感谢大家的错误报告,新功能建议,测试和为该库的开发做出贡献。
![]() 克里斯蒂安·玛格丽(Cristian Maglie) |
如果您想为这个项目做出贡献:
版权(C)2021- Khoi Hoang