اطلاعیه

Collapse
No announcement yet.

رجیستر در stm چگونه است؟

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

    رجیستر در stm چگونه است؟

    دوستان مگه stm32 رجیسترهای 32 بیتی نداره؟؟
    پس چرا فقط 16 پایه برای هر پورت داره؟؟
    ما از باقی رجیسترها چی استفاده میتونیم بکنیم؟؟یا چجور باید دسترسی داشته باشیم.
    مثلا اگه به غیر از کتابخونه هال بخواییم یه ال ای دی رو روشن کنیم باید چیکار کنیم؟؟

    یه سوال دیگه !!
    من وقتی دارم با stm کار میکنم باید حتما از کتابخونه hal تو iar استفاده کنم یا اینکه بدونه کتابخونه هم خودم میتونم کد بزنم ؟؟
    بهترین روش کدومه؟؟


    ممنونم.
    جدیدترین ویرایش توسط hosseinam; ۱۵:۳۰ ۱۳۹۶/۰۶/۲۸.
    به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
    (پيش به سوي هدف)

    #2
    پاسخ : رجیستر در stm چگونه است؟

    در میکروکنترلرهای ARM استفاده از ریجسترها در مقایسه با میکروکنترلرهای 8 بیتی خیلی متفاوته. تفاوت از این لحاظ که واقعا تعدادشون زیاده و درگیر شدن مستقیم با اونها یه مقدار دشوار میشه.
    غیر از HAL کتابخانه های SPL هستن که خود شرکت ST برای هر سری روی سایتش قرار داده و می تونید استفاده کنید.
    چرا ناراحتی پاتریک!
    + امروز ی بچه دیدم سرچهارراه گل میفروخت
    - از دیدنش ناراحت شدی؟
    + نه
    پس چی ناراحتت کرده
    + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
    ------------------------------------------------------------------------------------------------------
    تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
    ------------------------------------------------------------------------------------------------------
    محصولات

    دیدگاه


      #3
      پاسخ : رجیستر در stm چگونه است؟

      نوشته اصلی توسط hosseinam نمایش پست ها
      دوستان مگه stm32 رجیسترهای 32 بیتی نداره؟؟...
      خب
      نوشته اصلی توسط hosseinam نمایش پست ها
      ...پس چرا فقط 16 پایه برای هر پورت داره؟؟...
      چرا نداشته باشه؟ چه مشکلی داره؟
      چه بسا شاید بهتر باشه. کی می دونه(هر واحد که با کلاک کار میکنه، انرژی مصرف میکنه. شاید دلیل بدی نباشه برای کاهش مصرف انرژی وقتی نیازی نداری از تعداد زیادی از GPIOها استفاده کنی). باید از شرکت سازنده پرسید.

      نوشته اصلی توسط hosseinam نمایش پست ها
      ...ما از باقی رجیسترها چی استفاده میتونیم بکنیم؟؟یا چجور باید دسترسی داشته باشیم...
      کدوم ریجسترها؟
      برای دسترسی برو به هدر فایل میکروت. مثلا تو کامپایلر کیل من یه فایل هدر دارم به اسم stm32f10x.h که اگه برم توش اسم ریجسترها توش نوشته.

      نوشته اصلی توسط hosseinam نمایش پست ها
      ...مثلا اگه به غیر از کتابخونه هال بخواییم یه ال ای دی رو روشن کنیم باید چیکار کنیم؟؟...
      با کتابخونه هال که انجام دادی برو ببین توش چی شده و با چه ریجسترهایی کار کردی. تابع هاشو ببین. راحت میفهمی چی شده. رفرنس مانوال رو هم می تونی بخونی.
      نوشته اصلی توسط hosseinam نمایش پست ها
      ...من وقتی دارم با stm کار میکنم باید حتما از کتابخونه hal تو iar استفاده کنم یا اینکه بدونه کتابخونه هم خودم میتونم کد بزنم ؟؟
      بهترین روش کدومه؟؟
      هیچ اجباری در استفاده از کتابخانونه ها نیست ولی به نظرم بهتره ازشون استفاده کنی(من استفاده میکنم). چون قبلا تست شده و جواب دادن و باگ هاش هم رفع شده.

      دیدگاه


        #4
        پاسخ : رجیستر در stm چگونه است؟

        نوشته اصلی توسط روح الامین نمایش پست ها
        چرا نداشته باشه؟ چه مشکلی داره؟
        چه بسا شاید بهتر باشه. کی می دونه(هر واحد که با کلاک کار میکنه، انرژی مصرف میکنه. شاید دلیل بدی نباشه برای کاهش مصرف انرژی وقتی نیازی نداری از تعداد زیادی از GPIOها استفاده کنی). باید از شرکت سازنده پرسید.
        مثلا شما بیا به مگا32 نگاه کن ُ 8 بیت هست ُ هشت پین هم داره- ولی این 32 بیت هست و 16 پین داره ُ خوب از مابقی بیت ها کجا استفاده میکنی ؟؟

        روح الامین تازه وارد رجیسترها شدم هنوز فهمیدم چین اینا ُ ولی هنوز نگرفتم که چطور باید با اینا کار کرد !!مثلا عکس زیر رو ببین صفحه 170 یوزر منوال :


        این چرا 32 تا داره ُ اگه بخام ال ای دی روشن کنم باید چطور مقدار بدم به این رجیستر ؟؟

        گفتی یوزرمنوال - من دیتاشیت و یوزرمنوال رو کلا چاپ کردم دارم برای خوندن ُ ولی خوب تا جایی نمیگیرم چطور باید مقدار بدم .
        مثلا تو مگا64 برای روشن کردن ال ای دی میآییم اینحجوری عمل میکنیم :
        کد:
        #define LD_PORT PORTD
        #define LD_DDR DDRD
        
        void main(void)
        {
          //int i ;
          LD_DDR =0xff;
          LD_PORT = 0xff;
        یعنی نام رجیستر مشخص هست و بهش مقدار میدیم ُ حالا اینجا ... .


        نیازمند راهنمایی از دوستان .
        ممنونم.
        به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
        (پيش به سوي هدف)

        دیدگاه


          #5
          پاسخ : رجیستر در stm چگونه است؟

          کد:
          [FONT=tahoma] assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
          نوشته اصلی توسط hosseinam نمایش پست ها
          مثلا شما بیا به مگا32 نگاه کن ُ 8 بیت هست ُ هشت پین هم داره- ولی این 32 بیت هست و 16 پین داره ُ خوب از مابقی بیت ها کجا استفاده میکنی ؟؟...
          حسین جان ببین الان هسته های آرم 64بیتی هم اومده. یعنی انتظار داری یه پورت خروجی داشته باشه با 64پین؟ AVR روی بیشتر از 8 بیت نمی تونه عملیات انجام بده، پس پورت هاش همش 8 بیتی هستش. بیشتر نمی تونه. STM32 ما 32بیتی هستش و درسته که می تونه عملیات 32بیتی انجام بده ولی طراحش بنا به دلایل خودش گفته برای هر پورت خروجی 16 پین می ذارم. مشکلش چیه؟ 16 پین همزمان که کافیه.
          نوشته اصلی توسط hosseinam نمایش پست ها
          ... روح الامین تازه وارد رجیسترها شدم هنوز فهمیدم چین اینا ُ ولی هنوز نگرفتم که چطور باید با اینا کار کرد !!مثلا عکس زیر رو ببین صفحه 170 یوزر منوال : این چرا 32 تا داره ُ اگه بخام ال ای دی روشن کنم باید چطور مقدار بدم به این رجیستر ؟؟
          مثلا می خواییم پین شماره 5 پورت B چشمک بزنه. بعد از مقدار دهی های اولیه، اینجوری وضعیت پین رو عوض میکنم:
          کد:
          GPIOB->ODR ^= GPIO_Pin_5;
                      delay(0x7A1200);
                      GPIOB->ODR ^= GPIO_Pin_5;
                      delay(0x7A1200);
          کاری به تابع delay نداشته باش. این: GPIOB->ODR یعنی یه استراکتچر وجود داره که اسمش GPIOB هستش و توش یه متغییر داره که صداش زده. این متغییر ODR هستش که اسم این ریجستر هستش. تو رفرنس مانوال نگاه کن. پیداش میکنی. البته چون پویینتر هستش اینجوری صداش کرده. یعنی با <- صداش کرده. GPIO_Pin_5 هم که یه ماکرو هستش که اگه بری توی هدر stm32f10x_gpio می بینی مقدار داره. برو این هدر رو بین. اگه من نگاه کنم اینو نوشته:
          کد:
          #define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
          #define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
          #define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */
          #define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */
          #define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
          #define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */
          #define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */
          #define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */
          #define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */
          #define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */
          #define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */
          #define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */
          #define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */
          #define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */
          #define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */
          #define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */
          #define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */
          خب حالا می خوای بدونی ریجستر ODR چطوری ازش استفاده میشه. علاوه بر خوندن رفرنس مانوال می تونی بری و فایل stm32f10x_gpio.c رو ببینی. دقت کن که این هدر نیست. این یه فایل C هستش. فایل بالایی هم که گفتم هدرش هستش. تو این فایل C همه چیز تعریف شده. حالا من دنبال عبارت ODR می گردم و نگاه میکنم ببینم چطور و چه استفاده ای ازش شده و میشه. بعنوان مثال این رو میبینم:
          /**
            * @brief  Writes data to the specified GPIO data port.
            * [MENTION=17545]para[/MENTION]m  GPIOx: where x can be (A..G) to select the GPIO peripheral.
            * [MENTION=17545]para[/MENTION]m  PortVal: specifies the value to be written to the port output data register.
            * @retval None
            */
          void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
          {
            /* Check the parameters */
            assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
            
            GPIOx->ODR = PortVal;
          }
          کامنت های بالای تعریف تابع رو بخون. چی میفهمی ازش؟ حالا تابع رو ببین. به این خط کاری نداشته باش. ولش کن:
          حالا روشن تر نیست؟ متوجه شدی چه استفاده ای ازش شده و چطوری و چرا؟ باقی قسمت ها رو هم همین طوری نگاه کن.
          تو عکسی که تو گذاشتی ریجستر CRL گذاشته شده. تو همین فایل بگرد و ببین چیکار کرده باهاش. رفرنس مانوال رو هم نگاه کن.

          نوشته اصلی توسط hosseinam نمایش پست ها
          ...
          گفتی یوزرمنوال - من دیتاشیت و یوزرمنوال رو کلا چاپ کردم دارم برای خوندن ُ ولی خوب تا جایی نمیگیرم چطور باید مقدار بدم .
          مثلا تو مگا64 برای روشن کردن ال ای دی میآییم اینحجوری عمل میکنیم :
          کد:
          #define LD_PORT PORTD
          #define LD_DDR DDRD
          
          void main(void)
          {
            //int i ;
            LD_DDR =0xff;
            LD_PORT = 0xff;
          یعنی نام رجیستر مشخص هست و بهش مقدار میدیم ُ حالا اینجا ... .
          [/FONT]

          دیدگاه

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