آموزش, پروژه, مقاله, نرم افزار

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

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

STM32_Flash2EEPROM.7z (207 دانلود ها)

 

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

منبع

 



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

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

 
BLO OM

درباره BLO OM

مالي که ز تو کس نستاند، علم است. حرزي که تو را به حق رساند، علم است. جز علم طلب مکن تو اندر عالم. چيزي که تو را ز غم رهاند، علم است. (شیخ بهایی)

نوشته های مشابه

یک دیدگاه در “10”

  1. Avatar مهدی گفت:

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

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

  2. Avatar مهدی گفت:

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

    1. BLO OM BLO OM گفت:

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

      موفق باشید.

      1. Avatar مهدی گفت:

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

        1. BLO OM BLO OM گفت:

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

  3. Avatar Mohsen گفت:

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

    1. BLO OM BLO OM گفت:

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

      1. Avatar Mohsen گفت:

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

  4. Avatar افشین گفت:

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

    1. BLO OM BLO OM گفت:

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

پاسخی بگذارید

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