تبدیل حافظه FLASH میکروکنترلرهای STM32 به EEPROM

blog
۱۳۹۸-۰۳-۰۱
6 دقیقه

خیلی وقتها ما نیاز داریم متغیرهای داخل برنامه میکروکنترلر که داریم با قطع برق از بین نرند!
چاره چیه؟
راحت ترین روش استفاده از حافظه EEPROM هست.
از وقتی میکروکنترلر های AVR اومدند همه ما را بد عادت کردند!
یه پارامتر EEPROM قرار میدیم و همه چیز تمومه!
اما در میکروکنترلر های سری ARM ما چنین حافظه ای را نداریم و به عبارتی اگر قرار باشه متغیری با قطع برق از بین نره باید دنبال یه راه کار دیگه باشیم!
ساده ترین راهکار میتونه استفاده از یک حافظه خارجی EEPROM باشه ( که قراره هم هزینه اضافه داشته باشه و هم برد ما رو اشغال کنه)
ولی یک روش خیلی خوب دیگه هم هست که قراره توی این مقاله اون رو توضیح بدم. با سیسوگ همراه باشید.

 

خب قبل از اینکه وارد بحث اصلی بشم فکر میکنم یه یادآوری از انواع حافظه هایی که توی میکروکنترلر داریم بد نباشه (خیلی توضیح نمیدم خیالتون راحت) و با ذهنیت بهتری ادامه مطلب رو بخونیم.

 

انواع حافظه

ROM:

این حافظه مخفف READ ONLY MEMORY هست یعنی چی؟ یعنی فقط میتونی از این حافظه اطلاعات رو بخونی و نکته جالبش اینکه با قطع برق هم این حافظه همچنان دیتایی رو که ذخیره کرده رو توی خودش داره که اصطلاحا اگه جایی شنیدید که گفتد حافظه دائم باز هم منظور همینه که با قطه برق دیتا این حافظه پاک نمیشه.

PROM:

این حافظه مخفف Programmable Read Only Memory هست که کاملا فکر میکنم از روی اسمش مشخصه چه کاربردی داره اگه یه توضیح سطحی بدم، دقیقا میشه گفت همون ROM هست اما با قابلیت پروگرام شدن همین.

EPROM:

این حافظه مخفف Erasable programmable read only memory هست که دقیقا میشه گفت همون PROM منتها با یه تفاوت واقعا اساسی و اونم اینکه میشه اطلاعاتش رو توسط اشعه ماورابنفش پاک کرد.

(میتونه نحوه عملکردشون جالب باشه)

EEPROM:

این حافظه مخفف Electrically Erasable Programmable ROM هست یه جورایی میشه گفت مدل پیشرفته تر EPROM ولی یه تفاوت اساسی داره، برای اینکه بخوایم اطلاعات رو از روی این حافظه پاک کنیم نیازی نیست که حتما اشعه ای باشه و یا اینکه وقتی خواستیم بخشی از حافظه رو پاک کنیم مجبور باشیم کل حافظه رو پاک کنیم بلکه بدون تمامی این کارها به راحتی میتونیم اون بخش از حافظه رو که میخوایم پاک کنیم.

 

FLASH:

تراشه EEPROM در هر لحظه تنها یک بیت خاص رو تغییر می دهد و فرآیند اعمال تغییرات در تراشه کنده و در مواردی که اطلاعات باید با سرعت تغییر کند، از FLASH MEMORY که یک نوع خاص از حافظه های EEPROM هست استفاده می کند .در حافظهFalsh داده ها ۵۱۲ بایتی هستند. 

نکته اساسی: در کنار حافظه FLASH یک کنترلر قرار داره که توسط اون تمامی اعمال مربوط به راه اندازی، ذخیره و بازخوانی حافظه کنترل میشه. با اضافه شدن کنترلر میشه تمام و یا بخش های خاصی از تراشه رو حذف کرد که باعث سریعتر شدن این نوع حافظه نسبت به حافظه EEPROM میشه.

 

SRAM:

این حافظه مخفف STATIC RANDOM ACCESS MEMORY هست که برای ذخیره موقت داده به کار میره، اسم دیگش حافظه ی موقت هست. یکی از کاربردهای SRAM ذخیره موقت‌ داده‌هایی است که از طریق پورت‌های ورودی و سریال به CPU انتقال داده شده اند. طول خانه‌های این حافظه بسته به نوع تراشه کاملا متفاوت هست.

خب حالا بریم سر وقت میکرو کنترلری که باهاش کار داریم یعنی STM32 و ببینیم که چه حافظه هایی رو داخل خودش داره؟

ساختارحافظه میکروکنترلر STM32

به عکسی که بالا گذاشتم دقت کنید. این تصویر در واقع داره حافظه های داخل یه میکروکنترلر STM32 رو نشون میده. که اگر کمی دقت کنید داخلش هیچ خبری از حافظه EEPROM نیست. خب اینجا سوال پیش میاد که آیا میکروکنترلر های STM32 کلا EEPROM ندارد؟ نمیشه گفت همشون ولی حداکثرشون EEPROM ندارند.

حالا یه سوال دیگه پیش میاد اگر ندارند پس تکلیف چیه؟ ، فرضا خواستیم توی یه پروژه از EEPROM استفاده کنیم اونجا باید چکار کنیم؟

در جواب باید بگم که دو راه حل هست.

استفاده از تراشه های EEPROM خارجی مثل AT24C512 و …

تبدیل بخشی از حافظه FLASH به EEPROM که این راهکار هم توسط شرکت ST ارائه داده شده و منم در این مقاله میخوام از راه حل دوم استفاده کنم. خوبی راه حل دوم اینکه وقتی توی پروژتون نیاز به EEPROM خارجی نداشتید از این روش می‌تونید استفاده کنید.

شاید برای خیلی هاتون سوال پیش بیاد که چطور این عمل اتفاق میفته که واقعا جای خاص خودش رو داره ولی اگر خیلی کنجکاو هستید اینجا کلیک کنید.

نحوه کدنویسی و استفاده از کتابخانه ST و پروگرام کردن برنامه روی تراشه

ابتدا به سایت ST میریم و کتابخونه های EEPROM ٍEmulation را دانلود می کنیم.

پس از دانلود باید برای اضافه کردن کتابخونه، فایل هارو به پروژتون اضافه کنید.

پروژه ای که درست کردم با توابع HAL و محیط IAR هست.

گام اول، درست کردن پروژه در STM32CUBE

STM32

همینطور که در شکل مشخص شده فقط چندین پین از پورت B رو خروجی کردم که این پین ها برای LCD گرافیکی هست که در این پروژه استفاده کردم و برای EEPROM استفاده نشده.

تبدیل حافظه FLASH میکروکنترلرهای STM32 به EEPROM

خب حالا از نوار منو بالا گزینه generate رو میزنم تا کد رو با توابع HAL درست کنه و در نهایت کد ها رو به محیط IAR انتقال بده که وهله اول باید به شکل زیر برسید.

EEPROM

 

حالا وقتش رسیده کتابخونه ای رو که از سایت ST دانلود کردیم رو به پروژه اضافه کنیم. برای این کار باید مراحل زیر رو به ترتیب انجام بدیم.

  • اضافه کردن فایل EEPROM.c به پوشه SRC

EEPROM

  • اضافه کردن فایل EEPROM.h به پوشه Inc
EEPROM

  • در نهایت هم اضافه کردن فایل EEPROM.c رو به پروژه اصلی
روی گزینه USER راست کلیک می کنید و در قسمت ADD FILE فایل EEPROM.c رو به پروژه اضافه می کنیم و در نهایت از نوار بالا گزینه Project و در زیر مجموعه آن Compile رو انتخاب می‌کنیم. که باید کدتون تا این مرحله بدون هیچگونه EEROR باشه.

EEPROM

 

حالا روی فایل MAIN دوبار کلیک می کنم تا این فایل باز شه و در نهایت تمامی کد هایی رو که میخوام در این قسمت می نویسم.

EEPROM

کد نویسی:

ابتدا دقت کنید که در قسمت Include باید حتما EEPROM رو اضافه کنید در غیر اینصورت اگر از توابع اون استفاده کنیم از کد خطا میگیره و اجازه کامپایل شدن رو نمیده.

تبدیل حافظه FLASH میکروکنترلرهای STM32 به EEPROM

حالا نوبت به استفاده از EEPROM در برنامه هست.

سخت افزار:

در نهایت کد مورد نظرمون رو روی سخت افزار پیاده سازی می کنیم. و در نهایت پس از آپلود باید به شکل زیر برسید.

EEPROM

البته باید از زئوس هم تشکر کنم بابت کتابخونه LCD گرافیکی.

 

یکی از کاربران عزیز سیسوگ به اسم علی، تجربه‌ی خود را در رابطه با این پست در قسمت کامنت‌ها نقل کردند. خالی از لطف نبود که ما این تجربه بسیار عالی و کاربردی را در پست قرار بدهیم تا شما هم بتوانید از این تجربه در پروژه‌هایتان استفاده کنید. کامنت این دوست عزیز را عینا در ادامه به صورت هایلایت مشاهده می‌کنید:

 

سلام مجدد من یکسالی هست از این قابلیت استفاده میکنم چند نکته هست که باید بهش توجه بشه در فایل eeprom.h باید پارامترهای page0 و page1 مطابق میکروی شما مقدار دهی بشه مثلا اگر میکرو ۶۴کیلوبایتی هست نباید page1 بیشتر از ۶۳ باشه. من پیجهای ۶۲ و ۶۳ را انتخاب کردم و کار میکنه ولی با پروگرم مجدد فلش با اینکه گزینه full erase chip غیر فعال کردم بازهم گاهی داده ها میپرند و ریست میشن. دلیلش را متوجه نشدم. نکته دوم اینکه اگر حافظه eeprom شما مثلا ۱کیلوبایت هست نصفش برای ادرس دهی استفاده میشه و در عمل شما ۲۵۶ المان ۱۶بیتی میتونید ذخیره کنید. برای ذخیره اعداد فلوت و دابل و لانگ بهتره از union استفاده کنید. با توجه به اینکه اگثر arm کارها از این قابلیت استفاده میکنن شاید نیاز به یک اموزش مفصل تر باشه. ممنون

 

برای دریافت سورس کامل پروژه روی لینک زیر کلیک کنید.

STM32_Flash2EEPROM.7z

 

با سیسوگ همراه باشید.

منبع

 

اطلاعات
76
0
لینک و اشتراک
profile

BLO OM

متخصص الکترونیک

«السَّلَامُ عَلَیْکَ یَا أَبَا عَبْدِ اللَّهِ، السَّلَامُ عَلَیْکَ وَ رَحْمَهُ اللَّهِ وَ بَرَکَاتُهُ».

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند.
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد.
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند.
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند.
family

دیدگاه ها

profile
جواد امینی گفت :
۱۴۰۳-۰۱-۲۱ ۰۵:۴۳

درود
در عجبم چرا شرکت st از روش شرکت atmel استفاده نکرده. به نظرم این یه ضعیفه برا st

profile
Zeus ‌ گفت :
۱۴۰۳-۰۱-۲۵ ۱۱:۱۱

سلام دوست عزیز
روش شرکت اتمل چی هست ممکنه مقداری مساله رو بیشتر توضیح بدید

profile
حامد گفت :
۱۴۰۲-۱۰-۲۴ ۰۱:۰۸

سلام مجدد من یکسالی هست از این قابلیت استفاده میکنم چند نکته هست که باید بهش توجه بشه در فایل eeprom.h باید پارامترهای page0 و page1 مطابق میکروی شما مقدار دهی بشه مثلا اگر میکرو ۶۴کیلوبایتی هست نباید page1 بیشتر از ۶۳ باشه. من پیجهای ۶۲ و ۶۳ را انتخاب کردم و کار میکنه ولی با پروگرم مجدد فلش با اینکه گزینه full erase chip غیر فعال کردم بازهم گاهی داده ها میپرند و ریست میشن. دلیلش را متوجه نشدم. نکته دوم اینکه اگر حافظه eeprom شما مثلا ۱کیلوبایت هست نصفش برای ادرس دهی استفاده میشه و در عمل شما ۲۵۶ المان ۱۶بیتی میتونید ذخیره کنید. برای ذخیره اعداد فلوت و دابل و لانگ بهتره از union استفاده کنید. با توجه به اینکه اگثر arm کارها از این قابلیت استفاده میکنن شاید نیاز به یک اموزش مفصل تر باشه.

سلام ممنون از زحماتتون و این که مطلب بالایی خیلی به دردم خرد و مشکل حل شد تشکرات فراوان

profile
Zeus ‌ گفت :
۱۴۰۲-۱۰-۲۵ ۰۹:۱۱

ممنونم دوست عزیز برای توضیحاتتون

profile
محمد گفت :
۱۴۰۲-۰۲-۲۸ ۱۹:۰۱

سلام !
میکرو stm32f103c8t blue pill
چرا در آدرس های بیش از 0x0080 هم کار میکنه !!!
طبق هدر فایلش 0x0080 مربوط به page 3 میشه و خودش page0 رو از 0x0000 و page1 رو از 0x0040کانفیگ کرده.
من تو حلقه از 0x0000 الی 0x008F که تو صفحه سوم میشه مقدار ریختم و بعد از قطعی برق با تابع read تحویل گرفتم.
توقع داشتم محتوای آدرس های بعد از 0x007f خالی باشند بعد از قطعی برق که قرائت کردم.مطلبی هست که متوجه نشده باشم !؟
سپاس

profile
مهدی رهی گفت :
۱۴۰۱-۱۲-۲۴ ۲۰:۴۹

سلام در مورد اون توضیحی که از کامنت دوستان گذاشتین نکته ای جا افتاده:
جهت تنظیم محدوده مورد استفاده از حافظه فلش به عنوان eeprom از دیفاین زیر باید استفاده بشه:
#define EEPROM_START_ADDRESS ((uint32_t)0x0801E000) /* EEPROM emulation start address: after 64KByte of used Flash memory */ //now select sector 120

مثلا اینجا برای میکرو stm32f103c8 من سکتور یا پیج 120 رو برای شروع انتخاب کردم.

نکته مهم اینجاست:
با کمک دو دیفاین
PAGE0
و
PAGE1
درواقع ما محدوده کل eeprom رو انتخاب میکنیم و به میکرو میگیم که چند پیج از حافظه فلش رو برای eeprom استفاده کرده ایم.
برای همین مقدار این دو دیفاین با توجه به نیاز ما و آدرسی که در EEPROM_START_ADDRESS قرار دادیم مشخص میشه.

دوستمون که به مشکل برخوردن دلیلش همین بوده که EEPROM_START_ADDRESS رو تنظیم نکردن این دیفاین بطور پیش فرض سکتور 1 رو انتخاب میکنه نه سکتور 0 و ما هم توی برناممون معمولا اینقدر حجم کد تولیدیمون بالا هست که چند پیج اول رو استفاده میکنیم و باید دقت کنیم که با انتخاب درست EEPROM_START_ADDRESS و دو دیفاین PAGE1 و PAGE0 آدرسی بعد از پایان برناممون رو به eeprom تخصیص بدیم وگرنه مشکلاتی توی برنامه مثل مشکلی کو دوستمون گفتن بوجود میاد.

اگر درست نتونستم بیان کنم به فروم پرسش و پاسخ سیسوگ بیاد و سوالاتتون رو بپرسین.

https://ask.sisoog.com/

profile
مریم گفت :
۱۴۰۳-۰۸-۲۲ ۰۹:۱۴

با سلام خدمت شما. واقعا ممنونم از شما که اطلاعات خوب و درستتونو در اختیار بقیه قرار میدین. سپاسگزارم از شما. موفق و پایدار باشین

profile
shoniz گفت :
۱۴۰۱-۰۹-۰۵ ۱۶:۴۹

آرایه رو چطور میتونم بریزم توش
بعنوان مثال :
user_time[15]
user_temp[15]
stage[15]

profile
Zeus ‌ گفت :
۱۴۰۱-۰۹-۱۳ ۰۹:۰۳

برای این کار باید بایت به بایت آرایه رو توی حافظه ذخیره کنید 🙂

profile
مسعود گفت :
۱۴۰۱-۰۸-۲۶ ۱۶:۵۰

سلام وقت بخیر
من بتازگی میخوام از این روش استفاده کنم
میکرو : STM32F103C8T6 هست که ظاهرا 64کیلوبایت حافظه فلش داره.

با این روش چند کیلوبایت حافظه فلش بهش اختصاص داده میشه؟ مهم.

profile
Zeus ‌ گفت :
۱۴۰۱-۱۱-۰۴ ۰۹:۰۷

سلام دوست عزیز
اون بستگی به انتخاب شما داره فکر کنم در این روش حداقل یک یا دو سکتور از حافظه رو باید بهش اختصاص بدید
حالا باید ببینید در میکروکنتلر مورد استفاده شما هر سکتور چند بایت یا کیلو بایت هست
فکر کنم توی این میکرو هر سکتور ۱ کیلو باشه که میشه به عبارتی ۲ کیلو بایت
البته اگر اشتباه نکرده باشم در خصوص ظرفیت هر سکتور

profile
حسین گفت :
۱۴۰۱-۰۴-۰۹ ۲۲:۲۸

با درود و سپاس.
آیا راهی وجود داره که به حافظه فلش دسترسی 8 بیتی داشت ؟
چون این کتابخانه ظاهرا دسترسی 16 بیتی داره

profile
Zeus ‌ گفت :
۱۴۰۱-۰۴-۱۱ ۱۵:۳۶

سلام دوست عزیز
بسته به خانواده میکروکنترلر این دسترسی فرق میکنه
برخی خانواده ها اجازه میدن و برخی نه که به طراحی سخت افزار این مورد بیشتر برمیگرده
اما شما با خاصیت flash ها میتونی دسترسی ۸ بیتی برای خودتون ایجاد کنید – یعنی هشت بیت بی استفاده رو با بیت های یک پر کنید و روی ۱۶ بیت بنویسید – به خوبی کار خواهد کرد.

profile
حسین گفت :
۱۴۰۱-۰۴-۱۲ ۱۳:۵۰

سچاس ولی اینطوری اصلا خوب نیست .
2 برابر حافظه مصرف میکنه !!

profile
Zeus ‌ گفت :
۱۴۰۱-۰۴-۱۲ ۱۴:۰۳

نمیکنه ، منظور من اینه که دوتا یک بایت ذخیره کنید 🙂

profile
امید گفت :
۱۴۰۱-۰۱-۱۴ ۱۴:۴۹

ببخشید وقتی رو حافظه فلش تو stm32 هم میشه به صورت بایتی نوشت و هم خوند، چه لزومی برای استفاده از eeprom به این شکل هست؟

profile
Zeus ‌ گفت :
۱۴۰۱-۰۱-۱۶ ۱۴:۱۰

سلام دوست عزیز اتفاقا سوال خوبی پرسیدید
درسته که شما میتونید به شکل بایت (در برخی خانواده ها به شکل word ) دیتا رو توی حافظه فلش ذخیره کنید ولی بعد از نوشتن یک بار دیگر قادر به تغییر آن خانه نخواهید بود مگر با erase کردن سکتوری که بایت در آن واقع شده است
بسته به خانواده و میزارن حافظه فلش اندازه سکتور ها از ۱ کیلو تا ۱۲۸ کیلو بایت متغییر هست، یعنی شما برای تغییر یک بایت باید کل سکتور رو پاک کنید که این امر باعث از دست رفتن باقی دیتا ها خواهد شد. اما این کاتابخانه به نحوی این کار را انجام میدهد که شما دیتا را دست ندهید و هر بار نیاز به پاک کردن کل سکتور نباشد (با توجه به عملکرد حافظه های nor )

profile
آلاله وفائی گفت :
۱۴۰۰-۰۹-۱۵ ۰۹:۱۱

سلام. ممنون از پستتون. من هم یک راهنمایی برای ذخیره کردن اعداد float میگذارم. که همان طور که نوشتید از union خوبه استفاده بشه. در حقیقت با توجه به اینکه توابع این کتابخانه با uint16 کار می کنند، برای ذخیره‌سازی عدد float آن را به دو بخش 16 بیتی تقسیم و ذخیره می کنیم و مجدد با خواندن دو عدد 16 بیتی از فلش این دو را ترکیب و به صورت عدد float در می آوریم.

// Written by Mok, 05/17/2018
// BSD license

#include
#include

uint16_t MSB_16bit_of_float32 ( float float_number){
union
{
float f_number;
uint16_t uint16_arr[2];
} union_for_conv;
union_for_conv.f_number = float_number;
uint16_t MSB_uint16 = union_for_conv.uint16_arr[1];
return MSB_uint16;
}

uint16_t LSB_16bit_of_float32 (float float_number){
union
{
float f_number;
uint16_t uint16_arr[2];
} union_for_conv;
union_for_conv.f_number = float_number;
uint16_t LSB_uint16 = union_for_conv.uint16_arr[0];
return LSB_uint16;
}

float float32_from_two_uint16(uint16_t MSB_uint, uint16_t LSB_uint){
union
{
float f_number;
uint16_t uint16_arr[2];
} union_for_conv;
union_for_conv.uint16_arr[0] = LSB_uint;
union_for_conv.uint16_arr[1] = MSB_uint;
return union_for_conv.f_number;
}

int main ()
{
float a;
uint16_t b;
uint16_t c;
float d;
float no_lsb_float;

a = -0.515646546;
b = MSB_16bit_of_float32(a);
c = LSB_16bit_of_float32(a);
d = float32_from_two_uint16(b,c);
no_lsb_float = float32_from_two_uint16(b,0);
printf ("original f: %f\t MSB16: %d\tLSB16:%d\t final f:%f\t no_lsb_float f:%f\n", a, b,c, d,no_lsb_float);

}

profile
Zeus گفت :
۱۴۰۰-۰۹-۱۵ ۱۲:۱۸

سلام
بسیار متشکر دوست عزیز
ممنونم برای به اشتراک گذاری تجربه خودتون

profile
آلاله وفائی گفت :
۱۴۰۰-۰۹-۱۵ ۰۹:۱۴
profile
حسین گفت :
۱۴۰۱-۰۴-۰۹ ۲۱:۳۱

قضیه ساده تر از این حرفهاست!!.
با type casting خیلی راحت میتونی اینکار رو انجام بدی .
مثلا برای فلوت :
uint16_t *var;

var = (uint16_t *)float_var
حالا یکبار var* را ذخیره میکنید و
و یکبار دیگه (1+var)* را ذخیره میکنید .
.بعد موقع خواندن به همین ترتیب میخونید و توی آدرس متغیر فلوت قرار میدید.
با این روش نیاز به تعریف توابع مختلف برای متغیر های مختلف ندارید .
یک تابع برای ذخیره و باز خوانی آرایه تعریف میکنید و با اون تابع و این روش میتونید تمام متغیر های بزرگتر از 16 بیت رو ذخیره کنید .

profile
م. گفت :
۱۴۰۰-۰۴-۲۹ ۰۹:۲۴

با تشکر بسیار از دوستان سیسوگ بابت کتابخونه خوبشون، به بعضی از دلایل که من خودم نمیدونم، بعضی اوقات اطلاعات جدید روی اطلاعات قبلی نوشته نمیشد و این در طی اجرای برنامه مشکل درست میکرد.

از اونجایی که قیمت یه تراشه EEPROM ماکزیمم دوهزارتومن بیشتر نیست، برای تعداد داده های زیاد و کاربردهایی که به پاک کردن و نوشتن زیاد احتیاج دارن، منطقی تر هست که از همون استفاده بشه. البته write cycle یک eeprom خارجی به دلیل کندی در حدود چند میلی ثانیه طول میکشه، در حالی که یک write cycle فلش چندمیکروثانیه هست، اما در عوض حافظه فلش هم ماکزیمم 1000 تا 10,000 بار بیشتر نمیشه توش نوشت، یعنی اصلا برای کاربردهای پاک کردن و نوشتن زیاد طراحی نشده!

profile
hossein گفت :
۱۴۰۰-۰۴-۲۱ ۱۲:۰۰

سلام
من طبق گفته های شما رفتم جلو متغیر داخل حافظه فلش ریخته میشه اما موقع قطع برق مقدار متغیر پاک میشه
اینم عکس برنامم:https://s4.uupload.ir/files/capture_b82k.png
ممنون میشم راهنماییم کنین

profile
محمد موسوی گفت :
۱۴۰۰-۰۱-۲۸ ۱۸:۳۶

سلام دوستان من از این لایبرری دارم استفاده میکنم فقط یه مشکل وجود داره وقتی یکی از پیج ها پر میشه و سوییچ میکنه روی پیج بعدی، آخرین دیتا ها کپی نمیشن روی پیج جدید. احتمالا شما تا پر شدن کامل یه پیج تست نکردید.

profile
zeus گفت :
۱۴۰۰-۰۳-۰۵ ۰۰:۰۴

سلام دوست عزیز
تا اونجا که من یادم میاد و کدش رو مطالعه کرده بودم چنین قابلیتی رو داشت و فکر میکنم باید تابعی رو کال کنید اگر اشتباه نکنم

profile
داود گفت :
۱۳۹۹-۱۰-۰۲ ۱۹:۴۰

باسلام من از شما بابت این فایل وراهنمای تشکر میکنم وامید موفقیت روز افزون دارم.

profile
Sisoog Os گفت :
۱۳۹۹-۱۰-۰۳ ۱۵:۲۲

ممنون از شما دوست عزیز

profile
علی گفت :
۱۳۹۹-۰۹-۱۵ ۰۶:۵۷

سلام. تعداد دفعات رایت روی فلش محدودیت نداره؟

profile
زئوس Zeus گفت :
۱۳۹۹-۰۹-۱۵ ۱۲:۲۹

فلش محدودیت ۱۰۰ هزار یا ۱۰ هزار بار رو دارن برای نوشتن – ولی با این تکنیک میتونید تعداد خیلی بالا ببرید

profile
علی گفت :
۱۳۹۹-۰۹-۰۳ ۲۰:۵۴

سلام خسته نباشید
کامنت هارو خوندم دیدم یکی دیگه از دوستان مثل من براش سواله که چطور میشه پیج های بیشتری اضافه کرد؟
و اینکه دستور چطور بگیم چقدر از حافظه فلش رو برای eeprom استفاده کنه؟ از میکروی stm32f103c8 استفاده میکنم که 64 کیلوبایت فلش داره حالا فرضا بخوام بگم از 10 کیلوبایت برای eeprom استفاده کنه چطور باید بگم؟ و اینکه یکی از دوستان گفتن: همچنین page های بیشتری تعریف کرد تا بواسطه read write های زیاد حافظه فرسوده نشه. یعنی فرسوده میشه؟ بعد چه مدت؟ چقدر read و write شدن؟
یه سوال دیگه هم دارم اینکه: چند نکته هست که باید بهش توجه بشه در فایل eeprom.h باید پارامترهای page0 و page1 مطابق میکروی شما مقدار دهی بشه مثلا اگر میکرو ۶۴کیلوبایتی هست نباید page1 بیشتر از ۶۳ باشه. من پیجهای ۶۲ و ۶۳ را انتخاب کردم و کار میکنه == چطور انتخاب کنیم که از کدوم پیج استفاده کنه؟
عذرمیخوام اگر طولانی شده بنده مبتدی هستم و تازه دارم با میکرو کنترولر ها کار میکنم

profile
مجتبی گفت :
۱۳۹۹-۰۲-۱۰ ۱۸:۴۲

برنامم به 40 کیلوبایت رسید ولی مشکلی پیش نیومد بدون کتابخانه ایپرام
فکر کنم یه جای کتابخانه مشکل داره

profile
زئوس Zeus گفت :
۱۳۹۹-۰۲-۱۳ ۱۲:۲۸

امم فکر نمیکنم کتابخانه مشکل داشته باشه
چون توسط خود st ارائه شده
البته آخرین ورژنش رو بهتره از خود سایت st دانلود و تست کنید

profile
مجتبی گفت :
۱۳۹۹-۰۲-۱۰ ۱۳:۳۲

با درود
من از این کتابخانه استفاده کردم ولی انگاری بعد از پر شد 32 کیلو بایت حافظه فلش دیگه به درستی کار نمی کنه میکرو
میکر من STM32F103C8 هستش .
حالا نمیدونم مشکل از برنامه ی منه یا کتابخانه یا حافظه فلش میکرو
ولی دستورات مربوط به فراخوانی کتابخانه ایپرام نوشتن و خواندن از روی برنامم بر میدارم مشکل حل میشه

profile
زئوس Zeus گفت :
۱۳۹۹-۰۲-۱۳ ۱۲:۳۱

چه مقدار حافظه eeprom لازم دارید توی برنامه ؟
چند تا سکتور برای این کتابخانه اختصاص داده اید ؟

profile
حسین گفت :
۱۳۹۹-۰۱-۱۳ ۰۱:۰۱

سلام ممنون بابت آموزشتون ولی اگه میشه بیشتر توضیح بدید وقتی توی نوشتن مقدار ادرس 0 رو دادید این صفر دقیقا چیه؟ page0 یا ادرس صفر یا چی؟

profile
زئوس Zeus گفت :
۱۳۹۹-۰۱-۱۶ ۱۰:۳۱

سلام دوست عزیز – برای این که جواب سوالتون رو بگیرد باید با نحوه کار این کتابخانه آشنایی داشته باشید – و توضیحش به شکل نوشتاری سخته . خلاصه بخوام بگم برای ذخیره سازی هر بایت در این مدل از eeprom حداقل به ۲ بایت حافظه احتیاج دارید (در صورتی که حافظه eeprom کمتر از ۲۵۵ باشه) یک باید مقدار نوشته شده شما و مقدار دوم آدرس حافظه است. وقتی شما قصد دارید مقدار aa رو روی حافظه 01 ذخیره کنید – این برنامه مقدار 01aa رو توی فلش می نویسه و موقع خوندن مقدار آخرین مقدار نوشته شده برای آدرس ۰۱ رو جستجو میکنه.

profile
محمود فیاض بخش گفت :
۱۳۹۸-۱۱-۱۰ ۰۴:۴۰

سلام مشکل من رو بعد از یک ماه جستجو شما الان با این صفحه حل کردید. خدا خیرتون بده. دمتون گرم. فقط میشه بفرمایید منبع محتوای این صفحه از کجاست؟ میخوام بدونم اگر به مشکل دیگه ای برخوردم کجا میتونم پیدا کنم؟؟؟
من مدت هاست stm32 کار میکنم. اگر سوالی داشتید برای من بفرستید شاید بتونم لطفتون رو جبران کنم … متشکر

profile
زئوس Zeus گفت :
۱۳۹۸-۱۱-۱۳ ۱۴:۲۸

سلام دوست عزیز
خواهش میکنم و ممنون از لطف شما
رفرنس دقیقا داکیومنت های st است و البته فروم خود st

profile
علی گفت :
۱۳۹۸-۱۱-۰۲ ۰۹:۱۰

سلام مجدد
من یکسالی هست از این قابلیت استفاده میکنم چند نکته هست که باید بهش توجه بشه
در فایل eeprom.h باید پارامترهای page0 و page1 مطابق میکروی شما مقدار دهی بشه مثلا اگر میکرو 64کیلوبایتی هست نباید page1 بیشتر از 63 باشه. من پیجهای 62 و 63 را انتخاب کردم و کار میکنه ولی با پروگرم مجدد فلش با اینکه گزینه full erase chip غیر فعال کردم بازهم گاهی داده ها میپرند و ریست میشن. دلیلش را متوجه نشدم.
نکته دوم اینکه اگر حافظه eeprom شما مثلا 1کیلوبایت هست نصفش برای ادرس دهی استفاده میشه و در عمل شما 256 المان 16بیتی میتونید ذخیره کنید.
برای ذخیره اعداد فلوت و دابل و لانگ بهتره از union استفاده کنید.
با توجه به اینکه اگثر arm کارها از این قابلیت استفاده میکنن شاید نیاز به یک اموزش مفصل تر باشه. ممنون

profile
زئوس Zeus گفت :
۱۳۹۸-۱۱-۰۵ ۱۲:۴۲

ممنون برای توضیحات تکمیلی 🙂

profile
علی گفت :
۱۳۹۸-۱۰-۲۸ ۱۹:۱۱

سلام
ایا میشه بیشتر از یک سکتور اصلی داشت و حجم eeprom را بیشتر از یک سکتور کرد.مثلا برای میکروی f103c8 که پیشفرض ۱kbحافظه میتونید داشته باشید با تغییراتی مثلا ۳۰ کیلوبایت داشته باشید؟
سوال دوم کتابخانه برای السیدیهای ۱۲۸×۶۴ برای stm32 تست شده سراغ ندارید. من یه تعدادی کتابخونه پورت کردم ولی درست کار نکرد

profile
زئوس Zeus گفت :
۱۳۹۸-۱۰-۲۹ ۱۰:۱۴

سلام دوست عزیز
تعداد سکتور رو هر قدر نیاز باشه میشه افزایش داد ولی باید دقت داشته باشید که متغییر ها و حجم eeprom ربطی به تعداد سکتور نداره تا حدودی – بیشتر کردن تعداد سکتور در واقع به شما کمک خواهد کرد که تعداد رایت روی eeprom رو افزایش بدید.
اگر سورس کتابخانه رو ببینید در خواهید دید که متغییر ها در رم نگهداری میشوند – و با حافظه فلش سینک خواهند شد برای قطع برق
امم قبلا پورت کردم – باید بگردم پیدا کنم.

profile
AmirAli گفت :
۱۳۹۸-۰۸-۱۸ ۱۳:۴۷

سلام ممنون بابت زحمات شما
از این کتابخونه در آردوینو هم میشه استفاده کرد؟

profile
زئوس Zeus گفت :
۱۳۹۸-۰۸-۱۹ ۰۸:۵۸

سلام دوست عزیز
منطقا نباید مشکلی داشته باشه و باید به خوبی کار کنه
احتملا قبلا برای آردوینو کتابخونه شده باشه و نیازی به پورت کردنش نداشته باشید.

profile
فاضل گفت :
۱۳۹۸-۰۷-۲۶ ۱۹:۴۹

سلام
برای stm32f103 همه مراحل جواب میده. مقادیر هم ذخیره میشوند. اما اگر میکرو خاموش و روشن بشه متوجه شدم که مقادیر همه مجددا صفر شدند.
علت چیه؟
تشکر

profile
meyti گفت :
۱۳۹۹-۰۶-۱۸ ۰۳:۴۱

سلام
مشکل تونو به چه صورت حل کردین ؟ من هم همین مشکل دارم

profile
زئوس Zeus گفت :
۱۳۹۹-۰۶-۱۹ ۰۹:۲۰

الان مشکل شما دقیقا مشکل همین دوستمون هست ؟

profile
محمد مهدی کریمی گفت :
۱۳۹۹-۰۶-۱۹ ۱۵:۰۳

بله – وقتی چیپ خاموش و روشن میکنم از همون ادرس داده های غیر مرتبط به من نشون میده

profile
hossein گفت :
۱۳۹۹-۱۰-۰۵ ۱۱:۳۴

“include “main.h #
“include “lcd.h#
<include <stdio.h#
"include "eeprom.h#
;uint16_t Write_Value

;[ uint16_t Read_value[256

;[char str[16
;()HAL_Init

;()HAL_FLASH_Unlock

; () EE_Init

;(HAL_Delay(10
;()lcd_init
:()lcd_clear
(while (1
}
(if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15)==1
}
:(EE_WriteVariable(0,20

;(HAL_Delay(10
;([EE_ReadVariable(0,&Read_value[0
{

;[0]sprintf(str,"value is:%u",Read_value
;(lcd_gotoxy(0,0
;(lcd_puts(str
{

{

profile
hossein گفت :
۱۳۹۹-۱۰-۰۵ ۱۱:۲۱

سلام
دوست عزیز مشکل شما حل شد
میشه راهنمایی کنین من هم همین مشکل رو دارم بعد از قطع تغذیه حافظه پاک میشه

profile
زئوس Zeus گفت :
۱۳۹۸-۰۷-۲۶ ۲۱:۱۴

دلایل متعددی میتونه دخیل باشه !
مثلا آدرس های حافظه فلش اشتباه ست شده باشند ؛ ری اینت اولیه درست انجام نشه
رایت روی فلش میسر نباشه – کمتر از دو سکتور از فلش رو اختصاص داده باشید
سمپل سایت رو دانلود و تست کنید.

profile
فاضل گفت :
۱۳۹۸-۰۷-۲۶ ۲۲:۲۴

سلام
دقیقاً طبق مثال رفتم.
نمی‌دونم مشکل کجاست

profile
زئوس Zeus گفت :
۱۳۹۸-۰۷-۳۰ ۰۹:۵۹

خوب اول شما بفرمایید از چه کامپایلر و چه میکرو کنترلری استفاده میکنید
منظور شماره کامل میکروکنتلر هست
در ضمن آیا موقع کامپایل خطا یا وارنینگی به شما میده یا نه
متشکرم

profile
فاضل گفت :
۱۳۹۸-۰۷-۳۰ ۱۱:۵۴

سلام.
از STM32F103RET6 و CubeIDE استفاده کردم. فایل ها را هم از Repository کپی کردم.
هیچ خطا یا وارنینگی نمیده. حدسم آدرس شروع حافظه هستش.
تشکر

profile
مهدی گفت :
۱۳۹۸-۰۶-۲۵ ۲۰:۰۲

سلام ممنون بابت آموزش خوبتون
متاسفانه کتابخانه هایی که سایت st گذاشته برای سال 2012 هست و برای ورژن قدیمی keil جواب میده. به همین خاطر باید ادیت بشه که شما هم فک کنم همین کار کردین.
من هر سایتی رو میگردم با میکرو f1 کار کردن اما من دارم با میکرو f0 کار میکنم. میخواستم بدونم کسی کتاب خانه اصلاح شده eeprom برای میکرو f0 رو داره؟

profile
hamidreza maddah گفت :
۱۳۹۸-۰۸-۰۱ ۱۱:۴۲

شما اگه منطق کار رو متوجه بشید، روی هر میکروی دیگه ای هم میتونید پیاده سازی کنید.
من برای F0 انجام دادم، منتها یه مشکلی دارم.
یکی از مراحل اینه که وقتی قراره نوشتن روی یه پیج فلش رو شروع کنیم، اون پیج رو پاک کنیم. من بعضی وقتا که میخوام پیج رو پاک کنم میکرو هنگ میکنه.
یه احتمال که دادم این بود که اگه همزمان با پاک کردن پیج، یه اینتراپت بیاد، میکرو هنگ میکنه، بنابراین قبل پاک کردن اینتراپتها رو غیر فعال میکردم و بعد از پاک کردن فعا میکردم. مشکلی اینبار پیش اومد این بود که وقتی اینتراپتها رو فعال میکردم میکرو هنگ میکرد.
ولی تو f1 هیچ مشکلی نداشتم

profile
BLO OM گفت :
۱۳۹۸-۰۶-۲۶ ۰۹:۱۰

سلام دوست عزیزم خیلی تفاوتی ندارن اما به صورت کلی برای F0 متاسفانه اموزشی ارائه نشده.

موفق باشید.

profile
زئوس Zeus گفت :
۱۳۹۸-۰۶-۲۶ ۰۹:۰۷

چرا از همین سورس استفاده نمی کنید ِفکر میکنم با تغییرات کوچک روی میکروی f0 هم به خوبی کار کنه

profile
مهدی گفت :
۱۳۹۸-۰۶-۲۶ ۰۹:۳۰

تغییرات دادم اما متاسفانه کار نکرد

profile
زئوس Zeus گفت :
۱۳۹۸-۰۶-۲۶ ۱۰:۱۰

دقت دارید که باید حداقل دو عدد سکتور به این کتابخانه اختصاص بدید ؟!
و البته شما و آدرس سکتور ها احتمالا متفاوت است !
من تغییر دادم و به خوبی کار کرد

profile
مهدی گفت :
۱۳۹۸-۰۴-۲۹ ۱۷:۴۴

دوستانی که قصد راه اندازی این قابلیت رو برای stm32f4xx دارن یا بقیه سری ها و میخوان که از HAL هم استفاده کنن میتونن فایل en.stm32cubef4 رو برای سری F4 و en.stm32cubef7 رو برای سری F7 و در کل برای هر سری en.stm32cubexxx مربوط به همون سری رو از سایت st دانلود کنن و به آدرس همچون “c:\STM32Cube_FW_xxxxxxxxx\Projects\xxxxxxxxx\Applications\EEPROM”
مثل
“STM32Cube_FW_F4_V1.0\Projects\STM32F4-Discovery\Applications\EEPROM”
برن و فایل های eeprom.c و eeprom.h رو استفاده کنن.
اگر از مثال درون فایل main.c همین فایل ها هم استفاده بشه و با دیباگر بررسی کنید عملکرد این کتابخونه دقیقا دستتون میاد

ممنون از بچه های سیسوگ

profile
مهدی گفت :
۱۳۹۸-۰۴-۲۸ ۲۰:۱۲

سلام ممنون بابت این آموزش، من کتابخونه eeprom رواز سایت st دانلود کردم و پروژه رو داخل cubeMX ساختم اما این کتابخونه eeprom از HAL پشتیبانی نمیکنه؟ یکم گیج شدم، شما این کتابخونه رو برای HAL خودتون تغییر دادین؟

profile
BLO OM گفت :
۱۳۹۸-۰۴-۲۹ ۰۸:۴۹

سلام دوست عزیزم
اگر به اموزش دقت کنید
فایل ها رو لطفا طبق توضیحاتی که دادم به پروژتون اضافه کنید.
در واقع زمانیکه شما فایل رو دانلود می‌کنید داخل پوشه های SRC و INC هر کدومشون شامل فایل c & .h. هستند که اگر اونارو به پروژتون اضافه کنید مشکلی اصولا نباید داشته باشید.

موفق باشید.

profile
مهدی گفت :
۱۳۹۸-۰۴-۲۹ ۱۲:۴۷

دقیقا همینطوره که گفتید، با فایلهایی که شما گذاشتید مشکلی نیست اما از خود سایت st که دانلود میکنم خطا میده، فایلی که قرار دادین تغییر داده شده برای HAL توسط تیم MCD هستش، ممنونم بابت آموزش عالیتون ان شاء الله روز بروز بالاتر برید…

profile
BLO OM گفت :
۱۳۹۸-۰۴-۲۹ ۱۲:۵۰

بله دوست عزیز دقیقا همینطوری است که گفتید چون فایل ادیت شده است
خیلی خوشحال شدم که مشکلتون حل شد.
موفق و پیروز باشید.

profile
Mohsen گفت :
۱۳۹۸-۰۳-۰۷ ۱۹:۱۵

سلام ممنون از مطالب عالییتون. فقط من میتونم از کتابخانه های eeprom این پروژه برای stm32f3 استفاده کنم

profile
BLOOM گفت :
۱۳۹۸-۰۳-۰۸ ۱۲:۲۵

سلام دوست عزیز، روش چیزی جز این نیست من خودم دقیقا چک نکردم که با قطعیت جواب بدم متاسفانه.
اما فکر نمیکنم تفاوت چندانی داشته باشه در صورتیکه تست کردید و جواب گرفتید ممنون میشم که نتیجه رو کامنت کنید
موفق باشید

profile
Mohsen گفت :
۱۳۹۸-۰۳-۰۸ ۱۹:۱۲

سلام من امروز کامل در گیر این مسئله بودم و متوجه شدم فایل رو میشه برای تمام رنج های کرتکس به کار برد. ولی باید تغییراتی در فایل .h داد.(البته خود st برای هر خانواده کرتکس این تغییرات رو داده و من چون با توابع ll-hal کار میکردم دچار مشکل شده بودم که حل شد) همچنین میشه با تغییر آدرس page ها در این فایل از تداخل ادرس پایان برنامه اصلی با ایپرام جلو گیری کرد .همچنین page های بیشتری تعریف کرد تا بواسطه read write های زیاد حافظه فرسوده نشه

profile
وهاب گفت :
۱۳۹۹-۰۵-۰۱ ۰۹:۵۶

سلام دوست عزیز
یه کم بیشتر راجع به page ها توضیح میدین و اینکه چه جوری یه page جدید تعریف کنم…

profile
افشین گفت :
۱۳۹۸-۰۳-۰۶ ۲۲:۰۷

سلام
ممنون به خاطر اموزش خوب و جالبت خیلی خوب بود

profile
BLOOM گفت :
۱۳۹۸-۰۳-۰۸ ۱۲:۲۸

خواهش میکنم دوست عزیز
ممون از اینکه متن رو خوندید و کامنت گذاشتید.
موفق باشید.

profile
علی گفت :
۱۴۰۳-۰۲-۲۱ ۰۳:۵۳

سلام. میشه لطف کنید یک راهنمایی بفرمایید در مورد خواندن اطلاعات داخل حافظه فلش و ایپیرام میکرو stm32 به چه صورت هست. با چند تا پروگرامر تست کردم نتونستم بخونم. انگار میکرو قفل هست.

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله