Multiple Definitions يرجى إلقاء نظرة على HOWTO Multiple Definitions
توفر مكتبة FlashStorage_Stm32F1 ، المستوحاة من Cristian Maglie's FlashStorage ، وسيلة مريحة لتخزين واسترداد بيانات المستخدم باستخدام محاكاة الأوبروم ، من ذاكرة الفلاش غير المتطايرة للمسلسلات STM32F1/F3 ، بما في ذلك لوحات CH32F103xx غير المتطايرة ، إلخ.
يمكن أيضًا استخدام ذاكرة الفلاش ، التي تستخدم عمومًا لتخزين رمز البرامج الثابتة ، لتخزين / استرداد بيانات المستخدم وأسرع من EEPROM. بفضل كتابة البيانات والقراءة المخزنة ، يتم تقليل وقت الوصول إلى حد كبير لزيادة عمر الفلاش .
حاليًا ، تدعم المكتبة كلاً من STM32 Core V2.0.0 و STM32 Core V1.9.0 السابقة
Arduino IDE 1.8.19+ لأردوينو.Arduino Core for STM32 v2.3.0+ لألواح STM32. أفضل وأسهل طريقة هي استخدام Arduino Library Manager . ابحث عن FlashStorage_Stm32F1 ، ثم حدد / تثبيت أحدث إصدار. يمكنك أيضًا استخدام هذا الرابط لمزيد من التعليمات التفصيلية.
طريقة أخرى للتثبيت هي:
FlashStorage_STM32F1-main.zip .FlashStorage_STM32F1-mainFlashStorage_STM32F1-main بالكامل إلى دليل مكتبات Arduino مثل ~/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/HARETWARE/STM32/2.2.0/SYSTEM) لإفراط في كتابة الملفات القديمة.
لنفترض أن الإصدار الأساسي 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 for nucleo-144 STM32F7.كلما تم تثبيت إصدار جديد ، تذكر نسخ هذا الملف إلى دليل الإصدار الجديد. على سبيل المثال ، الإصدار الجديد هو x.yy.zz ، يجب نسخ هذه الملفات في الدليل المقابل:
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F4xx/stm32f4xx_hal_conf_default.hلاستخدام Serial1 على بعض لوحات STM32 بدون تعريف Serial1 (Nucleo-144 Nucleo_f767zi ، Nucleo-64 Nucleo_L053R8 ، إلخ) ، يجب عليك نسخ ملفات STM32/STM32/STM32/STM32. يجب عليك تعديل الملفات المقابلة لألواحك ، وهذا مجرد توضيح كيفية القيام به.
لنفترض أن الإصدار الأساسي STM32 STM32 هو 2.3.0. يجب نسخ هذه الملفات في الدليل:
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h for nucleo-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 التالي Multiple Definitions .ino 1 .h .cpp
// 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() أو commit() تبقى أقل بكثير من الحد الأقصى المذكور من 10000 (إنها قاعدة جيدة للبلاغ.
قم بتضمين FlashStorage_STM32F1.h للحصول على مضاهاة EEPROM مع ذاكرة الفلاش الداخلية.
انظر SHENEPEEPROM رسم للحصول على مثال.
تشبه واجهة برمجة التطبيقات إلى حد كبير API Arduino Eeprom.H المعروفة ولكن مع 4 وظائف إضافية:
bool isValid() true إذا كانت البيانات الموجودة في eperrom محاكاة صالحة (البيانات المكتوبة إلى Flash مرة واحدة على الأقل بواسطة EEPROM.commit() أو EEPROM.put() ). بخلاف ذلك ، فإن بيانات الأوبوبية المحاكاة "غير محددة" وإرجاع الوظيفة false .void commit() تخزين بيانات EEPROM في فلاش. استخدم هذا بعناية: كل مكالمة تكتب بيانات الكاملة المحاكاة للمحاكاة. هذا سوف يقلل من الدراجات النامية الفلاش المتبقية. لا تسمي هذه الطريقة في حلقة أو ستقتل فلاشك قريبًا.void setCommitASAP(bool value = true) لتعيين أو مسح المتغير الخاص _commitASAP ( true هو أن يكون آمنًا). إذا كانت _CommitasAP خاطئة ، فلن تجبر الدعوة إلى EEPROM.put() EEPROM.commit() على تمديد عمر الفلاش. يجب أن تتذكر الاتصال بـ EEPROM.commit() يدويًا لحفظ بيانات الأوبووم المحاكاة في فلاش أو سيتم فقدان البيانات.bool getCommitASAP() لإرجاع القيمة الحالية لـ _commitASAP .FlashStorage_Stm32f1/أمثلة/FlashStoreAndrieve/FlashStoreanDreetrieve.ino
الخطوط 26 إلى 81 في CB76B66
فيما يلي عينة الإخراج الطرفي عند تشغيل مثال EEPROM_GET على STM32F1 Bluepill_F103C8 مع فلاش 64 كيلو بايت
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!
===============فيما يلي إخراج طرفية عينة عند تشغيل مثال FlashStoreAndRetrieve على STM32F1 Bluepill_F103C8 مع فلاش 64 كيلو بايت
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 مع فلاش 128 كيلو بايت
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فيما يلي إخراج طرفي العينة عند تشغيل مثال على ذلك
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فيما يلي إخراج طرفي العينة عند تشغيل مثال FlashStoreanDreerive على STM32F1 Generic_F103RCTX مع فلاش 2564 كيلو بايت

| 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() لتخزين الهيكل بأكمله. رؤية storenamaelsurname لكيفية القيام بذلك.
ليس مع STM32F1/F3.
لا. إذا كان مجلس الإدارة الخاص بك يوفر مجموعة متكاملة ، فمن المستحسن استخدام ذلك لأن EEPROM لديها عمر أطول ، وعدد دورات الكتابة ، وما إلى ذلك).
في حالة عدم وجود eeprom متكامل أو حجمه صغير جدًا بالنسبة لحالة الاستخدام الخاصة بك ، يمكنك استخدام هذه المكتبة لاستخدام ذاكرة فلاش صغيرة مثل المحاكاة ، شريطة أن تضع في اعتبارك الحدود كما هو الحال في عدد محدود من الكتابة
إذا حصلت على أخطاء في التجميع ، في أكثر الأحيان ، قد تحتاج إلى تثبيت إصدار أحدث من جوهر لوحات Arduino.
في بعض الأحيان ، ستعمل المكتبة فقط إذا قمت بتحديث Core Board إلى أحدث إصدار لأنني أستخدم الوظائف المضافة حديثًا.
إرسال المشكلات إلى: مشكلات flashstorage_stm32f1
EEPROM.put() و EEPROM.get() لقراءة/كتابة البنية بأكملها في eletisted-peeprommultiple-definitions .شكراً جزيلاً للجميع على الإبلاغ عن الأخطاء ، ميزة جديدة تقترح واختبار ومساهمة في تطوير هذه المكتبة.
![]() كريستيان ماجلي |
إذا كنت تريد المساهمة في هذا المشروع:
حقوق الطبع والنشر (ج) 2021- خوي هوانغ