آموزش, پروژه, مقاله های سیسوگ, نرم افزار های الکترونیک

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

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

خیلی وقتها ما نیاز داریم متغیرهای داخل برنامه میکروکنترلر که داریم با قطع برق از بین نرند!
چاره چیه؟
راحت ترین روش استفاده از حافظه 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 استفاده نشده.

خب حالا از نوار منو بالا گزینه 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 رو اضافه کنید در غیر اینصورت اگر از توابع اون استفاده کنیم از کد خطا میگیره و اجازه کامپایل شدن رو نمیده.

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

سخت افزار:

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

EEPROM

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

 

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

 

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

 

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

STM32_Flash2EEPROM.7z

 

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

منبع

 

author-avatar

درباره BLO OM

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

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

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

  1. Avatar for حامد حامد گفت:

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

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

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

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

  2. Avatar for محمد محمد گفت:

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

  3. Avatar for مهدی رهی مهدی رهی گفت:

    سلام در مورد اون توضیحی که از کامنت دوستان گذاشتین نکته ای جا افتاده:
    جهت تنظیم محدوده مورد استفاده از حافظه فلش به عنوان 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/

  4. Avatar for shoniz shoniz گفت:

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

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

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

  5. Avatar for مسعود مسعود گفت:

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

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

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

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

  6. Avatar for حسین حسین گفت:

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

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

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

      1. Avatar for حسین حسین گفت:

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

        1. Avatar for Zeus ‌ Zeus ‌ گفت:

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

  7. Avatar for امید امید گفت:

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

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

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

  8. Avatar for آلاله وفائی آلاله وفائی گفت:

    سلام. ممنون از پستتون. من هم یک راهنمایی برای ذخیره کردن اعداد 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);

    }

      1. Avatar for حسین حسین گفت:

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

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

    1. Avatar for Zeus Zeus گفت:

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

  9. Avatar for م. م. گفت:

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

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

  10. Avatar for hossein hossein گفت:

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

  11. Avatar for محمد موسوی محمد موسوی گفت:

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

    1. Avatar for zeus zeus گفت:

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

  12. Avatar for داود داود گفت:

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

    1. Avatar for Sisoog Os Sisoog Os گفت:

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

  13. Avatar for علی علی گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  14. Avatar for علی علی گفت:

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

  15. Avatar for مجتبی مجتبی گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  16. Avatar for مجتبی مجتبی گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  17. Avatar for حسین حسین گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  18. Avatar for محمود فیاض بخش محمود فیاض بخش گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  19. Avatar for علی علی گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  20. Avatar for علی علی گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  21. Avatar for AmirAli AmirAli گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  22. Avatar for فاضل فاضل گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

      1. Avatar for فاضل فاضل گفت:

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

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

          1. Avatar for فاضل فاضل گفت:

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

          2. Avatar for زئوس Zeus زئوس Zeus گفت:

            خوب خدا رو شکر دارید از GCC استفاده میکنید
            پروژه تون رو بفرستید 🙂

    2. Avatar for meyti meyti گفت:

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

      1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

        1. Avatar for محمد مهدی کریمی محمد مهدی کریمی گفت:

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

          1. Avatar for زئوس Zeus زئوس Zeus گفت:

            ببینید قبلا به دوستمون توضیح دادم که مشکل میتونه از کجا باشه
            آیا برنامه رو دیباگ کردید ؟ در حالت اولیه متغییر ها توی رم ذخیره میشن که باید با حافظه فلش سینک بشه این مقوله تا مشکلی پیش نیاد – با دیباگ کردن احتمالا میتونید مشکل رو پیدا کنید.

          2. Avatar for hossein hossein گفت:

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

          3. Avatar for hossein 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
            {

            {

  23. Avatar for مهدی مهدی گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

      1. Avatar for مهدی مهدی گفت:

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

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

          1. Avatar for مهدی مهدی گفت:

            می تونم ایمیل یا تلگرام شما رو داشته باشم که راحت تر با هم ارتباط داشته باشیم؟

          2. Avatar for زئوس Zeus زئوس Zeus گفت:

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

    2. Avatar photo BLO OM گفت:

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

      موفق باشید.

    3. Avatar for hamidreza maddah hamidreza maddah گفت:

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

  24. Avatar for مهدی مهدی گفت:

    دوستانی که قصد راه اندازی این قابلیت رو برای 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 همین فایل ها هم استفاده بشه و با دیباگر بررسی کنید عملکرد این کتابخونه دقیقا دستتون میاد

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

  25. Avatar for مهدی مهدی گفت:

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

    1. Avatar photo BLO OM گفت:

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

      موفق باشید.

      1. Avatar for مهدی مهدی گفت:

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

        1. Avatar photo BLO OM گفت:

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

  26. Avatar for Mohsen Mohsen گفت:

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

    1. Avatar photo BLOOM گفت:

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

      1. Avatar for Mohsen Mohsen گفت:

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

        1. Avatar for وهاب وهاب گفت:

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

  27. Avatar for افشین افشین گفت:

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

    1. Avatar photo BLOOM گفت:

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *