Multiple Definitions链接器错误请查看如何修复Multiple Definitions链接器错误
FlashStorage_stm32库受到Cristian Maglie的FlashStorage的启发,它提供了一种使用模拟 - EPROM来存储和检索用户数据的方便方法,该方法从STM32F/L/H/H/H/G/WB/WB/MP1的非挥发性闪存中。
通常用于存储固件代码的闪存也可以用来存储 /检索用户的数据更多,并且比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_stm32 ,然后选择 /安装最新版本。您也可以使用此链接以获取更详细的说明。
安装的另一种方法是:
FlashStorage_STM32-main.zip 。FlashStorage_STM32-main目录FlashStorage_STM32-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_STM32.hpp " // https://github.com/khoih-prog/FlashStorage_STM32在许多文件中。但是,请确保仅在1 .h , .cpp或.ino文件中使用以下.h文件(不得包含在任何其他文件中),以避免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检查HOWTO演示的新的多胎示例。
使用src_cpp或src_h lib#80来查看不同行为的讨论
闪存的写周期数量有限。典型的闪光记忆可以在开始“磨损”之前,可以将大约10000个循环写入同一闪存块,并开始失去保留数据的能力。
因此,请当心:不当使用该库可以迅速而永久破坏您的微观的闪存,特别是您应该避免拨打put()或commit()函数,并确保在微观的一生中确保put()或commits()或commit()的次数()保持在10000的限制以下(即使是较大的数量,也可以保持较大的数量,以确保较大的数量。
包括FlashStorage_STM32.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的当前值。bi_ethernet_blynk
bi_ethernet_blynk_email
bi_ethernet_wm_config
lan8720_ethernet_blynk
lan8720_ethernet_blynk_email
lan8720_ethernet_wm_config
......
还有更多图书馆来了。
flashstorage_stm32/示例/storenameandsurname/storenameansurname.ino
BB0DD71中的第15至106行
以下是使用STM32F4的STM32F4 Black_F407VE在使用STM32Ethernet库的STM32F4 Black_F407VE上运行示例终端输出。
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以下是在STM32H7 Nucleo-144 nucleo_h743zi2上运行示例StorenameanDsurname时的样品终端输出
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以下是在STM32L5 Nucleo-144 nucleo_l552ze_q上运行示例StorenameanDsurname时的样品终端输出
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以下是在STM32F7 nucleo-144 nucleo_f767zi上运行示例StorenameanDermame时的样品终端输出
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()以存储整个结构。请参阅Storenameandsurname有关如何做的。
不使用STM32。
否。如果您的董事会提供了一个集成的EPROM,则建议使用它,因为EEPROM的寿命更长,写周期数等)。
在没有集成的EPROM或其大小太小的情况下,对于您的用例来说,您可以使用此库将较小的闪存作为模拟EPROM,前提
如果您遇到汇编错误,则通常需要安装Arduino Board的核心版本的较新版本。
有时,只有在您使用新添加的功能时,只有将板核更新为最新版本时,库才能正常工作。
提交问题:flashstorage_stm32问题
multiple-definitions链接器错误。allman样式添加ASTYLE。库图书馆非常感谢大家的错误报告,新功能建议,测试和为该库的开发做出贡献。
![]() 克里斯蒂安·玛格丽(Cristian Maglie) |
如果您想为这个项目做出贡献:
版权(C)2021- Khoi Hoang