تبدیل حافظه 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

 

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

منبع

 

حمایت از BLO OM

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

BLO OM

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

دیدگاه ها

61 دیدگاه

  • حسین
    ۹ تیر ۱۴۰۱

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

    • Zeus ‌
      Zeus ‌
      ۱۱ تیر ۱۴۰۱

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

      • حسین
        ۱۲ تیر ۱۴۰۱

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

        • Zeus ‌
          Zeus ‌
          ۱۲ تیر ۱۴۰۱

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

  • امید
    ۱۴ فروردین ۱۴۰۱

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

    • Zeus ‌
      Zeus ‌
      ۱۶ فروردین ۱۴۰۱

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

  • آلاله وفائی
    ۱۵ آذر ۱۴۰۰

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

    }

    • آلاله وفائی
      ۱۵ آذر ۱۴۰۰
      • حسین
        ۹ تیر ۱۴۰۱

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

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

    • Zeus ‌
      Zeus
      ۱۵ آذر ۱۴۰۰

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

  • محمد موسوی
    ۲۸ فروردین ۱۴۰۰

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

    • Zeus ‌
      zeus
      ۵ خرداد ۱۴۰۰

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

  • داود
    ۲ دی ۱۳۹۹

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

  • علی
    ۱۵ آذر ۱۳۹۹

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

    • Zeus ‌
      زئوس Zeus
      ۱۵ آذر ۱۳۹۹

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

  • مجتبی
    ۱۰ اردیبهشت ۱۳۹۹

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

    • Zeus ‌
      زئوس Zeus
      ۱۳ اردیبهشت ۱۳۹۹

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

  • مجتبی
    ۱۰ اردیبهشت ۱۳۹۹

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

    • Zeus ‌
      زئوس Zeus
      ۱۳ اردیبهشت ۱۳۹۹

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

  • حسین
    ۱۳ فروردین ۱۳۹۹

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

    • Zeus ‌
      زئوس Zeus
      ۱۶ فروردین ۱۳۹۹

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

  • محمود فیاض بخش
    ۱۰ بهمن ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۱۳ بهمن ۱۳۹۸

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

  • علی
    ۲ بهمن ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۵ بهمن ۱۳۹۸

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

  • علی
    ۲۸ دی ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۲۹ دی ۱۳۹۸

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

  • AmirAli
    ۱۸ آبان ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۱۹ آبان ۱۳۹۸

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

  • فاضل
    ۲۶ مهر ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۲۶ مهر ۱۳۹۸

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

      • فاضل
        ۲۶ مهر ۱۳۹۸

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

        • Zeus ‌
          زئوس Zeus
          ۳۰ مهر ۱۳۹۸

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

          • فاضل
            ۳۰ مهر ۱۳۹۸

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

            0
          • Zeus ‌
            زئوس Zeus
            ۳۰ مهر ۱۳۹۸

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

            0
    • meyti
      ۱۸ شهریور ۱۳۹۹

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

      • Zeus ‌
        زئوس Zeus
        ۱۹ شهریور ۱۳۹۹

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

        • محمد مهدی کریمی
          محمد مهدی کریمی
          ۱۹ شهریور ۱۳۹۹

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

          • Zeus ‌
            زئوس Zeus
            ۲۲ شهریور ۱۳۹۹

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

            0
          • hossein
            ۵ دی ۱۳۹۹

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

            0
          • 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
            {

            {

            0
  • مهدی
    ۲۵ شهریور ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۲۶ شهریور ۱۳۹۸

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

      • مهدی
        ۲۶ شهریور ۱۳۹۸

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

        • Zeus ‌
          زئوس Zeus
          ۲۶ شهریور ۱۳۹۸

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

          • مهدی
            ۲۶ شهریور ۱۳۹۸

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

            0
          • Zeus ‌
            زئوس Zeus
            ۱ مهر ۱۳۹۸

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

            0
    • BLO OM
      BLO OM
      ۲۶ شهریور ۱۳۹۸

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

      موفق باشید.

    • Hamidreza Maddah
      hamidreza maddah
      ۱ آبان ۱۳۹۸

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

  • مهدی
    ۲۹ تیر ۱۳۹۸

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

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

  • مهدی
    ۲۸ تیر ۱۳۹۸

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

    • BLO OM
      BLO OM
      ۲۹ تیر ۱۳۹۸

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

      موفق باشید.

      • مهدی
        ۲۹ تیر ۱۳۹۸

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

        • BLO OM
          BLO OM
          ۲۹ تیر ۱۳۹۸

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

  • Mohsen
    ۷ خرداد ۱۳۹۸

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

    • BLO OM
      BLOOM
      ۸ خرداد ۱۳۹۸

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

      • Mohsen
        ۸ خرداد ۱۳۹۸

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

        • وهاب
          ۱ مرداد ۱۳۹۹

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

  • افشین
    ۶ خرداد ۱۳۹۸

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

    • BLO OM
      BLOOM
      ۸ خرداد ۱۳۹۸

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

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 10 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

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

Mahdi.h   Mahdi.h  
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک