Multiple Definitions จำกัดความของตัวเชื่อมโยง โปรดดูวิธีแก้ไข Multiple Definitions จำกัดความของ linker
ไลบรารี FlashStorage_STM32F1 ซึ่งได้รับแรงบันดาลใจจาก FlashStorage ของ Cristian Maglie เป็นวิธีที่สะดวกในการจัดเก็บและดึงข้อมูลของผู้ใช้โดยใช้ Emulated-EEPROM จากหน่วยความจำแฟลชที่ไม่ระเหยของ STM32F1/F3
หน่วยความจำแฟลชโดยทั่วไปใช้ในการจัดเก็บรหัสเฟิร์มแวร์สามารถใช้ในการจัดเก็บ / ดึงข้อมูลของผู้ใช้มากขึ้นและเร็วกว่าจาก EEPROM ต้องขอบคุณ การเขียนและการอ่านข้อมูลบัฟเฟอร์ เวลาการเข้าถึงแฟลชจะลดลงอย่างมากเพื่อ เพิ่มอายุการใช้งานของแฟลช
ปัจจุบันห้องสมุดรองรับทั้ง STM32 Core V2.0.0 ใหม่และ STM32 Core V1.9.0 ก่อนหน้า
Arduino IDE 1.8.19+ สำหรับ ArduinoArduino Core for STM32 v2.3.0+ สำหรับบอร์ด STM32 วิธีที่ดีที่สุดและง่ายที่สุดคือใช้ Arduino Library Manager ค้นหา flashstorage_stm32f1 จากนั้นเลือก / ติดตั้งเวอร์ชันล่าสุด คุณยังสามารถใช้ลิงค์นี้สำหรับคำแนะนำโดยละเอียดเพิ่มเติม
อีกวิธีในการติดตั้งคือ:
FlashStorage_STM32F1-main.zipFlashStorage_STM32F1-mainFlashStorage_STM32F1-main ไปยังไดเรกทอรี Arduino Libraries 'เช่น ~/Arduino/libraries/ สำหรับบอร์ด Generic STM32F4 series เช่น STM32F407VE โดยใช้ LAN8720 โปรดใช้ STM32 CORE v2.2.0 เป็น Breaking Core v2.3.0 สร้างข้อผิดพลาดในการรวบรวม
เพื่อใช้ LAN8720 บนกระดาน STM32 บางตัว
คุณต้องคัดลอกไฟล์ STM32F4XX_HAL_CONF_DEFAULT.H และ STM32F7XX_HAL_CONF_DEFAULT.H ลงในไดเรกทอรี STM32 STM32 (~/.ARDUINO15/PACKAGES/STM32/ฮาร์ดแวร์/STM32/2.2.0/SYSTEC)
สมมติว่ารุ่น Core 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 สำหรับนิวเคลียส -144 STM32F7เมื่อใดก็ตามที่ติดตั้งเวอร์ชันใหม่อย่าลืมคัดลอกไฟล์นี้ลงในไดเรกทอรีเวอร์ชันใหม่ ตัวอย่างเช่นเวอร์ชันใหม่คือ x.yy.zz ไฟล์เหล่านี้จะต้องถูกคัดลอกไปยังไดเรกทอรีที่เกี่ยวข้อง:
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F4xx/stm32f4xx_hal_conf_default.hในการใช้ serial1 บนกระดาน STM32 บางตัวโดยไม่มีคำจำกัดความ serial1 (นิวเคลียส -144 nucleo_f767zi, นิวเคลียส -64 nucleo_l053r8, ฯลฯ ) บอร์ด คุณต้องคัดลอกไฟล์ STM32/stm32) คุณต้องแก้ไขไฟล์ที่สอดคล้องกับบอร์ดของคุณนี่เป็นเพียงภาพประกอบวิธีการทำ
สมมติว่ารุ่น Core STM32 STM32 คือ 2.3.0 ไฟล์เหล่านี้จะต้องถูกคัดลอกลงในไดเรกทอรี:
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h สำหรับนิวเคลียส -144 NucleO_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 ในหลาย ๆ ไฟล์ แต่อย่าลืมใช้ไฟล์ .h ต่อไปนี้ ในไฟล์เพียง 1 .h , .cpp หรือ .ino ซึ่งจะต้อง ไม่รวมอยู่ในไฟล์อื่น 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 ตรวจสอบตัวอย่าง MultifileProject ใหม่สำหรับการสาธิต HOWTO
ดูการอภิปรายในพฤติกรรมที่แตกต่างกันโดยใช้ src_cpp หรือ src_h lib #80
หน่วยความจำแฟลชมีรอบการเขียนจำนวน จำกัด ความทรงจำของแฟลชทั่วไปสามารถดำเนินการประมาณ 10,000 เขียนวัฏจักรไปยังบล็อกแฟลชเดียวกันก่อนที่จะเริ่ม "เสื่อมสภาพ" และเริ่มสูญเสียความสามารถในการเก็บข้อมูล
ดังนั้น ระวัง: การใช้ห้องสมุดนี้อย่างไม่เหมาะสมสามารถทำลายหน่วยความจำแฟลชของไมโครของคุณได้อย่างรวดเร็วและถาวร โดยเฉพาะอย่างยิ่งคุณควรหลีกเลี่ยงการเรียก put() put() commit() commit() เกินไปและตรวจสอบให้แน่ใจว่าในชีวิตทั้งหมดของไมโครจำนวนการโทร ()
รวม FlashStorage_STM32F1.h เพื่อรับการจำลอง EEPROM ด้วยหน่วยความจำแฟลชภายใน
ดูตัวอย่าง Emulateeeprom สำหรับตัวอย่าง
API นั้นคล้ายกับ Arduino Eeprom.h API ที่รู้จักกันดีมาก แต่มี 4 ฟังก์ชั่นเพิ่มเติม:
bool isValid() ส่งคืน true ถ้าข้อมูลใน emulated-eEprom นั้นถูกต้อง (ข้อมูลที่เขียนเพื่อแฟลชอย่างน้อยหนึ่งครั้งโดย EEPROM.commit() หรือ EEPROM.put() ) ข้อมูล emulated-eeprom เป็น "ไม่ได้กำหนด" และฟังก์ชั่นส่งคืน falsevoid commit() เก็บข้อมูล EEPROM ใน Flash ใช้สิ่งนี้ด้วยความระมัดระวัง: การโทรทุกครั้งจะเขียนข้อมูลที่สมบูรณ์แบบ-EEPROM เพื่อแฟลช สิ่งนี้จะช่วยลดการเขียนแฟลช-เขียนวารสารที่เหลืออยู่ อย่าเรียกวิธีการนี้ในวงวนหรือคุณจะฆ่าแฟลชของคุณเร็ว ๆ นี้void setCommitASAP(bool value = true) เพื่อตั้งค่าหรือล้างตัวแปรส่วนตัว _commitASAP (ค่าเริ่มต้นเป็น true เพื่อความปลอดภัย) หาก _commitasap เป็นเท็จการเรียกใช้ EEPROM.put() จะไม่บังคับ EEPROM.commit() เพื่อยืดอายุแฟลช คุณจะต้องจำไว้ว่าให้โทร EEPROM.commit() ด้วยตนเองเพื่อบันทึกข้อมูล EMOULD-EEPROM ลงในแฟลชหรือข้อมูลจะหายไปbool getCommitASAP() เพื่อส่งคืนค่าปัจจุบันของ _commitASAPflashstorage_stm32f1/ตัวอย่าง/flashstoreandretrieve/flashstoreandretrieve.ino
บรรทัดที่ 26 ถึง 81 ใน CB76B66
ต่อไปนี้เป็นเอาต์พุตเทอร์มินัลตัวอย่างเมื่อเรียกใช้ตัวอย่าง eEPROM_GET บน STM32F1 BluePill_F103C8 พร้อมแฟลช 64KB
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!
===============ต่อไปนี้เป็นเอาต์พุตเทอร์มินัลตัวอย่างเมื่อเรียกใช้ตัวอย่าง flashstoreandretreive บน stm32f1 bluepill_f103c8 พร้อมแฟลช 64kb
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 พร้อมแฟลช 128KB
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ต่อไปนี้เป็นเอาต์พุตเทอร์มินัลตัวอย่างเมื่อเรียกใช้ตัวอย่าง emulatedeeprom บน 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ต่อไปนี้เป็นเอาต์พุตเทอร์มินัลตัวอย่างเมื่อเรียกใช้ตัวอย่าง flashstoreedretrief บน stm32f1 generic_f103rctx พร้อมแฟลช 2564kb

| stlink | - | 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
ไม่ได้หากคณะกรรมการของคุณมีการรวมเข้าด้วยกันขอแนะนำให้ใช้สิ่งนั้นเนื่องจาก EEPROM มีอายุการใช้งานนานขึ้นจำนวนวัฏจักรการเขียน ฯลฯ )
ในกรณีที่ไม่มีตัวตนแบบรวมหรือขนาดเล็กเกินไปสำหรับกรณีการใช้งานของคุณคุณสามารถใช้ไลบรารีนี้เพื่อใช้หน่วยความจำแฟลชส่วนเล็ก
หากคุณได้รับข้อผิดพลาดในการรวบรวมบ่อยกว่านั้นคุณอาจต้องติดตั้ง Core รุ่นใหม่สำหรับบอร์ด Arduino
บางครั้งไลบรารีจะทำงานได้ก็ต่อเมื่อคุณอัปเดตแกนบอร์ดเป็นเวอร์ชันล่าสุดเพราะฉันใช้ฟังก์ชั่นที่เพิ่มขึ้นใหม่
ส่งปัญหาไปที่: ปัญหา flashstorage_stm32f1
EEPROM.put() และ EEPROM.get() เพื่ออ่าน/เขียนโครงสร้างทั้งหมดใน emulated-eeprommultiple-definitionsขอบคุณมากสำหรับทุกคนสำหรับการรายงานข้อผิดพลาดคุณลักษณะใหม่ที่แนะนำการทดสอบและมีส่วนร่วมในการพัฒนาห้องสมุดนี้
![]() Cristian Maglie |
หากคุณต้องการมีส่วนร่วมในโครงการนี้:
ลิขสิทธิ์ (c) 2021- Khoi Hoang