1. خانه
  2. آموزش
  3. جلسه هفدهم _ راه اندازی وقفه با تحریک خارجی (بخش دوم)

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

نحوه راه اندازی وقفه با تحریک خارجی و برنامه نویسی و راه اندازی این آن در محیط STM32CubeIDE

در ادامه آموزش STM32 با استفاده از توابع HAL  در این جلسه قصد داریم تا با توابع مربوط به آن و نحوه برنامه نویسی و راه اندازی اینتراپت خارجی آشنا شویم پس از تولید پروژه توسط نرم افزار STM32CubeMX و باز نمودن برنامه توسط نرم افزار STM32CubeIDE به سراغ فایل main.c می رویم تا دستورات موجود در آن که مرتبط با وقفه خارجی هستند را توضیح دهیم. در ابتدا به سراغ تابع MX_GPIO_Init می رویم که در آن پایه های اینتراپت تنظیم شده اند.

SW_Config

همانطور که در تصویر بالا مشخص است برای دو پایه مورد نظر لیبل های تنظیم شده مشخص هستند که در خطوط بعدی آن نوع تشخیص لبه اینتراپت و وضعیت Pull up بودن پایه ها مشخص شده اند. در ادامه این تابع اولویت اینتراپت ها مشخص شده است.

EXTI_Priority

در تصویر بالا اولویت هر کدام از اینتراپت ها مشخص شده و اینتراپت مربوط به آنها فعال شده است.
برای دسترسی به توابع مربوط به اینتراپت های خارجی کافیست از بخش Project از پوشه Aplication/User کتابخانه stm32f1xx_it.c را انتخاب نمایید.

f1xx_it

تابع مربوط به اینتراپت صفر می باشد به این معنی که در صورتیکه اینتراپتی روی پایه EXTI0 اتفاق بی افتد برنامه به این تابع مراجعه می کند

EXTI0_IRQ

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

EXTI9_5_IRQ

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

GPIO_EXTI

برای دسترسی به تابع بالا باید از پوشه Drivers/STM32F1xx_HAL_Driver کتابخانه stm32f1xx_hal_gpio.c را انتخاب نماییم. وظیفه این تابع مشخص نمودن عامل وقفه، پاک کردن وقفه اجرا شده و اجرای کدهای کاربر می باشد که برای پاک کردن وقفه اجرا شدن تابع HAL_GPIO_EXTI_CLEAR_IT را فراخوانی می کند و شماره اینتراپت فعال شده را در آرگومان این تابع قرار می دهد و برای اجرای دستورات مرتبط با این تابع که توسط کاربر نوشته شده تابع HAL_GPIO_EXTI_Callback را فراخوانی می کند و شماره اینتراپت فعال شده را در آرگومان آن قرار می دهد.

برای راه اندازی وقفه خارجی پس از معرفی توابع به سراغ ادامه کار می رویم و بدنه تابع HAL_GPIO_EXTI_Callback را کپی می کنیم و به کتابخانه stm32f1xx_it.c اضافه می کنیم.حال به سراغ برنامه اضافه شده مربوط به پروژه می رویم و برنامه های جدید را بصورت خط به خط توضیح می دهیم. ابتدا به شرح خطوط اضافه شده در فایل main.c می پردازیم.

Var

با توجه به اینکه ما قصد استفاده از دو وقفه را داریم دو متغیر را تعریف می کنیم تا با هر بار فعال شدن اینتراپت مربوطه یکی به متغیر مربوط به آن اضافه شود. با توجه به اینکه این متغیر ها در کتابخانه stm32f1xx_it.c نیز استفاده می شوند extern آنها را نیز به کتابخانه stm32f1xx_it.c مطابق تصویر زیر اضافه می کنیم.

Extern_Var

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

Allow_Inc

متغیر بالا وظیفه رفع مشکل Bounce را بر عهده دارد.extern این متغیر باید به کتابخانه stm32f1xx_it.c اضافه شود.

Program

در فایل main.c ابتدا ال سی دی پیکربندی می شود و متن های مورد نظر نوشته می شوند، پس از گذشت ۲ ثانیه وارد حلقه while می شویم و در این حلقه مدام تعداد کلید فشرده شده برای هر کدام از وقفه ها نمایش داده می شود و هر ۵۰۰ میلی ثانیه وضعیت LED تغییر می کند و متغیر Allow_Increment با مقدار یک مقدار دهی می شود این امر باعث می شود تا قبل از اینکه اطلاعات کلید فشرده شده بر روی نمایشگر نمایش داده نشود متغیر مربوط به آن دیگر اضافه نشود.

با یک شدن این متغیر مجوز افزایش متغیر مربوط به وقفه ها صادر می شود. حال به سراغ stm32f1xx_it.c که در آن تابع مربوط به اجرای دستورات در صورت وقوع وقفه را اضافه کرده ایم می رویم.

CallBack_Prog

در این تابع ابتدا بررسی می کنیم که فعال شدن کدام اینتراپت منجر به صدا زدن این تابع شده است و پس از آن بررسی می کنیم که اگر اجازه افزایش متغیر مربوط به آن اینتراپت را داریم متغیر آن را یکی اضافه می کنیم و پس از آن با صفر کردن Allow_Increment از زیاد شدن متغیر قبل از نمایش آن بر روی ال سی دی ممانعت می کنیم.

زندگی تون پر از نور و مسیرتون سبز

محمد هادی دشتی

لینک های مرتبط با آموزش:
جلسه اول_معرفی هسته آرم و میکروکنترلرهای ۳۲ بیتی شرکت ST

جلسه دوم_معرفی نرم افزارهای مورد نیازجهت برنامه نویسی و پروگرام

جلسه سوم _ آموزش نحوه دانلود آخرین نسخه از نرم افزار STM32CubeIDE

جلسه چهارم _نصب نرم افزار STM32CubeIDE و نصب کتابخانه

جلسه پنجم _ نحوه انجام تنظیمات در نرم افزار STM32CubeMX برای تولید کد برنامه چشمک زن

جلسه ششم _ برنامه نویسی یک چشمک زن ساده با استفاده از نرم افزار STM32CubeIDE

جلسه هفتم _ نحوه انجام تنظیمات پایه به صورت ورودی در نرم افزار STM32CubeMX و برنامه نویسی یک کلید

جلسه هشتم _ معرفی نرم افزار STM32 Flash Loader Demonstrator (پروگرامر سریال) 

جلسه نهم _ نحوه راه اندازی ال سی دی کاراکتری (قسمت اول)

جلسه دهم _ نحوه راه اندازی ال سی دی کاراکتری _ افزودن کتابخانه (قسمت دوم)

جلسه یازدهم _ نحوه راه اندازی ال سی دی کاراکتری _ معرفی توابع (قسمت سوم)

جلسه دوازدهم _ دوره آموزشی میکرو کنترلرهای STM32 _ راه اندازی واحد ADC(بخش اول)

جلسه سیزدهم_دوره آموزشی میکرو کنترلرهای STM32 _ راه اندازی واحد ADC(بخش دوم)

جلسه چهاردهم_دوره آموزشی میکرو کنترلرهای STM32 _ راه اندازی واحد تایمر(بخش اول)

جلسه پانزدهم_دوره آموزشی میکرو کنترلرهای STM32 _ راه اندازی واحد تایمر(بخش دوم)

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

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

جلسه هجدهم_دوره آموزشی میکرو کنترلرهای STM32 _ راه اندازی سون سگمنت(بخش اول)

جلسه نوزدهم _ نحوه راه اندازی سون سگمنت و برنامه آن در محیط STM32CubeIDE (بخش دوم)

جلسه بیستم _ نحوه راه اندازی واحد کانتر ونحوه انجام تنظیمات در محیط STM32CubeMX(بخش اول)

جلسه بیست و یکم _ نحوه راه اندازی کانتر و برنامه آن در محیط STM32CubeIDE (بخش دوم)

جلسه بیست و دوم _ نحوه راه اندازی واحد PWM (بخش اول) 

جلسه بیست و سوم _ نحوه راه اندازی واحد PWM (بخش دوم)

جلسه بیست و چهارم _ معرفی واحد UART و سطوح منطقی ولتاژ و انواع مبدل ها(بخش اول)

جلسه بیست پنجم _ نحوه راه اندازی واحد UART ونحوه انجام تنظیمات در محیط STM32CubeMX(بخش دوم)

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

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

این فیلد را پر کنید
این فیلد را پر کنید
لطفاً یک نشانی ایمیل معتبر بنویسید.
برای ادامه، شما باید با قوانین موافقت کنید