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

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

همونطور که میدونید، حافظه فلش FALSH تحت عنوان PROGRAM MEMORY شناخته میشه که محلی برای ذخیره برنامه هست و یک حافظه غیر فرار حساب میشه. حافظه SRAM هم تحت عنوان DATA MEMORY شناخته میشه که برای ذخیره متغیرها استفاده میشه و از نوع حافظه فرار هست یعنی با قطع تغذیه، تمومی اطلاعات موجود تو این حافظه از دست میره.

برای اینکه بتونیم داده خودمون رو حتی با قطع تغذیه در میکروکنترلر STM32 حفظ کنیم دو راه اصلی پیش روی ما خواهد بود:

  1. استفاده از آیسی های EEPROM خارجی مثل AT24Cxx و ... که در نهایت با استفاده از پروتکل I2C توسط میکروکنترلر داده نوشته یا خونده میشه
  2. استفاده از حافظه فلش FLASH میکروکنترلر که به نوعی حافظه EEPROM شناخته میشه. طبیعتا مشخصه که بعد از قطع تغذیه، برنامه از روی میکرو پاک نمیشه بنابراین ما میتونیم از این حافظه برای ذخیره داده های خودمون بهره بگیریم.

تو این جلسه قصد داریم با هم آموزش ببینیم که چجوری میتونیم در حافظه فلش میکروکنترلر خودمون داده ها رو بنویسیم و در نهایت داده رو از اون قرائت کنیم.

قبل از هر چیزی لازمه بدونیم که ساختار حافظه فلش و آدرس مربوط به اون در میکروکنترلرهای STM32 به چه صورت هست. ما این مورد رو برای میکروکنترلر STM32F030R8 مورد بررسی قرار میدیم. تنظیمات خاصی در نرم افزار STM32CUBEMX نیاز نیست انجام بدیم، صرفا مثل همیشه SERIAL WIRE رو برای حالت دیباگ فعال میکنیم و کلاک میکروکنترلر رو هم روی حداکثر اون تنظیم میکنیم. نیازی به پیکربندی واحدهای دیگه نخواهیم نداشت.

 

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

 

با مراجعه به REFERENCE MANUAL، همونطور که تو تصویر بالا مشخصه، حافظه فلش این سری از میکروکنترلرهای STM32 دارای 16 سکتور هست که هر سکتور خودش شامل 4 PAGE میشه. هر PAGE از حافظه فلش میکروکنترلر دارای 1 کیلوبایت حافظه هست. آدرس هر کدوم از این پیج ها هم به سادگی و با در نظر گرفتن 1 کیلوبایت حافظه برای هر پیج قابل محاسبه است. ما از این PAGE ها برای ذخیره کردن داده خودمون استفاده خواهیم کرد.

قبل از هر چیزی سوال مهمی ممکنه براتون پیش اومده باشه! اگه حافظه فلش برای ذخیره برنامه استفاده میشه، از کجا معلوم ما داده رو روی برنامه خودمون ننویسیم و همه چیز رو نابود نکنیم؟! سوال به جایی که باید بهش پاسخ داده بشه.

برای نوشتن داده روی حافظه فلش، ما باید بدونیم که برنامه تا چه بخشی از حافظه فلش FLASH میکرو رو اشغال کرده و داده خودمون رو بعد از اون آدرس ذخیره کنیم. خب چطور؟!

این کار توی کامپایلرهای مختلف میتونه متفاوت باشه اما در کامپایلر KEIL بعد از این که کد خودتون رو BUILD کردین کافی هست سه مقدار CODE,RO-DATA,RW-DATA رو مطابق تصویر با هم جمع کنید و مقدار هگز اون رو با شروع حافظه فلش یعنی 0x08000000 جمع کنید. با این کار شما میتونید بفهمید که حافظه فلش شما تا چه آدرسی پر شده و از چه آدرسی به بعد خالیه( در این صورت مقدار ff توی خونه های حافظه قرار میگیره)

 

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

 

مثلا در اینجا در برنامه نمونه ای که ما نوشتیم خواهیم داشت:

3696 =3412+260+24

 بنابراین تا آدرس 0x8000E70 از حافظه فلش ما پر خواهد بود و ما داده خودمون رو باید در بخش هایی بعد از این آدرس ذخیره کنیم. اگر برنامه رو به حالت دیباگ ببریم و از قسمت VIEW گزینه MEMORY WINDOWS یکی از گزینه ها رو انتخاب کنیم و در قسمت جستجوی مربوطه،  این آدرس و یک خونه قبل از این آدرس رو وارد کنیم صحت محاسبات ما تایید میشه

 

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

 

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

 

خب حالا آماده هستیم که متغیرهای خودمون رو در حافظه فلش میکروکنترلر STM32 ذخیره کنیم. برای این منظور معمولا آدرسی انتخاب میشه که حاشیه مناسبی از حافظه برنامه داشته باشه. ما قصد داریم داده خودمون رو در پیج شماره 28 بنویسیم. بنابراین آدرسی که به اون احتیاج خواهیم داشت، 0x08007000 خواهد بود.

روال کار برای نوشتن داده در حافظه فلش به کمک کتابخونه HAL در STM32 شامل مراحل زیر خواهد بود:

  • UNLOCK کردن حافظه FLASH به منظور ایجاد تغییرات بر روی آن
  • ERASE کردن این حافظه که خودش شامل تعیین سه پارامتر خواهد بود: تعداد پیجی که قراره پاک شه، آدرس اون پیج و روش پاک کردن فلش که میتونه به صورت کامل MASERASE باشه یا این که فقط پیج ها رو پاک کنه PAGES.
  • پروگرام کردن حافظه فلش که خودش شامل تعیین سه قسمت مختلف خواهد بود:
  1. طول داده: میتونه    (64bits) HALF WORD(16 bits)، WORD(32 bits)، DOUBLE WORD باشه
  2. آدرس پیج
  3. داده مورد نظر
  • LOCK کردن حافظه فلش به منظور محافظت از این حافظه

در تصویر زیر کد مورد نیاز برای پیاده سازی نوشتن و خواندن داده به/از فلش FLASH قابل مشاهده است:

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

 

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

 

در این کد، flashErase یک استراکچر از نوع FLASH_EraseInitTypeDef هست و errorFlash هم متغیری هست که اگر میکرو نتونه پیج موردنظر رو پاک کنه بیت مربوط به اون پیج در این متغیر برابر صفر میشه و میشه ازش به عنوان عملیاتی برای چک کردن پاک شدن صحیح حافظه فلش استفاده کرد.

هم چنین از تابع Read_Flash  هم برای قرائت داده در آدرس مشخص و ذخیره کردن مقدار اون در متغیر flashVar استفاده شده. در نهایت با اجرای برنامه و بردن میکروکنترلر به حالت دیباگ نتیجه به صورت زیر خواهد بود:

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

 

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

 

توجه کنید که داده در حافظه فلش به صورت MSB First ذخیره شده اما در هنگام قرائت داده نیازی نیست که ما این مسئله رو درنظر داشته باشیم.

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

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

 

قبل از اینکه مطالب این جلسه رو به پایان برسونیم باید این نکته ذکر بشه که استفاده از حافظه FLASH میکروکنترلر STM32 اونقدرا هم بی عیب نیست. مشکل اصلی این حافظه طول عمر اونه که محدوده و نوشتن و خوندن اطلاعات نهایتا تا 10 هزار بار و در حافظه های جدیدتر تا 100هزار مرتبه امکان پذیره!

 

امیدواریم از این آموزش استفاده برده باشید!

 

دانلود پروژه

ESF Drive Flash.rar

با سایر آموزش های اصفهان درایو همراه باشید!

 

 

 

 

۵
از ۵
۳ مشارکت کننده

بلاگ تخصصی اصفهان درایو