سلام دوستان، در قسمت قبلی آموزش میکروکنترلر STM32 بهمعرفی تأخیر در برنامه پرداخت. در این قسمت قصد داریم به معرفی وقفه خارجی در میکروکنترلر STM32 بپردازیم. برای تعریف وقفه خارجی در میکروکنترلر STM32، نرمافزار CubeMX را باز میکنیم و میکروکنترولر موردنظرمان را انتخاب میکنیم. حالا برای هرکدام از پایهها که میخواهیم آنرا بهعنوان ورودی اینتراپت خارجی انتخابکنیم کلیک راست میکنیم و گزینهای که اول آن GPIO_EXTI نوشته را انتخاب میکنیم.
حال به صفحه Configuration میرویم و گزینه GPIO را طبق شکلزیر انتخاب میکنیم:
اکنون صفحهی زیر باز میشود:
*کادر قرمز: نحوه تحریک وقفه خارجی*
*کادر بنفش: تنظیم PullUp یا PullDown و یا هیچ کدام برای پایه وقفه خارجی*
همانطورکه در عکسبالا مشخصاست ما میتوانیم با انتخاب پایه وقفه خود از طریق زبانه پایین که با کادرقرمز مشخصشده نوع لبه تحریککننده که میتواند لبه بالا رونده و یا لبه پایین رونده و یا هردو باشد را انتخابکنیم و در زبانه پایینتر که با کادر بنفش مشخصشده تعیین میکنیم آیا همین پایه وقفه خارجی PullUp داخلی و یا PullDown داخلی شود و یا هیچکدام از این دو .
بعداز انتخاب گزینههای مورد نظرمان دکمه ok را میزنیم و حال اینبار از صفحه Configuration گزینه NVIC را انتخاب میکنیم. سپس تیک موردنظر را میزنیم تا وقفه مربوطه فعال شود:
در این صفحه شما میتوانید لیست وقفههای میکروکنترولر که در این برنامه مورداستفاده قرارگرفتهاند را مشاهدهکنید. حال گزینه وقفه خارجی موردنظرتان را انتخابکنید و تیک آن را بزنید تا وقفه فعال و قابلاستفاده شود.
نکته مهم: در اینجا منظور از [۱۵:۱۰] همان پینهای ۱۰تا ۱۵ هر پورت از میکروکنترلر STM32 است. یعنی شما وقتی پایههایی که برای اینتراپت خارجی انتخابکنید در محدوده ۱۰ تا ۱۵ باشند از این وقفه برای آن پینها استفاده میشود. در قسمت آموزش استفادهاز چند وقفه خارجی بطور همزمان بیشتر این موضوع کالبدشکافی خواهدشد. بعداز این مرحله دوباره دکمه OK را بزنید و سپس دکمه generate را بزنید و از برنامه خروجی بگیرید. حال به برگه stm32f1xx_it.c که همان برگه روتینهای وقفه است بروید. طبق عکسزیر میتوانید تابع وقفه خارجی EXTI15_10_IRQHandler(void) را مشاهده کنید:
شما میتوانید کدهای تابع وقفه خارجی خود را همینجا هم بنویسید ولی ما برای اینکه بتوانیم آن کدهای مربوطه را در خود main برنامه بنویسیم از تابع HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) استفاده میکنیم. توجهداشتهباشید این تابع از داخل همان تابع HAL_GPIO_EXTI_IRQHandler فراخوانی میشود برای فهم بهتر مسئله به عکسزیر توجهکنید:
همانطورکه در متن تابع مشاهده میکنید، ابتدا بررسی میگردد که آیا وقفه روی پین مشخصشده رخداده یا نه و اگر رخ دادهبود ابتدا وقفه را پاک میکند و سپس روتین Callback که با حاشیه قرمز در عکسبالا مشخص شدهاست را اجرا میکند. طبق عکسزیر ما باید تابع را داخل main خود قراردهیم همانطور که مشاهده میکنید تابع یک آرگومان دارد که نشانگر پینی هست که وقفه روی آن رخ داده، سپس باشرطیکه در عکسزیر مشاهده میکنید بررسیکنیم که آیا وقفه خارجی روی داده مربوطبه پایه موردنظر ماست یا نه، این شرط درمواقعی بهکار میرود که ما چند وقفه خارجی مورداستفاده قراردادهباشیم.
در آموزش بعدی میکروکنترلر STM32 قصد داریم یاد دهیم “چطور چند وقفه خارجی در برنامه داشته باشیم؟”.
با ما همراه باشید.
منبع: سیسوگ