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

 

 

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

6 دیدگاه در “آموزش میکروکنترلر STM32: وقفه خارجی

  1. نوید گفت:

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

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

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

  2. حمید گفت:

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

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

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

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

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

  3. یوسف گفت:

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

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

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

دیدگاهتان را بنویسید

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