اطلاعیه

Collapse
No announcement yet.

خاموش کردن وقفه GPIO در LPC1788

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

    خاموش کردن وقفه GPIO در LPC1788

    سلام.
    من میخوام وقفه GPIO رو در مجموع واسه 4 پایه فعال کنم به صورتی که در صورت وقوع وقفه پایه اول ، وقفه 3 پایه دیگه فعال بشه
    واسه اینکار وقفه پایه اول رو درون تابع main فعال می کنم و وقفه سه پایه دیگه رو در ابتدای GPIO_IRQHandler فعال می کنم و در زیر روال GPIO_IRQHandler یه سری کارهای دیگه هم انجام میشه. و با استفاده از سه تا دستور if (((LPC_GPIOINT->IO2IntStatR)>>pinNum)& 0x1) رخ دادن هر کدوم از اون سه تا پایه رو بررسی می کنم ودرون if یه سری کار انجام میدم
    حالا سوال اولم اینه که با رخ دادن هر کدوم از این سه وقفه ، آیا زیرروال GPIO_IRQHandler از ابتدا اجرا میشه؟؟؟؟؟(برداشت خودم اینه که اجرا نمیشه چون پرچم وقفه اولی هنوز پاک نشده و در انتهای GPIO_IRQHandler پاک میشه.درسته؟؟؟)

    سوال دومم هم اینه که آیا با نوشتن صفر در پین مورد نظر رجیستر LPC_GPIOINT->IO0IntEnR ، آیا وقفش غیرفعال میشه؟؟؟اگه آره ، نیازه که پرچمش رو هم پاک کنم؟؟؟

    ببخشید طولانی شد.

    #2
    پاسخ : خاموش کردن وقفه GPIO در LPC1788

    باید
    نوشته اصلی توسط mehdia1968

    حالا سوال اولم اینه که با رخ دادن هر کدوم از این سه وقفه ، آیا زیرروال GPIO_IRQHandler از ابتدا اجرا میشه؟؟؟؟؟(برداشت خودم اینه که اجرا نمیشه چون پرچم وقفه اولی هنوز پاک نشده و در انتهای GPIO_IRQHandler پاک میشه.درسته؟؟؟)
    برای جلو گیری از وقفه های تو در تو در معماری کورتکس وقفه سراسری غیر فعال میشه و شما باید در هنگام خروج از روتین وقفه باید وقفه سراسری رو فعال کنید.مگر آنکه اینتراپت ها غیر قابل پوشش باشن
    NMI که این وقفه ها وقفه سراسری رو غیر فعال نمی کنن .
    تنها موردي كه همه آدما يقين دارن خدا در حقش زیاد لطف کرده
    داشتن عقله زيادتر از دیگر آدم ها است

    دیدگاه


      #3
      پاسخ : خاموش کردن وقفه GPIO در LPC1788

      نوشته اصلی توسط aliila
      باید برای جلو گیری از وقفه های تو در تو در معماری کورتکس وقفه سراسری غیر فعال میشه و شما باید در هنگام خروج از روتین وقفه باید وقفه سراسری رو فعال کنید.مگر آنکه اینتراپت ها غیر قابل پوشش باشن
      NMI که این وقفه ها وقفه سراسری رو غیر فعال نمی کنن .
      یعنی میگین باید در انتهای GPIO_IRQHandler علاوه بر پاک کردن پرچم وقفه اولم ، با دستور NVIC_EnableIRQ(GPIO_IRQn); دوباره وقفه GPIO رو فعال کنم؟؟؟
      من که درون اجرای یه زیرروال وقفه به رخ دادن وقفه های دیگه نیاز دارم که یه کارایی انجام بدم خب :cry:

      دیدگاه


        #4
        پاسخ : خاموش کردن وقفه GPIO در LPC1788

        سلام
        هر بار که وقفه بیاد وارد این تابع میشه و در انتها بعد اینکه تشخیص دادید کدوم پایه زده شده پرچم وقفه همان را بایستی پاک کنید. با ریختن یک در رجیستر پرچم ریست می شود
        فيلم آموزشي ميکروکنترلر LPC1768
        فيلم آموزشي تکميلي و پيشرفته ميکروکنترلر LPC1768
        فيلم آموزش کاربردی زبان سی در میکروکنترلر ARM
        فیلم آموزش مقدماتی میکروکنترلر LPC1788 به زودی ...

        دیدگاه


          #5
          پاسخ : خاموش کردن وقفه GPIO در LPC1788

          نوشته اصلی توسط mzarkoob
          سلام
          اصلا روتین وقفه ای به نام GPIO_IRQHandler وجود دارد!؟ من که ندیدم
          وقفه gpio وارد EINT3_IRQHandler می شود ....
          بله آقای زرکوب.در LPC1768 وقفه های GPIO با EINT3 مشترک هستند ولی در LPC1788 به صورت مجزا تعریف شده و روتین GPIO_IRQHandler وجود دارد (با توجه به user manual میکروهای LPC178x_7x)

          دیدگاه


            #6
            پاسخ : خاموش کردن وقفه GPIO در LPC1788

            نوشته اصلی توسط mzarkoob
            سلام
            هر بار که وقفه بیاد وارد این تابع میشه و در انتها بعد اینکه تشخیص دادید کدوم پایه زده شده پرچم وقفه همان را بایستی پاک کنید. با ریختن یک در رجیستر پرچم ریست می شود
            مرسی
            ببینید برنامه با رخ دادن وقفه P0.0 وارد GPIO_IRQHandler میشه.حالا P0.1 , P0.2 و P0.3 رو فعال میکنم و برای رخ دادن هرکدوم یک If دارم (3تا if) . سخت افزار به صورتیه که هر 3تا تقریبا میشه گفت همزمان رخ میدن.حالا با رخ دادن هر 3تاشون آیا دوباره GPIO_IRQHandler از اول اجرا میشه؟؟؟
            من نمیخوام وقفه های این 3 تا if ، ریست بشن.میخوام در انتهای if مربوطه ، غیرفعال بشن.باید چجوری وقفه همون پایه رو غیرقعال کنم؟؟

            دیدگاه


              #7
              پاسخ : خاموش کردن وقفه GPIO در LPC1788

              نوشته اصلی توسط mehdia1968
              بله آقای زرکوب.در LPC1768 وقفه های GPIO با EINT3 مشترک هستند ولی در LPC1788 به صورت مجزا تعریف شده و روتین GPIO_IRQHandler وجود دارد (با توجه به user manual میکروهای LPC178x_7x)
              من بلافاصله بعد این پست دیدم میکرو 1788 هست اصلاحش کردم . همون یه لحظه شما اینو دیدید!؟ :mrgreen:
              فيلم آموزشي ميکروکنترلر LPC1768
              فيلم آموزشي تکميلي و پيشرفته ميکروکنترلر LPC1768
              فيلم آموزش کاربردی زبان سی در میکروکنترلر ARM
              فیلم آموزش مقدماتی میکروکنترلر LPC1788 به زودی ...

              دیدگاه


                #8
                پاسخ : خاموش کردن وقفه GPIO در LPC1788

                نوشته اصلی توسط mzarkoob
                من بلافاصله بعد این پست دیدم میکرو 1788 هست اصلاحش کردم . همون یه لحظه شما اینو دیدید!؟ :mrgreen:
                بله مثل اینکه

                دیدگاه


                  #9
                  پاسخ : خاموش کردن وقفه GPIO در LPC1788

                  این کار رو عملی واسه LPC1768 تست کردم.
                  با پاک کردن پرچم وقفه داخلی ، عملا غیرفعال نمیشه و حتی 0 رو در LPC_GPIOINT->IO0IntEnR میزارم.
                  فقط یک بار وقفه داخلی رخ میده و دفعات بعدیه اجرای وقفه اصلی ، وقفه داخلی دیگه رخ نمیده :cry2:

                  دیدگاه


                    #10
                    پاسخ : خاموش کردن وقفه GPIO در LPC1788

                    اساسی حلش کردم

                    دیدگاه


                      #11
                      پاسخ : خاموش کردن وقفه GPIO در LPC1788

                      یه نمونه کد برای راه اندازی وقفه GPIO:
                      #include "LPC177x_8x.h"
                      #include "system_LPC177x_8x.h"
                      #include "Delay.h"
                      //#include "lpc177x_8x_gpio.h"
                      //#include "lpc177x_8x_clkpwr.h"
                      /****
                      LED:
                      LED1: P4.18
                      LED2: P2.11
                      LED3: P4.20
                      LED4: P4.19
                      ****/
                      void GPIO_IRQHandler(void)
                      {
                      if(GPIO_GetIntStatus(0, 29, 1))
                      {
                      GPIO_ClearInt(0, 1<<29);
                      LPC_GPIO4 -> SET |= (7<<18);
                      LPC_GPIO2 -> SET |= (1<<11) ;
                      Delay_ms(1000);
                      LPC_GPIO4 -> CLR |= (7<<18);
                      LPC_GPIO2 -> CLR |= (1<<11);
                      Delay_ms(1000);
                      }
                      }

                      void main()
                      {
                      Delay_init();
                      GPIO_Init();
                      GPIO_IntCmd(0, 1<<29, 1); //FALLING EDGE
                      NVIC_EnableIRQ(GPIO_IRQn);
                      LPC_GPIO2 -> DIR |= (1<<11);
                      LPC_GPIO4 -> DIR |= (7<<18);
                      while(1)
                      {}
                      }

                      دیدگاه

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