کتابخونه eeprom در STM32

دوستان سلام.
بنده با STM32f030c8t6 و کتابخونه EEPROM مشکل دارم. به اینصورت که تابع EE_Init() باعث هنگ کردن میکرو کنترلر میشه و کلا از تابع بیرون نمیاد. طوری هنگ میکنه که حتی تایمر ها هم از کار میفتن(یعنی توی لوپ گیر نمیکنه).

کسی میدونه چطور میشه این کتابخونه رو برای این میکروکنترلر راه اندازی کرد؟

کتابخونه eeprom رو برای stm32f1 و stm32f4 راه انداختم و تا جایی که یادمه بخاطر حجم زیادی که از حافظه فلش رو میگیره برای میکرو هایی که حافظه فلش کمی دارن این کتابخونه تقریبا قابل استفاده نیست چون با حافظه برنامه اصلی تداخل بوجود میاره.
اما در کل بصورت جدی برای خانواده stm32f0 وارد بحث eeprom نشدم برای همین ممکنه کاملا این حرفم صحیح نباشه.
کتابخونه epprom خود شرکت st رو برای خانواده stm32f0 بگیر و دیتاشیت یا user manual یا application note های مربوطش رو مطالعه کن و به همین بخشی که گفتم (حداقل مقدار حافظه فلش مورد نیازش) توجه بیشتری داشته باش.

1 پسندیده

من قبلا از این کتابخونه زیاد استفاده میکردم، برای تمام سریها ازش استفاده کردم، در یکی از محصولات که به خوبی کار میکرد تعدادی میکروکنترلر از بازار تهیه کردم اما موقع نوشتن روی فلش میکرو هنگ میکرد، خیلی سعی کردم با تغییر زمانبندی یا کار با رجیستری و … مشکل رو حل کنم اما نشد، در نهایت با میکروهای قبلی جایگزین کردم حل شد و از اون موقع به بعد یک ایپرام یا فلش خارجی هم کنار میکرو قرار دادم.

2 پسندیده

این موردی که گفتید:

نقل‌قول1: تعدادی میکروکنترلر از بازار تهیه کردم اما موقع نوشتن روی فلش میکرو هنگ میکرد
نقل‌قول2: در نهایت با میکروهای قبلی جایگزین کردم حل شد

میکرو جدیدی که توی نقل قول اول گفتید از بازار تهیه کردید با میکروهایی که تو نقل قول دوم گفتید با میکرو های قبلی جایگزین کردم حل شد، هر دو یه مدل میکرو بودن؟ میزان حافظه فلش هردو یکی بود و هر دو از یه خانواده بودن؟

1 پسندیده

بله هر دو stm32f103rbt6 بودند ، مثل اینکه میکروها refresh شده بودن و قبلا روی فلشش زیاد رایت شده بود یا اینکه کپی کیفیت پایین بودن. از هر مثلا 5 بار ذخیره کردن دستی تنظیمات یک بارش رو گیر میکرد.

2 پسندیده

ممنون
دیده بودم توی بعضی قطعات بی کیفیت واحد هایی مثل دما سنج داخلی میکرو توی هر دمایی همیشه حدود 27 درجه میده یا شنیده بودم بعضیاشون بخش LSI کار نمیکنه اما فکر نمیکردم بخش flash همچین مشکلی میتونه داشته باشه.

توی ic های حافظه خارجی اطلاعاتم کمه از چه شرکت و چه مدلی استفاده کنم بهتره (eeprom باشه؟ )؟ پیشنهاد شما چیه؟
صرفا میخوام یکسری اعداد ذخیره کنه

1 پسندیده

از ایپرام خارجی مثل AT24Cxx میتونین استفاده کنین، ایرادشون به نظرم

  • سرعت پایین خوندن نوشتن
  • حجم کمشون
  • حساسیت بیشتر پروتکل i2c به نویز به نسبت spi هست که مجبورین انتهای داده ها crc هم ذخیره کنین.
  • مزیتشونم اینه ارزونن
    خوبی فلش خارجی شماره های w25qxx اینه
  • ارتباطش سریع تره، سرعت خوندن نوشتن بیشتره و ارتباطشون spi یا qspi که سرعت بیشتری دارند.
  • حجم بیشتری دارند
  • ایرادشونم اینه باید موقع تولید کد تستی که نوشتین این فلش رو هم یک بار کامل پر و خالی کنه تا از کارکردش اطمینان حاصل کنین، اخیرا از یکی از فروشگاهها تعداد زیادی فلش w25q64 خریدم وقتی متوجه شدم میکرو نمیتونه روشون رایت کنه یه برنامه نوشتم و همه رو تست کردم، دیدم تقریبا تمامشون قسمتی از فلش معیوب شده بود، مشخص بود قطعات معیوب رو از تعمیرگاهها خریده بودن renew کرده بودن :exploding_head: :face_with_spiral_eyes:
2 پسندیده

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

اینجاست که به نظر من باید قبل از استفاده از کتابخونه های آماده ؛ روش کارشون رو بلد باشی نه اینکه مثل من بدون مطالعه و تحقیق فقط include کنی…

مشکل

مشکل این بود که کتابخونه ای که من توی اینترنت تونستم پیدا کنم برای میکرو کنترلر stm32f103 بود که توی فایل eeprom.h فایل stm32f1xx_hal.h اینکلود شده بود که با تغییر به stm32f0xx_hal.h ارور ها برطرف شد و برنامه کامپایل میشد اما توی هریک از توابع Init یا read یا write میکرو کاملا هنگ میکرد.
خب این هنگ برای کتابخونه ای که خود st معرفی کرده غیر منطقی بود.

دلیل

دلیلش هم این بود که میزان حافظه فلش و مقدار eeprom مورد نیاز در کتابخانه ای که برای سری f1 نوشته شده بود با سری f0 متفاوت بود و به همین دلیل ، مثلا آدرسی به کتابخونه ارسال میشد که سری f0 اصلا اون آدرس رو نداشت و باعث هنگ میکروکنترلر میشد.

راه حل بصورت خلاصه

راه حلش هم این بود که باید فایل eeprom.h مربوط به کتابخونه رو دستکاری کنیم و آدرس دهی و میزان eeprom مورد نیازمون رو طبق میکروی مورد نظر(نه فقط f0 بلکه همه سری ها) تنظیم کنیم.
مثلا سری مورد استفاده بنده f030c8t6 بود که حافظه اش 64 کیلو بایت هست که64 پیج 1 کیلوبایتی رو تشکیل میده.
کد من پیج های 0 تا 49 از حافظه فلش رو پر میکرد برای همین باید از پیج 50 به بالا رو برای PAGE0_BASE_ADDRESS و PAGE1_BASE_ADDRESS در فایل eeprom.h در نظر میگرفتم(حداقل فضای درگیر در این کتابخونه 2 پیج هستش) و به همین دلیل پیج های 62 و 63 رو در نظر گرفتم تا اگر حجم کدم بیشتر شد تداخلی نداشته باشه.

البته من کلا چند بایت حافظه نیاز داشتم و کارم راه افتاد اما چند تا چالش در این کتابخونه برای من وجود داره که بعدا وقتی نیاز داشتم حل میکنم:
1- اگر حافظه eeprom زیادی (مثلا 5 کیلو بایت) نیاز داشته باشیم چطور باید آدرس ها رو تنظیم کنیم تا خرابکاری نشه؟
2- از اونجایی که این کتابخونه بصورت 16 بیتی متغیر های مارو ذخیره میکنه ، اگر بخوایم یه رشته چند کارکتری رو ذخیره کنیم ، عملا هر کارکتر ما که 8 بیت هست توی یه فضای 16 بیتی ذخیره میشه و 8 بیت بلا استفاده داریم. چطور میشه این 8 بیت بلا استفاده رو قابل استفاده کرد؟

1 پسندیده

یک موضوع رو باید بهش دقت کنی ئ اونم نوع تقسیم بندی حافظه میکرو ها هستش
مثلا برای حافظه فلش تقسیم بندی از بایت شروع میشه و بعد word بعد … پیج بعد … بلوک
و نوع حافظه فلش اینجوری نیست که بعد از پروگرام کردن و در زمان اجرا برنامه بتونی فقط یک بایت رو مستقیما دستکاری کنی(که درواقع به دستکاری حافظه فلش در زمان اجرا برنامه اینجا میگیم استفاده از حافظه فلش به عنوان eeprom)
و همینطور نمیتونی تنها یک word رو دستکاری کنی و به عنوان حافظه eeprom استفادش کنی.
اینجاست که باید به یوزر منوال یا دیتاشیت میکرو رجوع کنیم و بخش حافظه اون میکرو مورد نظر رو بررسی کنیم تا جایی که یادمه میکرو stm32f407vgt6 پیج ها و بلوک هایی که میشد برای eeprom استفاده کرد از لحاظ میزان فضا با هم متفاوت بودن و بعضی از بلوک ها مثلا 64 کیلو بایت بود! یعنی اگر از اون بلوک استفاده میکردی برای eeprom (آدرس اون بلوک رو میدادی به کتابخونه eeprom) حتی اگر تنها یک بایتش رو استفاده میکردی در عمل کل اون 64 کیلو بایت رزرو میشد.(اگر به نحوه کار کتابخونه eeprom مراجعه شود میبینید منظور از رزرو چیه) و اگر توی اون 64 کیلو بایت شما برنامه ای موقع پروگرام کردن بریزین بعد از گذشت چندین بار از کتابخونه eeprom میبینید که برنامه شما دیگه درست کار نمیکنه.
یخورده گیج کننده هستش اگر جاییش رو متوجه نشدین بگین.


نکته مهم: در مورد کتابخونه eeprom میزان حافظه ای که لازم دارید محاسبه کنید.
بعد حداقل دو پیج که پشت سر هم باشن رو به عنوان آدرس بهش بدین.
محاسبه کردن میزان حافظه مورد نیاز باعث میشه بتونید کمترین پیج هارو برای اینکار جدا کنید تا حافظه برنامه اصلی بیشتری باقی بمونه.

1 پسندیده