خیلی وقتها ما نیاز داریم متغیرهای داخل برنامه میکروکنترلر که داریم با قطع برق از بین نرند!
چاره چیه؟
راحت ترین روش استفاده از حافظه 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 رو نشون میده. که اگر کمی دقت کنید داخلش هیچ خبری از حافظه EEPROM نیست. خب اینجا سوال پیش میاد که آیا میکروکنترلر های STM32 کلا EEPROM ندارد؟ نمیشه گفت همشون ولی حداکثرشون EEPROM ندارند.
حالا یه سوال دیگه پیش میاد اگر ندارند پس تکلیف چیه؟ ، فرضا خواستیم توی یه پروژه از EEPROM استفاده کنیم اونجا باید چکار کنیم؟
در جواب باید بگم که دو راه حل هست.
استفاده از تراشه های EEPROM خارجی مثل AT24C512 و …
تبدیل بخشی از حافظه FLASH به EEPROM که این راهکار هم توسط شرکت ST ارائه داده شده و منم در این مقاله میخوام از راه حل دوم استفاده کنم. خوبی راه حل دوم اینکه وقتی توی پروژتون نیاز به EEPROM خارجی نداشتید از این روش میتونید استفاده کنید.
شاید برای خیلی هاتون سوال پیش بیاد که چطور این عمل اتفاق میفته که واقعا جای خاص خودش رو داره ولی اگر خیلی کنجکاو هستید اینجا کلیک کنید.
نحوه کدنویسی و استفاده از کتابخانه ST و پروگرام کردن برنامه روی تراشه
ابتدا به سایت ST میریم و کتابخونه های EEPROM ٍEmulation را دانلود می کنیم.
پس از دانلود باید برای اضافه کردن کتابخونه، فایل هارو به پروژتون اضافه کنید.
پروژه ای که درست کردم با توابع HAL و محیط IAR هست.
گام اول، درست کردن پروژه در STM32CUBE
همینطور که در شکل مشخص شده فقط چندین پین از پورت B رو خروجی کردم که این پین ها برای LCD گرافیکی هست که در این پروژه استفاده کردم و برای EEPROM استفاده نشده.
خب حالا از نوار منو بالا گزینه generate رو میزنم تا کد رو با توابع HAL درست کنه و در نهایت کد ها رو به محیط IAR انتقال بده که وهله اول باید به شکل زیر برسید.
حالا وقتش رسیده کتابخونه ای رو که از سایت ST دانلود کردیم رو به پروژه اضافه کنیم. برای این کار باید مراحل زیر رو به ترتیب انجام بدیم.
- اضافه کردن فایل EEPROM.c به پوشه SRC
- اضافه کردن فایل EEPROM.h به پوشه Inc
- در نهایت هم اضافه کردن فایل EEPROM.c رو به پروژه اصلی
روی گزینه USER راست کلیک می کنید و در قسمت ADD FILE فایل EEPROM.c رو به پروژه اضافه می کنیم و در نهایت از نوار بالا گزینه Project و در زیر مجموعه آن Compile رو انتخاب میکنیم. که باید کدتون تا این مرحله بدون هیچگونه EEROR باشه.
حالا روی فایل MAIN دوبار کلیک می کنم تا این فایل باز شه و در نهایت تمامی کد هایی رو که میخوام در این قسمت می نویسم.
کد نویسی:
ابتدا دقت کنید که در قسمت Include باید حتما EEPROM رو اضافه کنید در غیر اینصورت اگر از توابع اون استفاده کنیم از کد خطا میگیره و اجازه کامپایل شدن رو نمیده.
حالا نوبت به استفاده از EEPROM در برنامه هست.
#include <stdio.h> #include "nokia1661_lcd_driver.h" #include "lcd_font5x7.h" #include "photos.h" #include "eeprom.h" اضافه کردن هدر فایلها uint16_t Write_Value; تعریف متعییر برای نوشتن uint16_t Read_value[256]; تعریف متغیر برای خواندن char str[20]; تعریف متغیر برای نمایش دیتاروی LCD int main(void) { HAL_FLASH_Unlock(); باز کزدن حافظه فلش EE_Init(); فراخوانی تابع ایتوپیرام nlcdInit(); nlcdSetBackgroundColor(LCD_VGA_WHITE); nlcdSetFont(font5x7latcyr); nlcdClear(); توابع ال سی دی EE_WriteVariable(0,20); نوشتن مقدار20 HAL_Delay(10); تاخیر 10 میلی ثاینه EE_ReadVariable(0,&Read_value[0]); خواندن مقدار 20 از خانه صفر ارایه MX_GPIO_Init(); nlcdGotoCharXY(3,5); nlcdStringP(LCD_VGA_RED,"Welcome to Sisoog"); sprintf(str,"eeprom value is:%u",Read_value[0]); nlcdGotoCharXY(2,10); nlcdStringP(LCD_VGA_RED,str); نمایش مقدار دریافتی روی ال سی دی while (1) { } }
سخت افزار:
در نهایت کد مورد نظرمون رو روی سخت افزار پیاده سازی می کنیم. و در نهایت پس از آپلود باید به شکل زیر برسید.
البته باید از زئوس هم تشکر کنم بابت کتابخونه LCD گرافیکی.
برای دریافت سورس کامل پروژه روی لینک زیر کلیک کنید.
STM32_Flash2EEPROM.7z