سلام دوستان، سیسوگ در قسمت قبلی آموزش میکروکنترلر STM32 به معرفی تأخیر در برنامه پرداخت. در این قسمت قصد داریم به معرفی وقفه خارجی در میکروکنترلر STM32 بپردازیم.
برای تعریف وقفه خارجی در میکروکنترلر STM32، نرم افزار CubeMX را باز میکنیم و میکروکنترولر مورد نظرمان را انتخاب میکنیم. حالا برای هر کدام از پایهها که میخواهیم آن را به عنوان ورودی اینتراپت خارجی انتخاب کنیم کلیک راست میکنیم و گزینهای که اول آن GPIO_EXTI نوشته را انتخاب میکنیم.
حال به صفحه Configuration میرویم و گزینه GPIO را طبق شکل زیر انتخاب میکنیم:
اکنون صفحه زیر باز میشود:
همانطور که در عکس بالا مشخص است ما میتوانیم با انتخاب پایه وقفه خود از طریق زبانه پایین که با کادر قرمز مشخص شده نوع لبه تحریک کننده که میتواند لبه بالا رونده و یا لبه پایین رونده و یا هر دو باشد را انتخاب کنیم و در زبانه پایینتر که با کادر بنفش مشخص شده تعیین میکنیم آیا همین پایه وقفه خارجی PullUp داخلی و یا PullDown داخلی شود و یا هیچکدام از این دو . بعد از انتخاب گزینههای مورد نظرمان دکمه ok را میزنیم و حال اینبار از صفحه Configuration گزینه NVIC را انتخاب میکنیم. سپس تیک مورد نظر را میزنیم تا وقفه مربوطه فعال شود:
در این صفحه شما میتوانید لیست وقفههای میکروکنترولر که در این برنامه مورد استفاده قرار گرفتهاند را مشاهده کنید. حال گزینه وقفه خارجی مورد نظرتان را انتخاب کنید و تیک آن را بزنید تا وقفه فعال و قابل استفاده شود.
نکته مهم: در اینجا منظور از [15:10] همان پینهای 10 تا 15 هر پورت از میکروکنترلر STM32 است. یعنی شما وقتی پایههائی که برای اینتراپت خارجی انتخاب کنید در محدوده 10 تا 15 باشند از این وقفه برای آن پینها استفاده میشود. در قسمت آموزش استفاده از چند وقفه خارجی بطور همزمان بیشتر این موضوع کالبد شکافی خواهد شد.
بعد از این مرحله دوباره دکمه 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 قصد داریم یاد دهیم “چطور چند وقفه خارجی در برنامه داشته باشیم؟”. با سیسوگ همراه باشید.
خیلی تشکر که اموزش های ARMرا قرار دادین موفق باشید
خواهش میکنم دوست عزیز 🙂
مثلا در بحث low power میکروکنترلر یه تابع داریم به نام Enters Sleep mode که یکی از ورودی هاش PWR_SLEEPENTRY_WFI و PWR_SLEEPENTRY_WFE که در واقع اون (WFE) یعنی wait for event و اون (WFI) یعنی wait foe interrupt.یا مثلا توی کیوب روی یک پایه که کلیک می کنی یک حالت داره GPIO_EXTI که بعد باید بری توی NVIC تیک اینتراپت شو بزنی.یک حالت دیگه داره EVENTOUT که وقتی فعال کنی دیگه توی بخش NVIC فیلدی مربوط به اون برای فعالسازی نداره.یه همچین تفاوت هایی دارن باهم.می خواستم بدونم کلا چین؟
فکر میکنم برای درک بهتر این موضوع بهتره حالت های Sleep میکروکنترلر رو مطالعه کنید
در برخی مود ها میکرو با بعضی وقفه ها میتونه از حالت sleep خارج بشه در مود دیگه ای با تعداد محدود تری از وقفه ها قادر به انجام این کار هست و…
سلام.تشکر از مطالب آموزشی بسیار خوبتون.
یک سوال داشتم.اونم اینکه تفاوت event با interrupt در چیه؟
در واقع ما چه جوری می تونیم مثل اینجا که یک اینتراپت برای میکرو معین کردم .یک event رو برنامه نویسی کنیم؟
سلام دوست عزیز
ببخشید متوجه سوالتون نشدم ؛ ایونت و اینتراپت مفعوم یکسانی دارند! کارکرد یکسانی رو هم دارند
سلام
منظورشون اینه که تو تصویر سوم آموزش تو قسمت GPIO Mode که بریم میبینیم کلا 6 گزینه وجود داره که تو 3تای اونها نوشته شده اینتراپت و تو سه تای دیگه نوشته event . حالا میخواستم بدونم مثلا فرق دو گزینه زیر چی هست:
External Interrupt Mode with Falling Edge Trigger
External Event Mode with Falling Edge Trigger
سلام
والا من هیچ وقت کد هامو رو از نرم افزار نگرفتم و همه رو دستی با استفاده از نیازی که داشتم نوشتم
و جزییات این گزینه ها رو نمیدم ولی یه کار ساده اینه که کد خروجی هر کدام رو بررسی کنید ببینید چه تفاوت هایی وجود داره و از تفاوت این دو تا گزینه سر در بیارید.
سلام وقت بخیر.من یه مشکل جدی که دارم اینه نمیتونم بفهمم کد نمایش داده شده رو از کدوم قسمت باید ببینم!!
دقیقا مثله قسمت قبل همین اموزش که پرسیدم عکس ماله کجاست!!
الان اینجا هم میتونید توضیح بدید کد مربوط به عکس یکی مونده به اخرو از کجا میتونم پیدا کنم؟؟
ممنونم
ببینید اون قسمت از کد رو بعد از ساختته شدن کد توسط cube میتونید پیدا کنید ، شما به راحتی با استفاده از قابلیت جستجو توی نرم افزار کیل هر فایل یا فانکشنی رو که مد نظر داشته باشید میتونید پیدا کنید 🙂
سلام
وقت بخیر
توی وقفه خارجی چه دستور هایی می شه استفاده کرد
توی برنامه من فقط برنامه مربوط به pin در تابع HAL_GPIO_EXTI_Callback جواب می ده
مثلا می خام وقتی وقفه خارجی انجام شد یه تابع اجرا بشه
ولی هم با نوشتن تابه ارورر می ده هم اینکه اگه دستورات تابع وارد تابع وقفه کنم ارورر میده
قائدتا هر دستوری رو میتونید توی اینتراپت استفاده کنید ، فقط اصولی نیست که مدت زمان زیادی توی اینتراپت بمونید و باید سعی کنید در کوتاه ترین زمان ممکن از روال وقفه خارج بشید
در خصوص خطایی که دریافت می کنید حدس میزنم فایل کتابخونه مربوطه رو include نکرده باشید ، برای این که بشه دقیق تر گفت ، باید خطایی رو که دریافت می کنید بگذارید تا بهتر بشه نظر داد.
ممنون واقعاً عالی بود.
متشکر دوست عزیز
خوشحالیم که مورد توجه قرار گرفته