اطلاعیه

Collapse
No announcement yet.

برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

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

    #16
    پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

    نوشته اصلی توسط ubub نمایش پست ها
    مهندس جان سلام
    خیلی مخلصیم
    چند وقت نبودید ما دپرس بودیم!
    دستورالعملها 100 درصد توی Flash هستند
    و توی اکثر سیستمهای میکروکنترلری دونه به دونه واکشی و دیکد و اجرا میشند
    فقط توی معماری آرم (هنوز دقیق دقیق مطالعه نکردم) یه سیستم PreFetch (پیش واکشی) داره که اون رو قادر میسازه همزمان با دیکد کردن یه دستورالعمل، دستورالعمل بعدی رو واکشی کنه (فقط واکشی). هنوز نمیدونم این ربطی به سیستم خط لولش داره یا نه؟!
    و از طرفی فلش مموری تعبیه شده توی STM32 (دقیق مطالعه نکردم) پهنای باند 64 بایت و بافر دوبل PreFetch داره که فعال کردن و استفاده صحیح از اونها هم میتونه این کند بودن فلش رو تا حدودی جبران کنه!
    راستی راجع به بحث قبلیمون عرض کنم که wait state ها دقیقا prescaler نیستند ولی اینجا تقریبا همچین کاری میکنند
    و در واقع همون کلاک اصلی CPU به فلش وارد میشه فقط به صورت سخت افزاری Latency ایجاد میشه!
    ....
    آقا من دوتا سوال دارم چون ربطی به این بحث نداره توی خصوصی مطرح میکنم، لطفا چک کنید!
    سلام دوسته عزیز.
    شما بزرگوارید . بله بعد مراسمات دیگه کار هم فشار آورده بود که باید همشونو جمع میکردم. اونوقت اینجا سوال شما هم نیاز به مطالعه داشت که واقعا وقت نمیشد .به هر حال بلاخره سرو کله ی ما پیدا شد.

    دوستان تو انجمن stm گفتن که باید برای تاخییر بیا اون while رو داخل یه تابع بزار (تا همین جا مشکلم حل شد) و گفتن مقدار متغییری که قرار هست به اون مقدار تاخییر بیوفته رو volatile تعریف کن.
    volatile تعریف کلیک کن
    حالا شما امتحان کنید ببینید براتون درست میشه یا خیر.من که زمان روشن موندن و خاموش موندن برابر شد.


    کد:
    #include "stm32f10x.h"
    #include "stm32f10x_gpio.h"  // for Enable LCD
    #include "stm32f10x_rcc.h"   //for Enable LCD
    #include "LCDLib.h"
    #include "delay.h"
    
    
    void GPIOC_init(void);
    void delay(void);
     int dly=0;
    int main()
    {
      
      GPIOC_init();
      
      while(1)
      {
        GPIO_WriteBit(GPIOB,GPIO_Pin_0, Bit_SET);
        
        delay();
        
        GPIO_WriteBit(GPIOB,GPIO_Pin_0, Bit_RESET);
        delay();
      }
      
    }
    
    
    void delay(void){
      while(dly<10000000)dly+=1; 
      dly=0;
    }
    
    
    
    void GPIOC_init(void)
    {
        RCC_APB2PeriphClockCmd  ( RCC_APB2Periph_GPIOB, ENABLE );
        
        GPIO_InitTypeDef gpioC;
        gpioC.GPIO_Mode = GPIO_Mode_Out_PP ;
        gpioC.GPIO_Pin = GPIO_Pin_All;
        gpioC.GPIO_Speed = GPIO_Speed_10MHz;  
        GPIO_Init  (  GPIOB,  &gpioC ); 
      
    }
    جدیدترین ویرایش توسط hosseinam; ۲۱:۳۵ ۱۳۹۶/۱۰/۱۶.
    به سمت نور خورشید حرکت کن،تو میتونی تابش خورشید رو حس کنی ،حتی اگه کور باشی.
    (پیش به سوی هدف)

    دیدگاه


      #17
      پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

      نوشته اصلی توسط hosseinam نمایش پست ها
      تو انجمن stm گفتن که باید برای تاخییر بیا اون while رو داخل یه تابع بزار (تا همین جا مشکلم حل شد) و گفتن مقدار متغییری که قرار هست به اون مقدار تاخییر بیوفته رو volatile تعریف کن.
      سلام مجدد
      یادتون میاد توی همین تاپیک یه جا گفته بودم حرکات غیر منتظره میکرو!!
      اینها از همون دست اند!
      اینجا وقتی کد مینویسی انگار داری به امون خدا کد مینویسی!
      و خیلی چیزا رو هواست!!!
      ...
      من فعلا هدفم یه چیز دیگه است، ولی اگه بخوام همین STM32 رو برای ادامه انتخاب کنم، شاید سمت اسمبلی هم برم، تا کلش رو بخوابونم!
      راستی صندوق ورودیتون پره!
      پیام ارسال نمیشه!
      ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

      دیدگاه


        #18
        پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

        نوشته اصلی توسط ubub نمایش پست ها
        سلام مجدد
        یادتون میاد توی همین تاپیک یه جا گفته بودم حرکات غیر منتظره میکرو!!
        اینها از همون دست اند!
        اینجا وقتی کد مینویسی انگار داری به امون خدا کد مینویسی!
        و خیلی چیزا رو هواست!!!
        ...
        من فعلا هدفم یه چیز دیگه است، ولی اگه بخوام همین STM32 رو برای ادامه انتخاب کنم، شاید سمت اسمبلی هم برم، تا کلش رو بخوابونم!
        راستی صندوق ورودیتون پره!
        پیام ارسال نمیشه!
        میکرو حرکات غیرمنتظره نداره. این ماییم که نکات ریز رو نمیدونیم و باعث خطا میشیم. این همه دنیا داره با همین میکرو ها کار میکنن این همه دستگاهها .این همه کسایی که دارن با CMSIS کد میزنن.
        نگران نباشید تجربتون به اندازه ای بالا میره که این خطاها کم کم حذف میشه.
        به سمت نور خورشید حرکت کن،تو میتونی تابش خورشید رو حس کنی ،حتی اگه کور باشی.
        (پیش به سوی هدف)

        دیدگاه


          #19
          پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

          سلام به اساتید
          من میخوام توی KEIL به رجیسترهای مربوط به بخش USB میکرو STM32 دسترسی پیدا کنم
          مثلا به رجیستر USB_CNTR
          IDE این عبارت رو نمیشناسه USB->CNTR
          و با آدرش هم کار کردم نشد! 0x40005C40
          باید چه فایلی اضافه کنم تا این USB->CNTR رو بشناسه ؟

          ...
          نوشته اصلی توسط hosseinam نمایش پست ها
          میکرو حرکات غیرمنتظره نداره.
          جناب مهندس من نگفتم که خود میکرو حرکات غیر منتظره داره!!!!
          توی اون پست اصلی بحث سر مقایسه کدنویسی سطح بالا و سطح رجیستر بود،
          و من گفتم برخی توابع سطح بالا معلوم نیست توشون چیه و ممکنه با استفاده نابه جا، میکرو رو به ناکجا آباد ببره!!
          ...
          نوشته اصلی توسط hosseinam نمایش پست ها
          دوستان تو انجمن stm گفتن که باید برای تاخییر بیا اون while رو داخل یه تابع بزار (تا همین جا مشکلم حل شد) و گفتن مقدار متغییری که قرار هست به اون مقدار تاخییر بیوفته رو volatile تعریف کن.
          1- اون که ثابته! (10000000) اصلا متغییر نیست! و 2- منظورتون کدوم while هست؟
          while بینهایت اصلی برنامه،
          یا while ی که من احیانا برای ایجاد تاخیر استفاده کردم؟
          ضمنا، یه نکته کدنویسی، تا یه دلیل واضح و منطقی (از منظر زبان استاندارد C) براش وجود نداشته باشه، روی هوا محسوب میشه!! (حداقل به نظر بنده!)
          ممنون از همراهیتون.
          ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

          دیدگاه


            #20
            پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

            نوشته اصلی توسط ubub نمایش پست ها
            سلام به اساتید


            ...

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

            1- اون که ثابته! (10000000) اصلا متغییر نیست! و 2- منظورتون کدوم while هست؟
            while بینهایت اصلی برنامه،
            یا while ی که من احیانا برای ایجاد تاخیر استفاده کردم؟
            ضمنا، یه نکته کدنویسی، تا یه دلیل واضح و منطقی (از منظر زبان استاندارد C) براش وجود نداشته باشه، روی هوا محسوب میشه!! (حداقل به نظر بنده!)
            ممنون از همراهیتون.
            متغییر dly منظورمه.
            while تاخییر منظورمه.
            void delay(void){
            while(dly<10000000)dly+=1;
            dly=0;
            }
            به سمت نور خورشید حرکت کن،تو میتونی تابش خورشید رو حس کنی ،حتی اگه کور باشی.
            (پیش به سوی هدف)

            دیدگاه


              #21
              پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

              باسلام
              رجیستر ها همون ثبات ها هستن؟کار با این رجیستر ها با زبان اسمبلی انجام میشه؟مرجعی وجود داره که با اون برنامه نویسی رجیستر ها به زبان اسمبلی یاد داده بشه؟مجموعه دستورات یا همون instruction set تموم arm ها یکیه یا برای هر سری از هر شرکت متفاوته؟

              دیدگاه


                #22
                پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

                سلام

                نوشته اصلی توسط A.I.E نمایش پست ها
                ... رجیستر ها همون ثبات ها هستن؟ ...
                بله!

                نوشته اصلی توسط A.I.E نمایش پست ها
                ... کار با این رجیستر ها با زبان اسمبلی انجام میشه؟ ...
                با اسمبلی میشه، با بقیه زبانها هم میشه!

                نوشته اصلی توسط A.I.E نمایش پست ها
                ... مرجعی وجود داره که با اون برنامه نویسی رجیستر ها به زبان اسمبلی یاد داده بشه؟ ...
                برای ARM سراغ ندارم! ولی اگه بخواهی با کلیات داستان اسمبلی آشنا بشی، کتاب 8051 اسکات مکنزی، شروع خوبیه! ترجمه هم داره!

                نوشته اصلی توسط A.I.E نمایش پست ها
                ... مجموعه دستورات یا همون instruction set تموم arm ها یکیه یا برای هر سری از هر شرکت متفاوته؟
                چون دستورات را هسته میکرو، شناسایی و اجرا میکنه! پس تمام میکروهایی که هسته پردازنده مشابه دارند، مجموعه دستورات مشابه هم دارند!
                مثلا برندهای مختلفی که از یک نسل و نسخه ARM استفاده میکنند، دارای instruction set یکسان هستند! فقط باید درنظر داشته باشی که آدرس پریفرالهای مختلف و نحوه کانفیگشون دیگه کاملا متفاوته و دقیقا وابسته به شرکت سازنده میکروه!

                در کل در شرایط موجود کد زدن با اسمبلی کار عبث و بیهوده ایه!
                مگر اینکه یه چیپ خاص، با کاربرد خاص، توی یه پروژه مشخص و با پشتیبانی عالی باشه!!
                در همین رابطه:
                دوستان عزیز حرفه ای ، میشه منو راهنمایی کنین ؟ من گیج شدم . که از کدوم روش استفاده کنم ؟ با استفاده از توابع CMSIS ? یا خود دستورات و نوشتن توابع خودم ؟ بعضی حاها با CMSIS تدریس میکنن .
                ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

                دیدگاه


                  #23
                  پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

                  نوشته اصلی توسط ubub نمایش پست ها
                  سلام


                  بله!


                  با اسمبلی میشه، با بقیه زبانها هم میشه!


                  برای ARM سراغ ندارم! ولی اگه بخواهی با کلیات داستان اسمبلی آشنا بشی، کتاب 8051 اسکات مکنزی، شروع خوبیه! ترجمه هم داره!


                  چون دستورات را هسته میکرو، شناسایی و اجرا میکنه! پس تمام میکروهایی که هسته پردازنده مشابه دارند، مجموعه دستورات مشابه هم دارند!
                  مثلا برندهای مختلفی که از یک نسل و نسخه ARM استفاده میکنند، دارای instruction set یکسان هستند! فقط باید درنظر داشته باشی که آدرس پریفرالهای مختلف و نحوه کانفیگشون دیگه کاملا متفاوته و دقیقا وابسته به شرکت سازنده میکروه!

                  در کل در شرایط موجود کد زدن با اسمبلی کار عبث و بیهوده ایه!
                  مگر اینکه یه چیپ خاص، با کاربرد خاص، توی یه پروژه مشخص و با پشتیبانی عالی باشه!!
                  در همین رابطه:
                  https://www.eca.ir/forums/thread81045.html
                  سلام استاد.
                  توی کیل میشه با اسمبلی رجیستر نویسی کرد؟یعنی هم سی بنویسیم و تو جای نیاز اسمبلی؟
                  میشه یکم درمورد اینجا توضیح بدید:
                  در کل در شرایط موجود کد زدن با اسمبلی کار عبث و بیهوده ایه!
                  مگر اینکه یه چیپ خاص، با کاربرد خاص، توی یه پروژه مشخص و با پشتیبانی عالی باشه!!

                  دیدگاه


                    #24
                    پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

                    نوشته اصلی توسط A.I.E نمایش پست ها
                    سلام استاد.
                    توی کیل میشه با اسمبلی رجیستر نویسی کرد؟یعنی هم سی بنویسیم و تو جای نیاز اسمبلی؟
                    میشه یکم درمورد اینجا توضیح بدید:
                    سلام
                    چه لزومی داره اسمبلی بنویسید؟ با همون c هم میشه به راحتی با رجیسترها کارکرد.

                    دیدگاه


                      #25
                      پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

                      نوشته اصلی توسط hossein.m98 نمایش پست ها
                      سلام
                      چه لزومی داره اسمبلی بنویسید؟ با همون c هم میشه به راحتی با رجیسترها کارکرد.
                      باسلام و تشکر بابت جوابتون.
                      من اعتقادم بر اینه که یادگیری کامل و اصولی هرچیزی(ریاضی و فیزیک تا برنامه نویسی و...)می تونه درک مارو نسبت به اون موضوع بالا ببره و دامنه کاربرد موضوع رو شدیدا افزایش بده.نظر شخصی من اینه که زبان اسمبلی در علوم کامپیوتر مثل اعداد در ریاضیات هست و ما بدون دونستن اعداد نمیتونیم کاری از پیش ببریم(حداقل به صورت اپتیمایز نمیشه).شاید در کاربرد های پروژه محور میکرو کنترلر ها اصلا از اسمبلی استفاده نشه(مگر در شرایط خاص)و اصلا اعتقادی هم به استفاده از اسمبلی تو پروژه ها ندارم(حداقل واسه کسی که نمیخواد رادار و موشک بالستیک طراحی کنه!)ولی اینو میدونم دونستنش به ضرر نیست و چون آرم معماری ریسک رو داره و حدود 35 دستور اسمبلی براش هست یادگیری خیلی سختی نداره.
                      البته این نظر شخصی یه تازه کاره،شایدم کلا غلطه!

                      دیدگاه


                        #26
                        پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

                        نوشته اصلی توسط A.I.E نمایش پست ها
                        باسلام و تشکر بابت جوابتون.
                        من اعتقادم بر اینه که یادگیری کامل و اصولی هرچیزی(ریاضی و فیزیک تا برنامه نویسی و...)می تونه درک مارو نسبت به اون موضوع بالا ببره و دامنه کاربرد موضوع رو شدیدا افزایش بده.نظر شخصی من اینه که زبان اسمبلی در علوم کامپیوتر مثل اعداد در ریاضیات هست و ما بدون دونستن اعداد نمیتونیم کاری از پیش ببریم(حداقل به صورت اپتیمایز نمیشه).شاید در کاربرد های پروژه محور میکرو کنترلر ها اصلا از اسمبلی استفاده نشه(مگر در شرایط خاص)و اصلا اعتقادی هم به استفاده از اسمبلی تو پروژه ها ندارم(حداقل واسه کسی که نمیخواد رادار و موشک بالستیک طراحی کنه!)ولی اینو میدونم دونستنش به ضرر نیست و چون آرم معماری ریسک رو داره و حدود 35 دستور اسمبلی براش هست یادگیری خیلی سختی نداره.
                        البته این نظر شخصی یه تازه کاره،شایدم کلا غلطه!
                        به نظر خود من هم این کار میتونه مفید باشه ولی با وجود تنوع فعلی بازار فکر نکنم زیاد عملی باشه. یه زمانی که فقط 8051 وجود داشت این کار خیلی بهتر پیش میرفت ولی حالا...

                        دیدگاه


                          #27
                          پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

                          نوشته اصلی توسط A.I.E نمایش پست ها
                          توی کیل میشه با اسمبلی رجیستر نویسی کرد؟یعنی هم سی بنویسیم و تو جای نیاز اسمبلی؟
                          سلام، آره میشه، باید یک تابع بنویسید و اون تابع رو فراخوانی کنید. ویدیوی زیر رو نگاه کنید.
                          مکتب‌خونه، بزرگترین رسانه دیجیتال آموزش آنلاین در ایران

                          دیدگاه

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