در میکروکنترلر های AVR برای ذخیره اطلاعاتی که نیاز بود. پس از قطع برق باقی بمانند. از حافظه EEPROM موجود در میکروکنترلر استفاده می کردیم. اما در میکروکنترلر های STM32 چنین حافظه ای وجود ندارد. برای ذخیره اطلاعات بایستی از حافظه های خارجی استفاده شود. اما راه دیگری نیز وجود دارد تا بتوان این اطلاعات را پس از قطع تغذیه میکروکنترلر نیز نگه داشت و در هزینه ها نیز صرفه جویی کرد. در این پست قصد داریم تا نحوه جایگزینی حافظه EEPROM را با حافظه Flash میکروکنترلر STM32 را آموزش دهیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.
حافظه EEPROM
در میکروکنترلر ها حافظه های مختلفی وجود دارد. یکی از انواع حافظه ها که در برخی از میکروکنترلر ها وجود دارد، حافظه EEPROM است. کلمه EEPROM مخفف عبارت Electrically Erasable Programmable Read-Only Memory به معنای حافظه فقط خواندنی قابل برنامه ریزی و پاکسازی بصورت الکتریکی است. این نوع حافظه نوع پیشرفته تری از حافظه EPROM است. همانطور که گفته شد مقادیری که در این حافظه ذخیره شوند با قطع شدن تغذیه میکروکنترلر از بین نمیروند و پس از روشن شدن مجدد، مقداری که قبل از قطع شدن تغذیه در آن ذخیره شده بود را همچنان خواهند داشت. حافظه EEPROM همانند دیگر حافظه ها در داخل میکروکنترلرهای AVR قرار داشت. اما همانطور که گفته شد، در میکروکنترلر های STM32 چنین حافظه ای وجود ندارد.
تبدیل حافظه Flash به EEPROM
همانطور که در ابتدای آموزش گفته شد. به غیر از استفاده از حافظه های EEPROM خارجی راه دیگری نیز برای ذخیره اطلاعات پس از قطع تغذیه نیز وجود دارد. که این راه تبدیل حافظه Flash به EEPROM است. استفاده از این روش باعث کاهش هزینه پروژه میشود، البته به شرطی که از الگوریتم نرم افزار خاصی استفاده شود. در میکروکنترلر STM32F103 که در این آموزش از آن استفاده میکنیم. جزء سری های میان رده میکروکنترلرهای STM32 هستند. میتوانیم تا ۱ کیلوبایت حافظه EEPROM مجازی بر روی این میکروکنترلر ایجاد کنیم.
پیکربندی میکروکنترلر STM32
پس از ساخت پروژه جدید در نرمافزار STM32CubeMX و انتخاب میکروکنترلر STM32F103C8T6 بایستی بخش SYS و RCC را تنظیم کنید. در صورتی که با تنظیمات مربوط به این بخش ها آشنایی کافی ندارید. ابتدا بخش آول آموزش میکروکنترلر های STM32 را مطالعه کنید. سپس مطالعه این آموزش را ادامه دهید. برای راه اندازی این کتابخانه نیاز به پیکربندی خاصی نیست و در صورتی که در پروژه خود نیاز به پیکربندی دارید، آن را در این بخش تنظیم کنید. سپس بایستی وارد بخش Clock Configuration شده و کلاک میکروکنترلر را بر روی ۷۲ مگاهرتز تنظیم کنید. در آخر در قسمت Project Manager ابتدا نام پروژه و مسیر مورد نظر برای ذخیره پروژه را مشخص کنید. سپس گزینه Toolchain را بروی MDK-ARM و ورژن آن را بر روی ۵ تنظیم کرده و بر روی گزینه GENERATE CODE در قسمت نوار بالایی کلیک کنید تا پروژه ساخته شود.
نصب کتابخانه
برای دانلود کتابخانه EEPROM بایستی ابتدا آن را از این لینک دانلود کنید. برای اضافه کردن کتابخانه به پروژه در نرمافزار KEIL، بایستی پس از ساخت پروژه فایل مربوط به کتابخانه به پوشه پروژه اضافه کنید (بهتر است که فایل های مربوط به هر کتابخانه داخل پوشه ای جداگانهای قرار گیرند). سپس بایستی وارد نرم افزار KEIL شده و از منو Project گزینه Options for Target را انتخاب کنید.
سپس در پنجره باز شده صفحه ++C/C را باز کنید. سپس بر روی گزینه مشخص شده در تصویر زیر کلیک کنید. در پنجره باز شده بر روی گزینه New و سپس بر روی قسمت … کلیک کنید و آدرس پوشه مربوط به کتابخانه مورد نظر را وارد کنید. سپس با کلیک بر روی گزینه OK تمامی پنجره هارا ببندید.
حالا بایستی از نوار سمت چپ (Project) از چارت درختی که فایل های پروژه را نمایش میدهد، بر روی اولین پوشه راست کلیک کرده و گزینه New Group را انتخاب کنید. سپس در این چارت درختی یک New folder ایجاد میشود. نام این New folder را تغیر دهید و سپس بر روی آن دابل کلیک کنید. در صفحه باز شده وارد پوشه کتابخانه شوید و تمامی فایل های مربوط به کتابخانه را به این Group اضافه کنید. سپس با با اضافه کردن هدر فایل هدر کتابخانه به ابتدای کد میتوانید از توابع موجود در کتابخانه در کد خود استفاده کنید.
توابع موجود در کتابخانه
برای استفاده از این کتابخانه ابتدا بایستی نحوه عملکرد توابع موجود در این کتابخانه بدانید. در ادامه با این توابع آشنا می شویم. توابع موجود در این کتابخانه عبارتند از:
uint16_t EE_Init(void) uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data) uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
- EE_Init
این تابع تنظیمات مربوط به تبدیل حافظه Flash به EEPROM را انجام میدهید. این تابع را بایستی در تابع main بعد از توابع HAL_init و SystemClock_Config تعریف شود.
- ۰EE_ReadVariable
این تابع برای خواندن مقدار ذخیره شده داخل حافظه EEPROM استفاده می شود. در طول برنامه پس از ذخیره مقدار مورد در حافظه EEPROM، بعد از خاموش شدن و روشن شدن مجدد با استفاده از این دستور میتواندی مقدار های ذخیره شده را به حالت قبل برگردانید. بنابر این با توجه به این که پس از روشن شدن مجدد سیستم تنها یک بار نیاز به اجرا شدن و خواندن مقدار ها از این حافظه است. مکتن قرار این تابع نیز در تابع main پس از تابع EE_Init است. این تابع دارای ۲ ورودی است. ورودی اول آدرس مکانی از حافظه است که قصد خواندن آن را داریم. و ورودی دوم برای رشته یا متغیری است که داده خوانده شده از حافظه داخل آن قرار میگیرد. برای درک بهتر این مطلب به مثال زیر توجه کنید.
uint16_t EE_Read[256]; for(int i=0;i<256;i++) EE_ReadVariable(i,&EE_Read[i]);
- EE_WriteVariable
این تابع برای همانطور که از نامش پیداست برای نوشتن مقدار داخل حافظه EEPROM استفاده می شود. متغیر هایی که بایستی مقدار آن ها پس از قطع و وصل تغذیه بایستی باقی بماند. پس از هربار تغیر مقدار متغیر بایستی توسط این دستور در حافظه EEPROM ذخیره شوند. این تابع دارای دو ورودی است. ورودی اول برای انتخاب آدرس محلی از حافظه که قرار است مقدار مود نظر داخل آن ذخیره شود، است. و ورودی دوم داده ای است که قصد ذخیره آن را در حافطه EEPROM دخیره کنیم، است. در مثال زیر عدد ۱۰ را در آدرس ۰ از حافظه EEPROM ذخیره کردیم. برای توشتن داخل این حافظه نیاز به مدت زمان ۱۰ میلی ثانیه است. بنا بر این پس از استفاده از این دستور بایستی حتما از یک تاخیر ۱۰ میلی ثانیه یا بیشتر استفاده کنید.
EE_WriteVariable(0,10); HAL_Delay(10);
کدنویسی در نرمافزار KEIL
پس از ساخت پروژه، انجام پیکربندی و اضافه کردن کتابخانه به نرم افزار KEIL بایستی ابتدا وارد فایل main.c شده و فایل هدر مربوط به کتابخانه EEPROM را به برنامه معرفی کنید.
#include "EEPROM.h"
در ادامه برای شروع کار این کتابخانه بایستی در تابع main بعد از توابع HAL_init و SystemClock_Config ، ابتدا اجازه اعمال تغیرات بر روی حافظه Flash را صادر کنید. و پس از آن تابع مربوط به انجام تنظیمات را فراخوانی کنید. برای درک بهتر این مطلب به مثال زیر توجه کنید.
HAL_FLASH_Unlock(); EE_Init();
حالا تنظیمات اولیه انجام شده و شما میتوانید از کتابخانهی EEPROM.h استفاده کنید. کد زیر را به پروژه خود اضافه کنید. در کد زیر هر ۱ ثانیه یک واحد به عدد متغیر Number اضافه می شود. پس از قطع و وصل تغذیه میکروکنترلر عدد ذخیره شده در این متغیر باقی خواهد ماند. توجه داشته باشید که کد زیر را نبایستی بصورت یکجا کپی کرده و داخل پروژه خود قرار دهید. و همانطور که در آموزش های قبل هم گفته شده است بایستی بخش های مختلف کد زیر را به قسمت های معیین شده توسط نرم افزار STM32CubeMX برای کد نویسی کاربر اضافه کنید.
#include "eeprom.h" uint16_t Number; int main(void) { //HAL_Init(); //SystemClock_Config(); HAL_FLASH_Unlock(); EE_Init(); EE_ReadVariable(0,&Number); while (1) { Number++; EE_WriteVariable(0,Number); HAL_Delay(1000); } }
در اخر برای پروگرام برنامه بر روی میکروکنترلرهای stm32 از منوی Project گزینهی Build Target را انتخاب کنید پس از اتمام کامپایل، از منوی Flash گزینه ی Download را انتخاب کنید. پس از پروگرام شدن کامل برنامه روی میکروکنترلر، بار دیگر کلید reset را فشار دهید.
جمع بندی
همانطور که در ابتدای آموزش گفته شد، میکروکنترلر های STM32 برخلاف میکروکنترلر های AVR دارای حافظه EEPROM داخلی نیستند. و برای ذخیره سازی اطلاعات پس از قطعی برق مجبور به استفاده از حافظه های EEPROM خارجی هستیم. اما در این آموزش به نحوه ساخت حافظه EEPROM مجازی یا به عبارت دیگر تبدیل حافظه Flash به حافظه EEPROM پرداختیم. در ابتدا با حافظه EEPROM و نحوه عملکرد آن آنشا شدیم. نکته هایی درباره نحوه تبدیل و میزان حافظه قابل دسترس در میکروکنترلر های میان رده STM32 گفته شد. پس از آن پیکربندی میکروکنترلر و نحوه نصب کتابخانه توضیح داده شد. در آخر نیز با نحوه کدنویسی و استفاده از کتابخانه EEPROM.h در میکروکنترلر های STM32 آشنا شدیم.
لوازم مورد نیاز
برای اجرای این پروژه نیاز به قطعاتی دارید که لیست آن را در زیر مشاهده میکند. برای تهیه این قطعات میتوانید بر روی نام هر یک از آنها کلیک کرده، وارد صفحه محصول شده و خرید کنید.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی از وبسایت دیجی اسپارک حمایت کنید.
سلام مهندس . در بردهای ESP8266 مثل ESP-01 و Wemos D1 کار به چه صورتی هست ؟
با سلام
روند ذخیره و خواندن اطلاعات بر روی حافظه EEPROM در میکروکنترلر های ESP8266 هم مانند میکروکنترلر های STM32 است. میتواند از کتابخانه موجود در لینک زیر استفاده کنید.
https://www.arduino.cc/reference/en/libraries/esp_eeprom
سلام ببخشید چطور میشه حجم eeprom که ساختیم رو افزایش بدیم؟
خیلی خوب و شفاف
ممنونم
با سلام
از توجه شما سپاسگزارم.
سلام و احترام
من از این روش استفاده میکنم. ذخیره میکنه و میخونه. تا اینجا مشکلی ندارم.
مشکل از اینجا شروع میشه:
من زمانی که یک آرایه ۱۴ تایی رو ذخیره میکنم، مقدار اول ذخیره و مابقی مقادیر پاک میشه. یا یا مقدار دوم آرایه رو ذخیره میکنم، مقدار ۱ و مقادیر بعد از اون پاک میشن.
مقادیر ذخیره سازی من توی eeprom:
temp[14]
time[14]
root[14]
read[14]
و مقادیر بدون آرایه دیگه که میتونه از نوع float, char,int و … باشه.
با سلام
بایستی توجه داشته باشید که خانه های حافظه EEPROM میکروکنترلر های AVR هشت بیتی است. و مقادیر بیشتر از ۸ بیت بایتی تبدیل شده و سپس داخل این حافظه ذخیره شود.
لینک کتابخونه باز نمیشه
سلام.خسته نباشید.لطف میکنید تنظیمات آدرس پیج های تابع eeprom.h رو شفاف توضیح بدین.بنده تداخل حافظه دارم با میکرو f103. مثال اینکه استارت از کدوم پیج و آی دی باشه.۲۷۰ تا آدرس دارم.تشکر
سلام وقت بخیر
لینک دانلود کتابخانه غیر فعال شده
امکانش هست لینک دیگه ای قرار بدین برای دانلود .