Multiple Definitions kesalahan linker Harap lihat HowTo Fix Multiple Definitions kesalahan tautan
Perpustakaan FlashStorage_STM32, yang terinspirasi oleh FlashStorage Cristian Maglie, menyediakan cara yang nyaman untuk menyimpan dan mengambil data pengguna menggunakan EEEPROM yang ditiru, dari memori flash non-volatile dari STM32F/L/H/G/WB/MP1.
Memori flash, umumnya digunakan untuk menyimpan kode firmware, juga dapat digunakan untuk menyimpan / mengambil lebih banyak data pengguna dan lebih cepat dari EEPROM. Berkat penulisan dan membaca data buffered , waktu akses flash sangat dikurangi untuk meningkatkan kehidupan flash .
Saat ini, perpustakaan mendukung baik STM32 Core V2.0.0+ baru dan STM32 Core V1.9.0- sebelumnya
Arduino IDE 1.8.19+ untuk Arduino.Arduino Core for STM32 v2.3.0+ untuk papan STM32. Cara terbaik dan termudah adalah dengan menggunakan Arduino Library Manager . Cari FlashStorage_STM32 , lalu pilih / instal versi terbaru. Anda juga dapat menggunakan tautan ini untuk instruksi yang lebih rinci.
Cara lain untuk menginstal adalah dengan:
FlashStorage_STM32-main.zip .FlashStorage_STM32-mainFlashStorage_STM32-main ke direktori Arduino Libraries seperti ~/Arduino/libraries/ . Untuk papan Generic STM32F4 series , seperti STM32F407VE , menggunakan LAN8720 , silakan gunakan STM32 Core v2.2.0 sebagai Breaking Core v2.3.0 membuat kesalahan kompilasi.
Untuk menggunakan LAN8720 di beberapa papan STM32
Anda harus menyalin file stm32f4xx_hal_conf_default.h dan stm32f7xx_hal_conf_default.h ke dalam direktori STM32 (~/.arduino15/paket/stm32/perangkat keras/stm32/2.2.0/sistem) untuk melebihi file lama.
Misalkan versi inti STM32 STM32 adalah 2.2.0. File -file ini harus disalin ke direktori:
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F4xx/stm32f4xx_hal_conf_default.h untuk stm32f4.~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F7xx/stm32f7xx_hal_conf_default.h untuk nucleo-144 STM32F7.Setiap kali versi baru diinstal, ingatlah untuk menyalin file ini ke direktori versi baru. Misalnya, versi baru adalah x.yy.zz, file -file ini harus disalin ke direktori yang sesuai:
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F4xx/stm32f4xx_hal_conf_default.hUntuk menggunakan serial1 pada beberapa papan STM32 tanpa definisi serial1 (nucleo-144 nucleo_f767zi, nucleo-64 nucleo_l053r8, dll.) Papan , Anda harus menyalin file stm32. Anda harus memodifikasi file yang sesuai dengan papan Anda, ini hanya ilustrasi bagaimana melakukannya.
Misalkan versi inti STM32 STM32 adalah 2.3.0. File -file ini harus disalin ke direktori:
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h untuk nucleo-144 nucleo_f767zi.~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_L053R8/variant.h untuk nucleo-64 nucleo_l053r8.Setiap kali versi baru diinstal, ingatlah untuk menyalin file ini ke direktori versi baru. Misalnya, versi baru adalah x.yy.zz, file -file ini harus disalin ke direktori yang sesuai:
~/.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 kesalahan linker Implementasi pustaka saat ini, menggunakan xyz-Impl.h alih-alih standar xyz.cpp , mungkin membuat kesalahan penghubung Multiple Definitions tertentu dalam kasus penggunaan tertentu.
Anda dapat memasukkan file .hpp ini
// Can be included as many times as necessary, without `Multiple Definitions` Linker Error
# include " FlashStorage_STM32.hpp " // https://github.com/khoih-prog/FlashStorage_STM32 di banyak file. Tetapi pastikan untuk menggunakan file .h berikut hanya dalam 1 .h , .cpp atau file .ino , yang tidak boleh dimasukkan dalam file lain , untuk menghindari kesalahan tautan 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 Periksa contoh multifileproject baru untuk demo HOWTO .
Lihat diskusi dalam perilaku yang berbeda menggunakan SRC_CPP atau SRC_H LIB #80
Memori flash memiliki siklus tulis dalam jumlah terbatas. Kenangan flash yang khas dapat melakukan sekitar 10.000 menulis siklus ke blok flash yang sama sebelum mulai "aus" dan mulai kehilangan kemampuan untuk menyimpan data.
Jadi berhati-hatilah: Penggunaan perpustakaan ini yang tidak tepat dapat dengan cepat dan permanen menghancurkan memori flash mikro Anda , khususnya Anda harus menghindari untuk memanggil fungsi put() atau commit() terlalu sering dan memastikan bahwa dalam seluruh kehidupan mikro jumlah panggilan untuk put() atau commit() tetap di bawah batas mikro (itu adalah aturan yang baik dari rule-of-thumb untuk menjaga angka di dalam pikiran bahkan.
Sertakan FlashStorage_STM32.h untuk mendapatkan emulasi EEPROM dengan memori flash internal.
Lihat sketsa emulateEeprom untuk contoh.
API sangat mirip dengan Arduino Eeprom.h API yang terkenal tetapi dengan 4 fungsi tambahan:
bool isValid() mengembalikan true jika data dalam emulated-eeprom valid (data yang ditulis untuk berkedip setidaknya sekali oleh EEPROM.commit() atau EEPROM.put() ). Jika tidak, data yang ditiru-eeprom "tidak ditentukan" dan fungsi mengembalikan false .void commit() Simpan data EEPROM di Flash. Gunakan ini dengan hati-hati: Setiap panggilan menulis data Imulated-Eeprom lengkap untuk berkedip. Ini akan mengurangi sisa siklus flash-write. Jangan sebut metode ini dalam satu loop atau Anda akan segera membunuh flash Anda.void setCommitASAP(bool value = true) untuk mengatur atau menghapus variabel pribadi _commitASAP (default adalah true untuk aman). Jika _CommitaSap salah, panggilan ke EEPROM.put() tidak akan memaksa EEPROM.commit() untuk memperpanjang masa pakai flash. Anda harus ingat untuk menghubungi EEPROM.commit() secara manual untuk menyimpan data yang ditiru-eeprom ke dalam flash atau data akan hilang.bool getCommitASAP() untuk mengembalikan nilai _commitASAP saat ini.Bi_ethernet_blynk
Bi_ethernet_blynk_email
Bi_ethernet_wm_config
Lan8720_ethernet_blynk
Lan8720_ethernet_blynk_email
Lan8720_ethernet_wm_config
......
Dan banyak lagi ke perpustakaan datang.
FlashStorage_STM32/Contoh/StoreneAmeAndSurname/StoreneAmeAndSurname.ino
Baris 15 hingga 106 di BB0DD71
Berikut ini adalah output terminal sampel saat menjalankan contoh ethernet_stm32_lan8720 pada stm32f4 black_f407ve dengan lan8720 ethernet menggunakan pustaka stm32ethernet.
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 HBerikut ini adalah output terminal sampel saat menjalankan contoh storeAneAndSurname di STM32H7 Nucleo-144 Nucleo_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 nowBerikut ini adalah output terminal sampel saat menjalankan contoh storeneMeAndSurname pada stm32l5 nucleo-144 nucleo_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 nowBerikut ini adalah output terminal sampel saat menjalankan contoh storeeneAndSurname pada stm32f7 nucleo-144 nucleo_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 Ya, Anda dapat mendeklarasikan struct dengan lebih banyak bidang dan memanggil EEPROM.put() untuk menyimpan seluruh struktur. Lihat Nama StorenAeMeAndSURN untuk cara melakukannya.
Tidak dengan STM32.
Tidak. Jika dewan Anda menyediakan eeprom terintegrasi, disarankan untuk menggunakannya karena EEPROM memiliki masa hidup yang lebih lama, jumlah siklus tulis, dll.).
Dengan tidak adanya eeprom terintegrasi atau ukurannya terlalu kecil untuk kasus penggunaan Anda, Anda dapat menggunakan perpustakaan ini untuk menggunakan memori flash porsi kecil sebagai yang ditiru-eeprom, asalkan Anda mengingat batas-batasnya seperti dalam jumlah tertulis yang terbatas dalam jumlah terbatas yang terbatas
Jika Anda mendapatkan kesalahan kompilasi, lebih sering daripada tidak, Anda mungkin perlu menginstal versi inti yang lebih baru untuk papan Arduino.
Terkadang, perpustakaan hanya akan berfungsi jika Anda memperbarui inti papan ke versi terbaru karena saya menggunakan fungsi yang baru ditambahkan.
Kirimkan masalah ke: Masalah FlashStorage_STM32
multiple-definitions .allman . Kembalilah kembali perpustakaanTerima kasih banyak untuk semua orang atas pelaporan bug, fitur baru yang menyarankan, menguji dan berkontribusi pada pengembangan perpustakaan ini.
![]() Cristian Maglie |
Jika Anda ingin berkontribusi pada proyek ini:
Hak Cipta (C) 2021- Khoi Hoang