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