اطلاعیه

Collapse
No announcement yet.

ذخیره متغیر در حافظه فلش STM32

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ذخیره متغیر در حافظه فلش STM32

    سلام
    همونطوری که میدونید در میکروکنترلرهای AVR، برای ذخیره متغیر به صورت دائمی در حافظه فلش، در کدویژن از کلمه flash و در اتمل استدیو از کلمه PROGMEM موقع تعریف متغیر استفاده میشه.
    میخواستم بدونم برای میکروکنترلرهای STM32 به چه شکلی این کار شدنیه؟ اصلا امکانش وجود داره؟ قصد من ذخیره یک آرایه در حد چند کیلو بایت به صورت دائمی و بدون تغییره و نمیخوام بی دلیل فضای SRAM با این آرایه اشغال بشه.
    ضمنا من از بورد کاتالیست STM32F407، نرم افزار keil و توابع CMSIS استفاده میکنم.

    #2
    پاسخ : ذخیره متغیر در حافظه فلش STM32

    در نمونه کدهای یک کد هست به نام eeprom.h و eeprom.c این دو فایل یک سری تابع تعریف شده که یک سکشن فلش را به عنوان ذخیره داده تعریف می کند. فقط اگر موقعی کل فلش را فرمت کنید این داده ها پاک می شود.

    دیدگاه


      #3
      پاسخ : ذخیره متغیر در حافظه فلش STM32

      نوشته اصلی توسط hossein.m98 نمایش پست ها
      سلام
      همونطوری که میدونید در میکروکنترلرهای AVR، برای ذخیره متغیر به صورت دائمی در حافظه فلش، در کدویژن از کلمه flash و در اتمل استدیو از کلمه PROGMEM موقع تعریف متغیر استفاده میشه.
      میخواستم بدونم برای میکروکنترلرهای STM32 به چه شکلی این کار شدنیه؟ اصلا امکانش وجود داره؟ قصد من ذخیره یک آرایه در حد چند کیلو بایت به صورت دائمی و بدون تغییره و نمیخوام بی دلیل فضای SRAM با این آرایه اشغال بشه.
      ضمنا من از بورد کاتالیست STM32F407، نرم افزار keil و توابع CMSIS استفاده میکنم.
      سلام، متغیر رو به صورت const تعریف کن. مثلا
      const char x = 0; 

      دیدگاه


        #4
        پاسخ : ذخیره متغیر در حافظه فلش STM32

        نوشته اصلی توسط gordany نمایش پست ها
        سلام، متغیر رو به صورت const تعریف کن. مثلا
        const char x = 0; 
        تعریف شما یک متغییر ثابت هست و در صورت تغییر با ریست میکرو به مقدار اولیه بر میگرده.

        همونطوری که کاربر "Faateh" گفتند، تنها راهش استفاده از eeprom مجازی هست که توسط توابع SPL در اختیار هست. کار باهاش به سادگی کدویژن و اتمل استدیو نیست، اما خیلی هم سخت نیست.
        هر انسانی که احساس بی نیازی کند سرکش و طغیان گر می شود...

        دیدگاه


          #5
          پاسخ : ذخیره متغیر در حافظه فلش STM32

          نوشته اصلی توسط hamid-69 نمایش پست ها
          تعریف شما یک متغییر ثابت هست و در صورت تغییر با ریست میکرو به مقدار اولیه بر میگرده.

          همونطوری که کاربر "Faateh" گفتند، تنها راهش استفاده از eeprom مجازی هست که توسط توابع SPL در اختیار هست. کار باهاش به سادگی کدویژن و اتمل استدیو نیست، اما خیلی هم سخت نیست.
          چجوری باید یه آرایه با چند هزار عضو رو تعریف کنم؟ یعنی باید تک به تک اعضا رو بدم به تابع تا بریزه رو فلش؟ بحث 10 یا 20 عضو نیست؛ بحث 90هزارتا و 100 هزارتاس

          دیدگاه


            #6
            پاسخ : ذخیره متغیر در حافظه فلش STM32

            نوشته اصلی توسط hamid-69 نمایش پست ها
            تعریف شما یک متغییر ثابت هست و در صورت تغییر با ریست میکرو به مقدار اولیه بر میگرده.

            همونطوری که کاربر "Faateh" گفتند، تنها راهش استفاده از eeprom مجازی هست که توسط توابع SPL در اختیار هست. کار باهاش به سادگی کدویژن و اتمل استدیو نیست، اما خیلی هم سخت نیست.
            سلام دوست عزیز، سوال کننده میخوان جایی در حافظه فلش آرایه ای رو ذخیره کنند و همونطور که گفتن اون آرایه ثابت و بدون تغییر هست یعنی قرار هست از حافظه فلش فقط عملیات خواندن از روش انجام بشه. و راهی که بهشون گفتم درست هست اون موردی را که شما میگید برای استفاده از حافظه flash به عنوان eeprom هست که ربطی به سوال نداره. موفق باشید.

            دیدگاه


              #7
              پاسخ : ذخیره متغیر در حافظه فلش STM32

              نوشته اصلی توسط gordany نمایش پست ها
              سلام دوست عزیز، سوال کننده میخوان جایی در حافظه فلش آرایه ای رو ذخیره کنند و همونطور که گفتن اون آرایه ثابت و بدون تغییر هست یعنی قرار هست از حافظه فلش فقط عملیات خواندن از روش انجام بشه. و راهی که بهشون گفتم درست هست اون موردی را که شما میگید برای استفاده از حافظه flash به عنوان eeprom هست که ربطی به سوال نداره. موفق باشید.
              سلام. ممنونم که قصد کمک کردن به بنده رو دارید
              مطمئنید که صرف بکار بردن عبارت const باعث میشه متغیر در فلش ذخیره بشه؟ تا اونجا که من میدونم این کلمه فقط از تغییر مقدار متغیر جلوگیری میکنه و متغییر باز هم روی فضای RAM ساخته میشه؛ حداقل در AVR که میدونم به این شکله.
              اگر کسی راه بهتری میشناسه لطفا معرفی کنه.

              دیدگاه


                #8
                پاسخ : ذخیره متغیر در حافظه فلش STM32

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

                چون ظاهرا خیلی علاقه ای به مطالعه ندارید من یک آزمایش ساده روبرتون قرار میدم، یک آرایه به طول بیشتر از حافظه رمتون ایجاد کنید. قاعدتا با خطای کامپایلر مواجه میشید، این دفعه با const اینکار رو بکنید و به من بگید این آرایه که ایجاد شد در کجا ایجاد شده رم یا فلش؟
                چون میدونم باز میای پست میذاری به جای تست کردن خودم برات این تست رو انجام دادم ، روی یه میکروی STM32F103 که 20 کیلو بایت رم داره. یه آرایه 40 کیلوبایتی توی کد ایجاد کردم.( اون خط توی main هم فقط برای اینه که بهینه سازی کامپایلر حذف نکنه آرایه رو به خاطر این که استفاده ای ازش نشده. )
                عکس اول ایجاد آرایه روی رم


                عکس دوم ایجاد آرایه روی فلش



                توصیه من به شما اینه که بیشتر با کامپایلر و معماری پردازنده ای که باهاش کار میکنید آشنا بشید و علمی تر با قضیه برخورد کنید و صرفا به کد زدن از طریق کدهای آماده اکتفا نکنید.این روزا همه با گیت هاب کد نویس شدند. برای شروع تحقیق کن ببین اون چهار تا پارامتری که کیل هنگام کامپایل موفق تولید میکنه و جلوی program size نوشته شده (پایین عکس دوم) چه معنی میده.
                موفق باشید.

                دیدگاه


                  #9
                  پاسخ : ذخیره متغیر در حافظه فلش STM32

                  نوشته اصلی توسط gordany نمایش پست ها
                  دوست عزیز انتظار داشتم قبل از دادن یک پست جدید حداقل راه حلی که بهتون گفتم رو تست میکردید. این هم لینک اگر دوست دارید بیشتر بدونید:

                  چون ظاهرا خیلی علاقه ای به مطالعه ندارید من یک آزمایش ساده روبرتون قرار میدم، یک آرایه به طول بیشتر از حافظه رمتون ایجاد کنید. قاعدتا با خطای کامپایلر مواجه میشید، این دفعه با const اینکار رو بکنید و به من بگید این آرایه که ایجاد شد در کجا ایجاد شده رم یا فلش؟
                  چون میدونم باز میای پست میذاری به جای تست کردن خودم برات این تست رو انجام دادم ، روی یه میکروی STM32F103 که 20 کیلو بایت رم داره. یه آرایه 40 کیلوبایتی توی کد ایجاد کردم.( اون خط توی main هم فقط برای اینه که بهینه سازی کامپایلر حذف نکنه آرایه رو به خاطر این که استفاده ای ازش نشده. )
                  عکس اول ایجاد آرایه روی رم


                  عکس دوم ایجاد آرایه روی فلش



                  توصیه من به شما اینه که بیشتر با کامپایلر و معماری پردازنده ای که باهاش کار میکنید آشنا بشید و علمی تر با قضیه برخورد کنید و صرفا به کد زدن از طریق کدهای آماده اکتفا نکنید.این روزا همه با گیت هاب کد نویس شدند. برای شروع تحقیق کن ببین اون چهار تا پارامتری که کیل هنگام کامپایل موفق تولید میکنه و جلوی program size نوشته شده (پایین عکس دوم) چه معنی میده.
                  موفق باشید.
                  سلام و عرض تشکر دوباره
                  اتفاقا برعکس تصور شما من اصلا از کدهای آماده و به قول معروف لقمه جویده شده خوشم نمیاد! در مورد معماری چیزایی که باهاشون کار میکنم هم خیلی حساسم. همونطوری که گفتم در avr و اتمل استدیو باید از کلمه PROGMEM برای این منظور استفاده کرد و برای باز خوانی حافظه باید از یسری شبه تابع مثل PGM_READ_BYTE استفاده کرد. از اونجایی که اگر صرفا از کلمه const استفاده میشد، به شکل مستقیم میشد به متغییر دسترسی داشت و احتیاجی به استفاده از PGM_READ_BYTE و امثال اون نبود، پیش خودم نتیجه گرفتم که احتمالا کلمه const نباید ربطی به محل ذخیره داشته باشه. ظاهرا با استدلال شما تصوراتم تا حالا غلط بوده
                  به هر صورت خودآموزی مشکلات این چنینی هم داره دیگه

                  دیدگاه


                    #10
                    پاسخ : ذخیره متغیر در حافظه فلش STM32

                    این رو در نظر بگیر کامپایلری که اونجا استفاده میکردی GCC بوده ولی کامپایلر keil (C51) متفاوته. یکی از تفاوت ها همین const.

                    دیدگاه


                      #11
                      پاسخ : ذخیره متغیر در حافظه فلش STM32

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

                      دیدگاه


                        #12
                        پاسخ : ذخیره متغیر در حافظه فلش STM32

                        نوشته اصلی توسط afshinrp نمایش پست ها
                        سلام.
                        با LPC1788 کار میکنم. تعدادی متغیر را میخوام در حافظه ذخیره کنم که با ریست از بین نرن. از طرفی کاربر در مواقع لزوم با استفاده از دستورات ورودی مثل ال سی دی تاچ، ارتباط سریال و .. این متغیرها را مقدار دهی جدید بکنه. از کدوم حافظه باید استفاده بشه؟
                        البته ببخشید که نوع میکرو با عنوان تاپیک فرق میکنه.
                        تو بخش nxp به نظرم بهتر به جواب می رسید
                        ظاهرا این میکروها حافظه ای تو پرام ندارن که بشه کاری که شما گفتید رو انجام داد
                        ولی میشه از بخشی از حافظه فلش با کدهای خاصی به این مقصود رسید
                        اللهم صل علی محمد و ال محمد و عجل فرجهم
                        پیامبر اکرم(ص):زکات علم نشر آن است.
                        در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

                        دیدگاه


                          #13
                          پاسخ : ذخیره متغیر در حافظه فلش STM32

                          نوشته اصلی توسط afshinrp نمایش پست ها
                          سلام.
                          با LPC1788 کار میکنم. تعدادی متغیر را میخوام در حافظه ذخیره کنم که با ریست از بین نرن. از طرفی کاربر در مواقع لزوم با استفاده از دستورات ورودی مثل ال سی دی تاچ، ارتباط سریال و .. این متغیرها را مقدار دهی جدید بکنه. از کدوم حافظه باید استفاده بشه؟
                          البته ببخشید که نوع میکرو با عنوان تاپیک فرق میکنه.
                          سلام،
                          LPC1788 حافظه EEPROM داره، که حدودا 4 کیلوبایته، بهتره از اون استفاده بکنی.
                          با این حال اگر نخوای از اون استفاده کنی روش هایی وجود داره که مقدار متغییر رو در فلش بنویسی که پیچیده تره.
                          هر انسانی که احساس بی نیازی کند سرکش و طغیان گر می شود...

                          دیدگاه


                            #14
                            پاسخ : ذخیره متغیر در حافظه فلش STM32

                            سلام دوستان ببخشید من کلا در زمینه متغیر ها در STM مشکل دارم و مثلا مثل AVR نیستن یه منبع خوب که بشه انواع متغیر ها رو در کامپایلر Keil بگه نمیشناسید؟ خیلی لازم میشه من اصلا این متغیرها رو نمیشناسم و سردرگمم ...


                            سپاس از شما دوستان.
                            Nobody knew her name
                            But she turned up just the same
                            There was a knock on the door
                            A thump on the floor
                            And the party turned insane
                            As she called out her na-a-a-ame

                            And then she walked in looking like dynamite
                            She said, "Now come along boogaloo through the night"
                            And by the way she's moving, well Dyna might
                            Might she not, with all she's got
                            She's got the whole town lighting up dynamite
                            Nobody quite knowing what to do wrong or right
                            But they all know Dyna is dynamite
                            And they're right

                            دیدگاه


                              #15
                              پاسخ : ذخیره متغیر در حافظه فلش STM32

                              سلام دوستان.
                              بنده یک کتابخانه ای توسط CMSIS برای مقداردهی به حافظه flash میکروهای سری (STM32F030x نوشتم .(میکرو استفاده شده STM32F030K6T6 هست با 32 کیلوبایت فلش). دقیقا هم مراحل رو بر اساس منوال خود ST پیش بردم ولی نمیدونم چرا وقتی خروجی میگیرم آدرس های مشخص در حافظه فلش مقادیر 0xFFFF رو به جای مقادیر ورودی برمیگردونن. فایل flash.c را در ادامه قرار میدهم:




                              #include "flash.h"
                              /**
                              * @brief Flash Unlock
                              */
                              void flash_unlock(void)
                              {
                              //Wait for finishing already flash operations
                              while((FLASH->SR & FLASH_SR_BSY))
                              {
                              //Check that the Flash is unlocked
                              if(FLASH->CR & FLASH_CR_LOCK)
                              {
                              //Unlocking flash key sequences
                              FLASH->KEYR = Flash_Key1;
                              FLASH->KEYR = Flash_Key2;
                              }
                              }
                              }


                              /**
                              * @brief Flash Lock
                              */
                              void flash_lock(void)
                              {
                              FLASH->CR |= FLASH_CR_LOCK;
                              }
                              /**
                              * @brief Erase
                              */
                              void flash_erase(uint32_t pageAddrs)
                              {
                              //wait busy flag
                              while(FLASH->SR & FLASH_SR_BSY);
                              //Enable PER bit
                              FLASH->CR |= FLASH_CR_PER;
                              //Set page address
                              FLASH->AR = pageAddrs;
                              //Start Erase
                              FLASH->CR |= FLASH_CR_STRT;
                              //Wait for Busy
                              while(FLASH->SR & FLASH_SR_BSY);
                              if ((FLASH->SR & FLASH_SR_EOP) != 0) /* (5) */
                              {
                              FLASH->SR = FLASH_SR_EOP; /* (6)*/
                              }
                              //Disable PER bit
                              FLASH->CR &= ~(FLASH_CR_PER);


                              }
                              /**
                              * @brief Write-16bits
                              */
                              void flash_write16(uint32_t addrs, uint16_t *pBuf, uint32_t len)
                              {
                              //For loop
                              for(uint32_t i=0; i<len ; i++)
                              {
                              //Start PG bit
                              FLASH->CR |= FLASH_CR_PG;
                              //Write to the desired address u16
                              *(__IO uint16_t*)addrs=pBuf[i];
                              addrs+=2;
                              }
                              //wait busy flag
                              while(FLASH->SR & FLASH_SR_BSY);
                              if ((FLASH->SR & FLASH_SR_EOP) != 0) /* (4) */
                              {
                              FLASH->SR = FLASH_SR_EOP; /* (5) */
                              }
                              //Clear PG bit
                              FLASH->CR &= ~FLASH_CR_PG;
                              }
                              /**
                              * @brief Read-16bits
                              */
                              void flash_read16(uint32_t addrs, uint16_t *pBuf, uint32_t len)
                              {
                              //For loop
                              for(uint32_t i=0; i<len ; i++)
                              {


                              //Write to the desired address u16
                              pBuf[i]= *(__IO uint16_t*)addrs;
                              addrs+=2;
                              }
                              }




                              دلیل: ادغام دو پست برای جلوگیری از اسپم

                              و دستورات ارسال مقادیر به حافظه flash هم بصورت زیر هست:



                              flash_unlock();
                              flash_erase(0x08007C00);
                              uint16_t writebuf[3]={0x1122,0x3344,0x5566};
                              flash_write16(0x08007C00, writebuf, 3);
                              flash_lock();
                              uint16_t readbuf[3];
                              flash_read16(0x08007C00, readbuf, 3);
                              printf("The flash Data are: 0x%04X,0x%04X,0x%04X\n",readbuf[0],readbuf[1],readbuf[2]
                              );

                              دیدگاه

                              لطفا صبر کنید...
                              X