برد STM ترفند

شبیه سازی حافظه EEPROM در میکروکنترلر STM32 با برد Bluepill

نوشته شده توسط علی زاهدی

در میکروکنترلر های AVR برای ذخیره اطلاعاتی که نیاز بود. پس از قطع برق باقی بمانند. از حافظه EEPROM موجود در میکروکنترلر استفاده می کردیم. اما در میکروکنترلر های STM32 چنین حافظه ای وجود ندارد. برای ذخیره اطلاعات بایستی از حافظه های خارجی استفاده شود. اما راه دیگری نیز وجود دارد تا بتوان این اطلاعات را پس از قطع تغذیه میکروکنترلر نیز نگه داشت و در هزینه ها نیز صرفه جویی کرد. در این پست قصد داریم تا نحوه جایگزینی حافظه EEPROM را با حافظه Flash میکروکنترلر STM32 را آموزش دهیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 


حافظه EEPROM


در میکروکنترلر ها حافظه های مختلفی وجود دارد. یکی از انواع حافظه ها که در برخی از میکروکنترلر ها وجود دارد، حافظه EEPROM است. کلمه EEPROM مخفف عبارت Electrically Erasable Programmable Read-Only Memory به معنای حافظه فقط خواندنی قابل برنامه ریزی و پاکسازی بصورت الکتریکی است. این نوع حافظه نوع پیشرفته تری از حافظه EPROM است. همانطور که گفته شد مقادیری که در این حافظه ذخیره شوند با قطع شدن تغذیه میکروکنترلر از بین نمیروند و پس از روشن شدن مجدد، مقداری که قبل از قطع شدن تغذیه در آن ذخیره شده بود را  همچنان خواهند داشت.  حافظه EEPROM همانند دیگر حافظه ها در داخل میکروکنترلرهای AVR قرار داشت. اما همانطور که گفته شد، در میکروکنترلر های STM32 چنین حافظه ای وجود ندارد.

type of memories

 


تبدیل حافظه Flash به EEPROM


همانطور که در ابتدای آموزش گفته شد. به غیر از استفاده از حافظه های EEPROM خارجی راه دیگری نیز برای ذخیره اطلاعات پس از قطع تغذیه نیز وجود دارد. که این راه تبدیل حافظه Flash به EEPROM است. استفاده از این روش باعث کاهش هزینه پروژه می‌شود، البته به شرطی که از الگوریتم نرم افزار خاصی استفاده شود. در میکروکنترلر STM32F103 که در این آموزش از آن استفاده می‌کنیم. جزء سری های میان رده میکروکنترلرهای STM32 هستند. میتوانیم تا ۱ کیلوبایت حافظه EEPROM مجازی بر روی این میکروکنترلر ایجاد کنیم.

تبدیل حافظه Flash به EEPROM در برد STM32 - دیجی اسپارک

 


پیکربندی میکروکنترلر STM32


پس از ساخت پروژه جدید در نرم‌افزار STM32CubeMX و انتخاب میکروکنترلر STM32F103C8T6 بایستی بخش SYS و RCC را تنظیم کنید. در صورتی که با تنظیمات مربوط به این بخش ها آشنایی کافی ندارید. ابتدا بخش آول آموزش میکروکنترلر های STM32 را مطالعه کنید. سپس مطالعه این آموزش را ادامه دهید. برای راه اندازی این کتابخانه نیاز به پیکربندی خاصی نیست و در صورتی که در پروژه خود نیاز به پیکربندی دارید، آن را در این بخش تنظیم کنید. سپس بایستی وارد بخش Clock Configuration شده و کلاک میکروکنترلر را بر روی ۷۲ مگاهرتز تنظیم کنید. در آخر در قسمت Project Manager ابتدا نام پروژه و مسیر مورد نظر برای ذخیره پروژه را مشخص کنید. سپس گزینه Toolchain را بروی MDK-ARM و ورژن آن را بر روی ۵ تنظیم کرده و بر روی گزینه GENERATE CODE در قسمت نوار بالایی کلیک کنید تا پروژه ساخته شود.

برد STM32 و تنظیمات STM32CubeMX Crystal دیجی اسپارک

 


نصب کتابخانه


برای دانلود کتابخانه EEPROM بایستی ابتدا آن را از این لینک دانلود کنید. برای اضافه کردن کتابخانه به پروژه در نرم‌افزار KEIL، بایستی پس از ساخت پروژه فایل مربوط به کتابخانه به پوشه پروژه اضافه کنید (بهتر است که فایل های مربوط به هر کتابخانه داخل پوشه ای جداگانه‌ای قرار گیرند). سپس بایستی وارد نرم افزار KEIL شده و از منو Project گزینه Options for Target را انتخاب کنید.

نرم افزار KEIL و روش نصب کتابخانه

 

سپس در پنجره باز شده صفحه ++C/C را باز کنید. سپس بر روی گزینه مشخص شده در تصویر زیر کلیک کنید. در پنجره باز شده بر روی گزینه New و سپس بر روی قسمت … کلیک کنید و آدرس پوشه مربوط به کتابخانه مورد نظر را وارد کنید. سپس با کلیک بر روی گزینه OK تمامی پنجره هارا ببندید.

افزودن کتابخانه در نرم افزار کیل options for target - دیجی اسپارک

حالا بایستی از نوار سمت چپ (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 آشنا شدیم.

 


لوازم مورد نیاز


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

 

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

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی از وبسایت دیجی اسپارک حمایت کنید.

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

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۸ دیدگاه

  • سلام و احترام

    من از این روش استفاده میکنم. ذخیره میکنه و میخونه. تا اینجا مشکلی ندارم.
    مشکل از اینجا شروع میشه:
    من زمانی که یک آرایه ۱۴ تایی رو ذخیره میکنم، مقدار اول ذخیره و مابقی مقادیر پاک میشه. یا یا مقدار دوم آرایه رو ذخیره میکنم، مقدار ۱ و مقادیر بعد از اون پاک میشن.

    مقادیر ذخیره سازی من توی eeprom:
    temp[14]
    time[14]
    root[14]
    read[14]

    و مقادیر بدون آرایه دیگه که میتونه از نوع float, char,int و … باشه.

    • با سلام
      بایستی توجه داشته باشید که خانه های حافظه EEPROM میکروکنترلر های AVR هشت بیتی است. و مقادیر بیشتر از ۸ بیت بایتی تبدیل شده و سپس داخل این حافظه ذخیره شود.