خیلی وقتها ما نیاز داریم متغیرهای داخل برنامه میکروکنترلر که داریم با قطع برق از بین نرند!
چاره چیه؟
راحت ترین روش استفاده از حافظه 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 رو نشون میده. که اگر کمی دقت کنید داخلش هیچ خبری از حافظه 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 رو به پروژه اصلی
حالا روی فایل MAIN دوبار کلیک می کنم تا این فایل باز شه و در نهایت تمامی کد هایی رو که میخوام در این قسمت می نویسم.
کد نویسی:
ابتدا دقت کنید که در قسمت Include باید حتما EEPROM رو اضافه کنید در غیر اینصورت اگر از توابع اون استفاده کنیم از کد خطا میگیره و اجازه کامپایل شدن رو نمیده.
حالا نوبت به استفاده از EEPROM در برنامه هست.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #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 گرافیکی.
یکی از کاربران عزیز سیسوگ به اسم علی، تجربهی خود را در رابطه با این پست در قسمت کامنتها نقل کردند. خالی از لطف نبود که ما این تجربه بسیار عالی و کاربردی را در پست قرار بدهیم تا شما هم بتوانید از این تجربه در پروژههایتان استفاده کنید. کامنت این دوست عزیز را عینا در ادامه به صورت هایلایت مشاهده میکنید:
برای دریافت سورس کامل پروژه روی لینک زیر کلیک کنید.
با سیسوگ همراه باشید.
درود
در عجبم چرا شرکت st از روش شرکت atmel استفاده نکرده. به نظرم این یه ضعیفه برا st
سلام دوست عزیز
روش شرکت اتمل چی هست ممکنه مقداری مساله رو بیشتر توضیح بدید
سلام مجدد من یکسالی هست از این قابلیت استفاده میکنم چند نکته هست که باید بهش توجه بشه در فایل eeprom.h باید پارامترهای page0 و page1 مطابق میکروی شما مقدار دهی بشه مثلا اگر میکرو ۶۴کیلوبایتی هست نباید page1 بیشتر از ۶۳ باشه. من پیجهای ۶۲ و ۶۳ را انتخاب کردم و کار میکنه ولی با پروگرم مجدد فلش با اینکه گزینه full erase chip غیر فعال کردم بازهم گاهی داده ها میپرند و ریست میشن. دلیلش را متوجه نشدم. نکته دوم اینکه اگر حافظه eeprom شما مثلا ۱کیلوبایت هست نصفش برای ادرس دهی استفاده میشه و در عمل شما ۲۵۶ المان ۱۶بیتی میتونید ذخیره کنید. برای ذخیره اعداد فلوت و دابل و لانگ بهتره از union استفاده کنید. با توجه به اینکه اگثر arm کارها از این قابلیت استفاده میکنن شاید نیاز به یک اموزش مفصل تر باشه.
سلام ممنون از زحماتتون و این که مطلب بالایی خیلی به دردم خرد و مشکل حل شد تشکرات فراوان
ممنونم دوست عزیز برای توضیحاتتون
سلام !
میکرو stm32f103c8t blue pill
چرا در آدرس های بیش از 0x0080 هم کار میکنه !!!
طبق هدر فایلش 0x0080 مربوط به page 3 میشه و خودش page0 رو از 0x0000 و page1 رو از 0x0040کانفیگ کرده.
من تو حلقه از 0x0000 الی 0x008F که تو صفحه سوم میشه مقدار ریختم و بعد از قطعی برق با تابع read تحویل گرفتم.
توقع داشتم محتوای آدرس های بعد از 0x007f خالی باشند بعد از قطعی برق که قرائت کردم.مطلبی هست که متوجه نشده باشم !؟
سپاس
سلام در مورد اون توضیحی که از کامنت دوستان گذاشتین نکته ای جا افتاده:
جهت تنظیم محدوده مورد استفاده از حافظه فلش به عنوان eeprom از دیفاین زیر باید استفاده بشه:
#define EEPROM_START_ADDRESS ((uint32_t)0x0801E000) /* EEPROM emulation start address: after 64KByte of used Flash memory */ //now select sector 120
مثلا اینجا برای میکرو stm32f103c8 من سکتور یا پیج 120 رو برای شروع انتخاب کردم.
نکته مهم اینجاست:
با کمک دو دیفاین
PAGE0
و
PAGE1
درواقع ما محدوده کل eeprom رو انتخاب میکنیم و به میکرو میگیم که چند پیج از حافظه فلش رو برای eeprom استفاده کرده ایم.
برای همین مقدار این دو دیفاین با توجه به نیاز ما و آدرسی که در EEPROM_START_ADDRESS قرار دادیم مشخص میشه.
دوستمون که به مشکل برخوردن دلیلش همین بوده که EEPROM_START_ADDRESS رو تنظیم نکردن این دیفاین بطور پیش فرض سکتور 1 رو انتخاب میکنه نه سکتور 0 و ما هم توی برناممون معمولا اینقدر حجم کد تولیدیمون بالا هست که چند پیج اول رو استفاده میکنیم و باید دقت کنیم که با انتخاب درست EEPROM_START_ADDRESS و دو دیفاین PAGE1 و PAGE0 آدرسی بعد از پایان برناممون رو به eeprom تخصیص بدیم وگرنه مشکلاتی توی برنامه مثل مشکلی کو دوستمون گفتن بوجود میاد.
اگر درست نتونستم بیان کنم به فروم پرسش و پاسخ سیسوگ بیاد و سوالاتتون رو بپرسین.
https://ask.sisoog.com/
با سلام خدمت شما. واقعا ممنونم از شما که اطلاعات خوب و درستتونو در اختیار بقیه قرار میدین. سپاسگزارم از شما. موفق و پایدار باشین
آرایه رو چطور میتونم بریزم توش
بعنوان مثال :
user_time[15]
user_temp[15]
stage[15]
برای این کار باید بایت به بایت آرایه رو توی حافظه ذخیره کنید 🙂
سلام وقت بخیر
من بتازگی میخوام از این روش استفاده کنم
میکرو : STM32F103C8T6 هست که ظاهرا 64کیلوبایت حافظه فلش داره.
با این روش چند کیلوبایت حافظه فلش بهش اختصاص داده میشه؟ مهم.
سلام دوست عزیز
اون بستگی به انتخاب شما داره فکر کنم در این روش حداقل یک یا دو سکتور از حافظه رو باید بهش اختصاص بدید
حالا باید ببینید در میکروکنتلر مورد استفاده شما هر سکتور چند بایت یا کیلو بایت هست
فکر کنم توی این میکرو هر سکتور ۱ کیلو باشه که میشه به عبارتی ۲ کیلو بایت
البته اگر اشتباه نکرده باشم در خصوص ظرفیت هر سکتور
با درود و سپاس.
آیا راهی وجود داره که به حافظه فلش دسترسی 8 بیتی داشت ؟
چون این کتابخانه ظاهرا دسترسی 16 بیتی داره
سلام دوست عزیز
بسته به خانواده میکروکنترلر این دسترسی فرق میکنه
برخی خانواده ها اجازه میدن و برخی نه که به طراحی سخت افزار این مورد بیشتر برمیگرده
اما شما با خاصیت flash ها میتونی دسترسی ۸ بیتی برای خودتون ایجاد کنید – یعنی هشت بیت بی استفاده رو با بیت های یک پر کنید و روی ۱۶ بیت بنویسید – به خوبی کار خواهد کرد.
سچاس ولی اینطوری اصلا خوب نیست .
2 برابر حافظه مصرف میکنه !!
نمیکنه ، منظور من اینه که دوتا یک بایت ذخیره کنید 🙂
ببخشید وقتی رو حافظه فلش تو stm32 هم میشه به صورت بایتی نوشت و هم خوند، چه لزومی برای استفاده از eeprom به این شکل هست؟
سلام دوست عزیز اتفاقا سوال خوبی پرسیدید
درسته که شما میتونید به شکل بایت (در برخی خانواده ها به شکل word ) دیتا رو توی حافظه فلش ذخیره کنید ولی بعد از نوشتن یک بار دیگر قادر به تغییر آن خانه نخواهید بود مگر با erase کردن سکتوری که بایت در آن واقع شده است
بسته به خانواده و میزارن حافظه فلش اندازه سکتور ها از ۱ کیلو تا ۱۲۸ کیلو بایت متغییر هست، یعنی شما برای تغییر یک بایت باید کل سکتور رو پاک کنید که این امر باعث از دست رفتن باقی دیتا ها خواهد شد. اما این کاتابخانه به نحوی این کار را انجام میدهد که شما دیتا را دست ندهید و هر بار نیاز به پاک کردن کل سکتور نباشد (با توجه به عملکرد حافظه های nor )
سلام. ممنون از پستتون. من هم یک راهنمایی برای ذخیره کردن اعداد float میگذارم. که همان طور که نوشتید از union خوبه استفاده بشه. در حقیقت با توجه به اینکه توابع این کتابخانه با uint16 کار می کنند، برای ذخیرهسازی عدد float آن را به دو بخش 16 بیتی تقسیم و ذخیره می کنیم و مجدد با خواندن دو عدد 16 بیتی از فلش این دو را ترکیب و به صورت عدد float در می آوریم.
// Written by Mok, 05/17/2018
// BSD license
#include
#include
uint16_t MSB_16bit_of_float32 ( float float_number){
union
{
float f_number;
uint16_t uint16_arr[2];
} union_for_conv;
union_for_conv.f_number = float_number;
uint16_t MSB_uint16 = union_for_conv.uint16_arr[1];
return MSB_uint16;
}
uint16_t LSB_16bit_of_float32 (float float_number){
union
{
float f_number;
uint16_t uint16_arr[2];
} union_for_conv;
union_for_conv.f_number = float_number;
uint16_t LSB_uint16 = union_for_conv.uint16_arr[0];
return LSB_uint16;
}
float float32_from_two_uint16(uint16_t MSB_uint, uint16_t LSB_uint){
union
{
float f_number;
uint16_t uint16_arr[2];
} union_for_conv;
union_for_conv.uint16_arr[0] = LSB_uint;
union_for_conv.uint16_arr[1] = MSB_uint;
return union_for_conv.f_number;
}
int main ()
{
float a;
uint16_t b;
uint16_t c;
float d;
float no_lsb_float;
a = -0.515646546;
b = MSB_16bit_of_float32(a);
c = LSB_16bit_of_float32(a);
d = float32_from_two_uint16(b,c);
no_lsb_float = float32_from_two_uint16(b,0);
printf ("original f: %f\t MSB16: %d\tLSB16:%d\t final f:%f\t no_lsb_float f:%f\n", a, b,c, d,no_lsb_float);
}
صفحه مربوط به این راهنمایی
http://youngmok.com/split-and-merge-a-32-bit-float-with-two-16-bit-unsigned-integers/
قضیه ساده تر از این حرفهاست!!.
با type casting خیلی راحت میتونی اینکار رو انجام بدی .
مثلا برای فلوت :
uint16_t *var;
var = (uint16_t *)float_var
حالا یکبار var* را ذخیره میکنید و
و یکبار دیگه (1+var)* را ذخیره میکنید .
.بعد موقع خواندن به همین ترتیب میخونید و توی آدرس متغیر فلوت قرار میدید.
با این روش نیاز به تعریف توابع مختلف برای متغیر های مختلف ندارید .
یک تابع برای ذخیره و باز خوانی آرایه تعریف میکنید و با اون تابع و این روش میتونید تمام متغیر های بزرگتر از 16 بیت رو ذخیره کنید .
سلام
بسیار متشکر دوست عزیز
ممنونم برای به اشتراک گذاری تجربه خودتون
با تشکر بسیار از دوستان سیسوگ بابت کتابخونه خوبشون، به بعضی از دلایل که من خودم نمیدونم، بعضی اوقات اطلاعات جدید روی اطلاعات قبلی نوشته نمیشد و این در طی اجرای برنامه مشکل درست میکرد.
از اونجایی که قیمت یه تراشه EEPROM ماکزیمم دوهزارتومن بیشتر نیست، برای تعداد داده های زیاد و کاربردهایی که به پاک کردن و نوشتن زیاد احتیاج دارن، منطقی تر هست که از همون استفاده بشه. البته write cycle یک eeprom خارجی به دلیل کندی در حدود چند میلی ثانیه طول میکشه، در حالی که یک write cycle فلش چندمیکروثانیه هست، اما در عوض حافظه فلش هم ماکزیمم 1000 تا 10,000 بار بیشتر نمیشه توش نوشت، یعنی اصلا برای کاربردهای پاک کردن و نوشتن زیاد طراحی نشده!
سلام
من طبق گفته های شما رفتم جلو متغیر داخل حافظه فلش ریخته میشه اما موقع قطع برق مقدار متغیر پاک میشه
اینم عکس برنامم:https://s4.uupload.ir/files/capture_b82k.png
ممنون میشم راهنماییم کنین
سلام دوستان من از این لایبرری دارم استفاده میکنم فقط یه مشکل وجود داره وقتی یکی از پیج ها پر میشه و سوییچ میکنه روی پیج بعدی، آخرین دیتا ها کپی نمیشن روی پیج جدید. احتمالا شما تا پر شدن کامل یه پیج تست نکردید.
سلام دوست عزیز
تا اونجا که من یادم میاد و کدش رو مطالعه کرده بودم چنین قابلیتی رو داشت و فکر میکنم باید تابعی رو کال کنید اگر اشتباه نکنم
باسلام من از شما بابت این فایل وراهنمای تشکر میکنم وامید موفقیت روز افزون دارم.
ممنون از شما دوست عزیز
سلام. تعداد دفعات رایت روی فلش محدودیت نداره؟
فلش محدودیت ۱۰۰ هزار یا ۱۰ هزار بار رو دارن برای نوشتن – ولی با این تکنیک میتونید تعداد خیلی بالا ببرید
سلام خسته نباشید
کامنت هارو خوندم دیدم یکی دیگه از دوستان مثل من براش سواله که چطور میشه پیج های بیشتری اضافه کرد؟
و اینکه دستور چطور بگیم چقدر از حافظه فلش رو برای eeprom استفاده کنه؟ از میکروی stm32f103c8 استفاده میکنم که 64 کیلوبایت فلش داره حالا فرضا بخوام بگم از 10 کیلوبایت برای eeprom استفاده کنه چطور باید بگم؟ و اینکه یکی از دوستان گفتن: همچنین page های بیشتری تعریف کرد تا بواسطه read write های زیاد حافظه فرسوده نشه. یعنی فرسوده میشه؟ بعد چه مدت؟ چقدر read و write شدن؟
یه سوال دیگه هم دارم اینکه: چند نکته هست که باید بهش توجه بشه در فایل eeprom.h باید پارامترهای page0 و page1 مطابق میکروی شما مقدار دهی بشه مثلا اگر میکرو ۶۴کیلوبایتی هست نباید page1 بیشتر از ۶۳ باشه. من پیجهای ۶۲ و ۶۳ را انتخاب کردم و کار میکنه == چطور انتخاب کنیم که از کدوم پیج استفاده کنه؟
عذرمیخوام اگر طولانی شده بنده مبتدی هستم و تازه دارم با میکرو کنترولر ها کار میکنم
برنامم به 40 کیلوبایت رسید ولی مشکلی پیش نیومد بدون کتابخانه ایپرام
فکر کنم یه جای کتابخانه مشکل داره
امم فکر نمیکنم کتابخانه مشکل داشته باشه
چون توسط خود st ارائه شده
البته آخرین ورژنش رو بهتره از خود سایت st دانلود و تست کنید
با درود
من از این کتابخانه استفاده کردم ولی انگاری بعد از پر شد 32 کیلو بایت حافظه فلش دیگه به درستی کار نمی کنه میکرو
میکر من STM32F103C8 هستش .
حالا نمیدونم مشکل از برنامه ی منه یا کتابخانه یا حافظه فلش میکرو
ولی دستورات مربوط به فراخوانی کتابخانه ایپرام نوشتن و خواندن از روی برنامم بر میدارم مشکل حل میشه
چه مقدار حافظه eeprom لازم دارید توی برنامه ؟
چند تا سکتور برای این کتابخانه اختصاص داده اید ؟
سلام ممنون بابت آموزشتون ولی اگه میشه بیشتر توضیح بدید وقتی توی نوشتن مقدار ادرس 0 رو دادید این صفر دقیقا چیه؟ page0 یا ادرس صفر یا چی؟
سلام دوست عزیز – برای این که جواب سوالتون رو بگیرد باید با نحوه کار این کتابخانه آشنایی داشته باشید – و توضیحش به شکل نوشتاری سخته . خلاصه بخوام بگم برای ذخیره سازی هر بایت در این مدل از eeprom حداقل به ۲ بایت حافظه احتیاج دارید (در صورتی که حافظه eeprom کمتر از ۲۵۵ باشه) یک باید مقدار نوشته شده شما و مقدار دوم آدرس حافظه است. وقتی شما قصد دارید مقدار aa رو روی حافظه 01 ذخیره کنید – این برنامه مقدار 01aa رو توی فلش می نویسه و موقع خوندن مقدار آخرین مقدار نوشته شده برای آدرس ۰۱ رو جستجو میکنه.
سلام مشکل من رو بعد از یک ماه جستجو شما الان با این صفحه حل کردید. خدا خیرتون بده. دمتون گرم. فقط میشه بفرمایید منبع محتوای این صفحه از کجاست؟ میخوام بدونم اگر به مشکل دیگه ای برخوردم کجا میتونم پیدا کنم؟؟؟
من مدت هاست stm32 کار میکنم. اگر سوالی داشتید برای من بفرستید شاید بتونم لطفتون رو جبران کنم … متشکر
سلام دوست عزیز
خواهش میکنم و ممنون از لطف شما
رفرنس دقیقا داکیومنت های st است و البته فروم خود st
سلام مجدد
من یکسالی هست از این قابلیت استفاده میکنم چند نکته هست که باید بهش توجه بشه
در فایل eeprom.h باید پارامترهای page0 و page1 مطابق میکروی شما مقدار دهی بشه مثلا اگر میکرو 64کیلوبایتی هست نباید page1 بیشتر از 63 باشه. من پیجهای 62 و 63 را انتخاب کردم و کار میکنه ولی با پروگرم مجدد فلش با اینکه گزینه full erase chip غیر فعال کردم بازهم گاهی داده ها میپرند و ریست میشن. دلیلش را متوجه نشدم.
نکته دوم اینکه اگر حافظه eeprom شما مثلا 1کیلوبایت هست نصفش برای ادرس دهی استفاده میشه و در عمل شما 256 المان 16بیتی میتونید ذخیره کنید.
برای ذخیره اعداد فلوت و دابل و لانگ بهتره از union استفاده کنید.
با توجه به اینکه اگثر arm کارها از این قابلیت استفاده میکنن شاید نیاز به یک اموزش مفصل تر باشه. ممنون
ممنون برای توضیحات تکمیلی 🙂
سلام
ایا میشه بیشتر از یک سکتور اصلی داشت و حجم eeprom را بیشتر از یک سکتور کرد.مثلا برای میکروی f103c8 که پیشفرض ۱kbحافظه میتونید داشته باشید با تغییراتی مثلا ۳۰ کیلوبایت داشته باشید؟
سوال دوم کتابخانه برای السیدیهای ۱۲۸×۶۴ برای stm32 تست شده سراغ ندارید. من یه تعدادی کتابخونه پورت کردم ولی درست کار نکرد
سلام دوست عزیز
تعداد سکتور رو هر قدر نیاز باشه میشه افزایش داد ولی باید دقت داشته باشید که متغییر ها و حجم eeprom ربطی به تعداد سکتور نداره تا حدودی – بیشتر کردن تعداد سکتور در واقع به شما کمک خواهد کرد که تعداد رایت روی eeprom رو افزایش بدید.
اگر سورس کتابخانه رو ببینید در خواهید دید که متغییر ها در رم نگهداری میشوند – و با حافظه فلش سینک خواهند شد برای قطع برق
امم قبلا پورت کردم – باید بگردم پیدا کنم.
سلام ممنون بابت زحمات شما
از این کتابخونه در آردوینو هم میشه استفاده کرد؟
سلام دوست عزیز
منطقا نباید مشکلی داشته باشه و باید به خوبی کار کنه
احتملا قبلا برای آردوینو کتابخونه شده باشه و نیازی به پورت کردنش نداشته باشید.
سلام
برای stm32f103 همه مراحل جواب میده. مقادیر هم ذخیره میشوند. اما اگر میکرو خاموش و روشن بشه متوجه شدم که مقادیر همه مجددا صفر شدند.
علت چیه؟
تشکر
دلایل متعددی میتونه دخیل باشه !
مثلا آدرس های حافظه فلش اشتباه ست شده باشند ؛ ری اینت اولیه درست انجام نشه
رایت روی فلش میسر نباشه – کمتر از دو سکتور از فلش رو اختصاص داده باشید
سمپل سایت رو دانلود و تست کنید.
سلام
دقیقاً طبق مثال رفتم.
نمیدونم مشکل کجاست
خوب اول شما بفرمایید از چه کامپایلر و چه میکرو کنترلری استفاده میکنید
منظور شماره کامل میکروکنتلر هست
در ضمن آیا موقع کامپایل خطا یا وارنینگی به شما میده یا نه
متشکرم
سلام.
از STM32F103RET6 و CubeIDE استفاده کردم. فایل ها را هم از Repository کپی کردم.
هیچ خطا یا وارنینگی نمیده. حدسم آدرس شروع حافظه هستش.
تشکر
خوب خدا رو شکر دارید از GCC استفاده میکنید
پروژه تون رو بفرستید 🙂
سلام
مشکل تونو به چه صورت حل کردین ؟ من هم همین مشکل دارم
الان مشکل شما دقیقا مشکل همین دوستمون هست ؟
بله – وقتی چیپ خاموش و روشن میکنم از همون ادرس داده های غیر مرتبط به من نشون میده
ببینید قبلا به دوستمون توضیح دادم که مشکل میتونه از کجا باشه
آیا برنامه رو دیباگ کردید ؟ در حالت اولیه متغییر ها توی رم ذخیره میشن که باید با حافظه فلش سینک بشه این مقوله تا مشکلی پیش نیاد – با دیباگ کردن احتمالا میتونید مشکل رو پیدا کنید.
سلام
دوست عزیز مشکل شما حل شد
میشه راهنمایی کنین من هم همین مشکل رو دارم بعد از قطع تغذیه حافظه پاک میشه
“include “main.h #
“include “lcd.h#
<include <stdio.h#
"include "eeprom.h#
;uint16_t Write_Value
;[ uint16_t Read_value[256
;[char str[16
;()HAL_Init
;()HAL_FLASH_Unlock
; () EE_Init
;(HAL_Delay(10
;()lcd_init
:()lcd_clear
(while (1
}
(if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15)==1
}
:(EE_WriteVariable(0,20
;(HAL_Delay(10
;([EE_ReadVariable(0,&Read_value[0
{
;[0]sprintf(str,"value is:%u",Read_value
;(lcd_gotoxy(0,0
;(lcd_puts(str
{
{
سلام ممنون بابت آموزش خوبتون
متاسفانه کتابخانه هایی که سایت st گذاشته برای سال 2012 هست و برای ورژن قدیمی keil جواب میده. به همین خاطر باید ادیت بشه که شما هم فک کنم همین کار کردین.
من هر سایتی رو میگردم با میکرو f1 کار کردن اما من دارم با میکرو f0 کار میکنم. میخواستم بدونم کسی کتاب خانه اصلاح شده eeprom برای میکرو f0 رو داره؟
چرا از همین سورس استفاده نمی کنید ِفکر میکنم با تغییرات کوچک روی میکروی f0 هم به خوبی کار کنه
تغییرات دادم اما متاسفانه کار نکرد
دقت دارید که باید حداقل دو عدد سکتور به این کتابخانه اختصاص بدید ؟!
و البته شما و آدرس سکتور ها احتمالا متفاوت است !
من تغییر دادم و به خوبی کار کرد
می تونم ایمیل یا تلگرام شما رو داشته باشم که راحت تر با هم ارتباط داشته باشیم؟
سلام دوست گرامی
اگر سوالی هست لطف کنید همینجا مطرح کنید تا اگر سوال دیگر دوستان است برطرف شود
متاسفانه خیلی درگیری دارم و امکان صحبت توی پیام رسان رو ندارم.
متشکرم
سلام دوست عزیزم خیلی تفاوتی ندارن اما به صورت کلی برای F0 متاسفانه اموزشی ارائه نشده.
موفق باشید.
شما اگه منطق کار رو متوجه بشید، روی هر میکروی دیگه ای هم میتونید پیاده سازی کنید.
من برای F0 انجام دادم، منتها یه مشکلی دارم.
یکی از مراحل اینه که وقتی قراره نوشتن روی یه پیج فلش رو شروع کنیم، اون پیج رو پاک کنیم. من بعضی وقتا که میخوام پیج رو پاک کنم میکرو هنگ میکنه.
یه احتمال که دادم این بود که اگه همزمان با پاک کردن پیج، یه اینتراپت بیاد، میکرو هنگ میکنه، بنابراین قبل پاک کردن اینتراپتها رو غیر فعال میکردم و بعد از پاک کردن فعا میکردم. مشکلی اینبار پیش اومد این بود که وقتی اینتراپتها رو فعال میکردم میکرو هنگ میکرد.
ولی تو f1 هیچ مشکلی نداشتم
دوستانی که قصد راه اندازی این قابلیت رو برای 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 همین فایل ها هم استفاده بشه و با دیباگر بررسی کنید عملکرد این کتابخونه دقیقا دستتون میاد
ممنون از بچه های سیسوگ
سلام ممنون بابت این آموزش، من کتابخونه eeprom رواز سایت st دانلود کردم و پروژه رو داخل cubeMX ساختم اما این کتابخونه eeprom از HAL پشتیبانی نمیکنه؟ یکم گیج شدم، شما این کتابخونه رو برای HAL خودتون تغییر دادین؟
سلام دوست عزیزم
اگر به اموزش دقت کنید
فایل ها رو لطفا طبق توضیحاتی که دادم به پروژتون اضافه کنید.
در واقع زمانیکه شما فایل رو دانلود میکنید داخل پوشه های SRC و INC هر کدومشون شامل فایل c & .h. هستند که اگر اونارو به پروژتون اضافه کنید مشکلی اصولا نباید داشته باشید.
موفق باشید.
دقیقا همینطوره که گفتید، با فایلهایی که شما گذاشتید مشکلی نیست اما از خود سایت st که دانلود میکنم خطا میده، فایلی که قرار دادین تغییر داده شده برای HAL توسط تیم MCD هستش، ممنونم بابت آموزش عالیتون ان شاء الله روز بروز بالاتر برید…
بله دوست عزیز دقیقا همینطوری است که گفتید چون فایل ادیت شده است
خیلی خوشحال شدم که مشکلتون حل شد.
موفق و پیروز باشید.
سلام ممنون از مطالب عالییتون. فقط من میتونم از کتابخانه های eeprom این پروژه برای stm32f3 استفاده کنم
سلام دوست عزیز، روش چیزی جز این نیست من خودم دقیقا چک نکردم که با قطعیت جواب بدم متاسفانه.
اما فکر نمیکنم تفاوت چندانی داشته باشه در صورتیکه تست کردید و جواب گرفتید ممنون میشم که نتیجه رو کامنت کنید
موفق باشید
سلام من امروز کامل در گیر این مسئله بودم و متوجه شدم فایل رو میشه برای تمام رنج های کرتکس به کار برد. ولی باید تغییراتی در فایل .h داد.(البته خود st برای هر خانواده کرتکس این تغییرات رو داده و من چون با توابع ll-hal کار میکردم دچار مشکل شده بودم که حل شد) همچنین میشه با تغییر آدرس page ها در این فایل از تداخل ادرس پایان برنامه اصلی با ایپرام جلو گیری کرد .همچنین page های بیشتری تعریف کرد تا بواسطه read write های زیاد حافظه فرسوده نشه
سلام دوست عزیز
یه کم بیشتر راجع به page ها توضیح میدین و اینکه چه جوری یه page جدید تعریف کنم…
سلام
ممنون به خاطر اموزش خوب و جالبت خیلی خوب بود
خواهش میکنم دوست عزیز
ممون از اینکه متن رو خوندید و کامنت گذاشتید.
موفق باشید.
سلام. میشه لطف کنید یک راهنمایی بفرمایید در مورد خواندن اطلاعات داخل حافظه فلش و ایپیرام میکرو stm32 به چه صورت هست. با چند تا پروگرامر تست کردم نتونستم بخونم. انگار میکرو قفل هست.