آموزش میکروکنترلر STM32 قسمت چهارم: وقفه خارجی

آموزش میکروکنترلر STM32 قسمت چهارم: وقفه خارجی

آموزش میکروکنترلر STM32 قسمت چهارم: وقفه خارجی
آموزش میکروکنترلر STM32 قسمت چهارم: وقفه خارجی

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

برای تعریف وقفه خارجی در میکروکنترلر STM32، نرم افزار CubeMX را باز می‌کنیم و میکروکنترولر مورد نظرمان را انتخاب می‌کنیم. حالا برای هر کدام از پایه‌ها که می‌خواهیم آن را به عنوان ورودی اینتراپت خارجی انتخاب کنیم کلیک راست می‌کنیم و گزینه‌ای که اول آن GPIO_EXTI نوشته را انتخاب می‌کنیم.

 

انتخاب GPIO_EXTI در محیط نرم‌افزاری STM32CubeMX

 

 

حال به صفحه Configuration می‌رویم و گزینه GPIO را طبق شکل زیر انتخاب می‌کنیم:

 

انتخاب GPIO در صفحه Configuration در نرمافزار CubeMX

 

 

اکنون صفحه زیر باز می‌شود:

 

تنظیمات GPIO در صفحه Configuration در نرم‌افزار STM32 CubeMX

کادر قرمز: نحوه تحریک وقفه خارجی ، کادر بنفش: تنظیم PullUp یا PullDown و یا هیچ کدام برای پایه وقفه خارجی

 

 

همانطور که در عکس بالا مشخص است ما می‌توانیم با انتخاب پایه وقفه خود از طریق زبانه پایین که با کادر قرمز مشخص شده نوع لبه تحریک کننده که می‌تواند لبه بالا رونده و یا لبه پایین رونده و یا هر دو باشد را انتخاب کنیم و در زبانه پایین‌تر که با کادر بنفش مشخص شده تعیین می‌کنیم آیا همین پایه وقفه خارجی PullUp داخلی و یا PullDown داخلی شود و یا هیچکدام از این دو . بعد از انتخاب گزینه‌های مورد نظرمان دکمه ok را می‌زنیم و حال این‌بار از صفحه Configuration گزینه NVIC را انتخاب می‌کنیم. سپس تیک مورد نظر را می‌زنیم تا وقفه مربوطه فعال شود:

 

 

فعال کردن وقفه در صفحه NVIC

 

 

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

نکته مهم: در اینجا منظور از [15:10] همان پین‌های 10 تا 15 هر پورت از میکروکنترلر STM32 است. یعنی شما وقتی پایه‌هائی که برای اینتراپت خارجی انتخاب کنید در محدوده 10 تا 15 باشند از این وقفه برای آن پین‌ها استفاده می‌شود. در قسمت آموزش استفاده از چند وقفه خارجی بطور همزمان بیشتر این موضوع کالبد شکافی خواهد شد.

بعد از این مرحله دوباره دکمه OK را بزنید و سپس دکمه generate را بزنید و از برنامه خروجی بگیرید. حال به برگه stm32f1xx_it.c که همان برگه روتین‌های وقفه است بروید. طبق عکس زیر می‌توانید تابع وقفه خارجی EXTI15_10_IRQHandler(void) را مشاهده کنید:

 

تابع وقفه خارجی EXTI15_10_IRQHandler(void)

 

 

 

شما می‌توانید کدهای تابع وقفه خارجی خود را همینجا هم بنویسید ولی ما برای اینکه بتوانیم آن کدهای مربوطه را در خود main برنامه بنویسیم از تابع HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) استفاده می‌کنیم. توجه داشته باشید این تابع از داخل همان تابع HAL_GPIO_EXTI_IRQHandler فراخوانی می‌شود برای فهم بهتر مسئله به عکس زیر توجه کنید:

 

تابع وقفه خارجی در برگه stm32f1xx_it.c

 

 

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

طبق عکس زیر ما باید تابع را داخل main خود قرار دهیم همانطور که مشاهده می‌کنید تابع یک آرگومان دارد که نشانگر پینی هست که وقفه روی آن رخ داده ، سپس با شرطی که در عکس زیر مشاهده می‌کنید بررسی کنیم که آیا وقفه خارجی روی داده مربوط به پایه مورد نظر ماست یا نه ، این شرط در مواقعی به کار می‌رود که ما چند وقفه خارجی مورد استفاده قرار داده باشیم.

 

شرط رخ دادن وقفه خارجی

 

در آموزش بعدی میکروکنترلر STM32 قصد داریم یاد دهیم “چطور چند وقفه خارجی در برنامه داشته باشیم؟”. با سیسوگ همراه باشید.

 

 

حمایت از مهدی عبدالهی

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

مهدی عبدالهی
مهدی عبدالهی

کانال میکروالکترونیک @microstm32

دیدگاه ها

14 دیدگاه

  • A.M_BJ
    ۱۹ شهریور ۱۳۹۸

    خیلی تشکر که اموزش های ARMرا قرار دادین موفق باشید

    • Zeus ‌
      زئوس Zeus
      ۲۰ شهریور ۱۳۹۸

      خواهش میکنم دوست عزیز 🙂

  • MORTEZA
    ۵ شهریور ۱۳۹۸

    مثلا در بحث low power میکروکنترلر یه تابع داریم به نام Enters Sleep mode که یکی از ورودی هاش PWR_SLEEPENTRY_WFI و PWR_SLEEPENTRY_WFE که در واقع اون (WFE) یعنی wait for event و اون (WFI) یعنی wait foe interrupt.یا مثلا توی کیوب روی یک پایه که کلیک می کنی یک حالت داره GPIO_EXTI که بعد باید بری توی NVIC تیک اینتراپت شو بزنی.یک حالت دیگه داره EVENTOUT که وقتی فعال کنی دیگه توی بخش NVIC فیلدی مربوط به اون برای فعالسازی نداره.یه همچین تفاوت هایی دارن باهم.می خواستم بدونم کلا چین؟

    • Zeus ‌
      زئوس Zeus
      ۶ شهریور ۱۳۹۸

      فکر میکنم برای درک بهتر این موضوع بهتره حالت های Sleep میکروکنترلر رو مطالعه کنید
      در برخی مود ها میکرو با بعضی وقفه ها میتونه از حالت sleep خارج بشه در مود دیگه ای با تعداد محدود تری از وقفه ها قادر به انجام این کار هست و…

  • morteza
    ۲۷ مرداد ۱۳۹۸

    سلام.تشکر از مطالب آموزشی بسیار خوبتون.
    یک سوال داشتم.اونم اینکه تفاوت event با interrupt در چیه؟
    در واقع ما چه جوری می تونیم مثل اینجا که یک اینتراپت برای میکرو معین کردم .یک event رو برنامه نویسی کنیم؟

    • Zeus ‌
      زئوس Zeus
      ۱ شهریور ۱۳۹۸

      سلام دوست عزیز
      ببخشید متوجه سوالتون نشدم ؛ ایونت و اینتراپت مفعوم یکسانی دارند! کارکرد یکسانی رو هم دارند

      • صادق
        ۲۸ بهمن ۱۳۹۸

        سلام
        منظورشون اینه که تو تصویر سوم آموزش تو قسمت GPIO Mode که بریم میبینیم کلا 6 گزینه وجود داره که تو 3تای اونها نوشته شده اینتراپت و تو سه تای دیگه نوشته event . حالا میخواستم بدونم مثلا فرق دو گزینه زیر چی هست:
        External Interrupt Mode with Falling Edge Trigger
        External Event Mode with Falling Edge Trigger

        • Zeus ‌
          زئوس Zeus
          ۳۰ بهمن ۱۳۹۸

          سلام
          والا من هیچ وقت کد هامو رو از نرم افزار نگرفتم و همه رو دستی با استفاده از نیازی که داشتم نوشتم
          و جزییات این گزینه ها رو نمیدم ولی یه کار ساده اینه که کد خروجی هر کدام رو بررسی کنید ببینید چه تفاوت هایی وجود داره و از تفاوت این دو تا گزینه سر در بیارید.

  • نوید
    ۱۴ مهر ۱۳۹۷

    سلام وقت بخیر.من یه مشکل جدی که دارم اینه نمیتونم بفهمم کد نمایش داده شده رو از کدوم قسمت باید ببینم!!
    دقیقا مثله قسمت قبل همین اموزش که پرسیدم عکس ماله کجاست!!
    الان اینجا هم میتونید توضیح بدید کد مربوط به عکس یکی مونده به اخرو از کجا میتونم پیدا کنم؟؟
    ممنونم

    • Zeus ‌
      زئوس Zeus
      ۱۴ مهر ۱۳۹۷

      ببینید اون قسمت از کد رو بعد از ساختته شدن کد توسط cube میتونید پیدا کنید ، شما به راحتی با استفاده از قابلیت جستجو توی نرم افزار کیل هر فایل یا فانکشنی رو که مد نظر داشته باشید میتونید پیدا کنید 🙂

  • حمید
    ۱۹ مرداد ۱۳۹۷

    سلام
    وقت بخیر
    توی وقفه خارجی چه دستور هایی می شه استفاده کرد

    توی برنامه من فقط برنامه مربوط به pin در تابع HAL_GPIO_EXTI_Callback جواب می ده
    مثلا می خام وقتی وقفه خارجی انجام شد یه تابع اجرا بشه

    ولی هم با نوشتن تابه ارورر می ده هم اینکه اگه دستورات تابع وارد تابع وقفه کنم ارورر میده

    • Zeus ‌
      زئوس Zeus
      ۲۰ مرداد ۱۳۹۷

      قائدتا هر دستوری رو میتونید توی اینتراپت استفاده کنید ، فقط اصولی نیست که مدت زمان زیادی توی اینتراپت بمونید و باید سعی کنید در کوتاه ترین زمان ممکن از روال وقفه خارج بشید
      در خصوص خطایی که دریافت می کنید حدس میزنم فایل کتابخونه مربوطه رو include نکرده باشید ، برای این که بشه دقیق تر گفت ، باید خطایی رو که دریافت می کنید بگذارید تا بهتر بشه نظر داد.

  • یوسف
    ۳ مرداد ۱۳۹۷

    ممنون واقعاً عالی بود.

    • Zeus ‌
      زئوس Zeus
      ۳ مرداد ۱۳۹۷

      متشکر دوست عزیز
      خوشحالیم که مورد توجه قرار گرفته

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

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

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 11 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک