ARM, STM, 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 قصد داریم یاد دهیم “چطور چند وقفه خارجی در برنامه داشته باشیم؟”. با سیسوگ همراه باشید.

 

 


انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.  همکاری با سیسوگ

 

نوشته های مشابه

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

12 دیدگاه

  1. Avatar A.M_BJ گفت:

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

    1. زئوس Zeus زئوس Zeus گفت:

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

  2. مرتضی خوشحال 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 فیلدی مربوط به اون برای فعالسازی نداره.یه همچین تفاوت هایی دارن باهم.می خواستم بدونم کلا چین؟

    1. زئوس Zeus زئوس Zeus گفت:

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

  3. مرتضی خوشحال morteza گفت:

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

    1. زئوس Zeus زئوس Zeus گفت:

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

  4. Avatar نوید گفت:

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

    1. زئوس Zeus زئوس Zeus گفت:

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

  5. Avatar حمید گفت:

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

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

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

    1. زئوس Zeus زئوس Zeus گفت:

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

  6. Avatar یوسف گفت:

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

    1. زئوس Zeus زئوس Zeus گفت:

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