جلسه پانزدهم _ نحوه راه اندازی وقفه با تحریک خارجی و برنامه نویسی و راه اندازی این آن در محیط keil
در ادامه آموزش راه اندازی وقفه با تحریک خارجی در این جلسه قصد داریم تا با توابع مربوط به آن و نحوه برنامه نویسی و راه اندازی اینتراپت خارجی آشنا شویم پس از تولید پروژه توسط نرم افزار STM32CubeMX و باز نمودن برنامه توسط نرم افزار کیل به سراغ فایل main.c می رویم تا دستورات موجود در آن که مرتبط با وقفه خارجی هستند را توضیح دهیم. در ابتدا به سراغ تابع MX_GPIO_Init می رویم که در آن پایه های اینتراپت تنظیم شده اند.
همانطور که در تصویر بالا مشخص است برای دو پایه مورد نظر لیبل های تنظیم شده مشخص هستند که در خطوط بعدی آن نوع تشخیص لبه اینتراپت و وضعیت Pull up بودن پایه ها مشخص شده اند. در ادامه این تابع اولویت اینتراپت ها مشخص شده است.
در تصویر بالا اولویت هر کدام از اینتراپت ها مشخص شده و اینتراپت مربوط به آنها فعال شده است.
برای دسترسی به توابع مربوط به اینتراپت های خارجی کافیست از بخش Project از پوشه Aplication/User کتابخانه stm32f1xx_it.c را انتخاب نمایید توابع کاربردی و مرتبط با این پروژه به شرح زیر می باشند.
(void EXTI0_IRQHandler(void
تابع مربوط به اینتراپت صفر می باشد به این معنی که در صورتیکه اینتراپتی روی پایه EXTI0 اتفاق بی افتد برنامه به این تابع مراجعه می کند که این تابع خود نیز تابع دیگری را به نام HAL_GPIO_EXTI_IRQHandler صدا می زند و در آرگومان این تابع پین مربوط به اینتراپت را ارسال می کند.
(void EXTI9_5_IRQHandler(void
در صورتیکه هر کدام از پایه های اینتراپت های خارجی 5 تا 9 فعال شوند برنامه به این تابع مراجعه می کند که برای تشخیص اینکه کدامیک از ورودی های اینتراپت 5 تا 9 فعال شده است باید پین مورد نظر در آرگومان تابع HAL_GPIO_EXTI_IRQHandler قرار می گیرد و این تابع فراخوانی می شود.
(void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin
برای دسترسی به تابع بالا باید از پوشه 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 می پردازیم.
با توجه به اینکه ما قصد استفاده از دو وقفه را داریم دو متغیر را تعریف می کنیم تا با هر بار فعال شدن اینتراپت مربوطه یکی به متغیر مربوط به آن اضافه شود. با توجه به اینکه این متغیر ها در کتابخانه stm32f1xx_it.c نیز استفاده می شوند extern آنها را نیز به کتابخانه stm32f1xx_it.c مطابق تصویر زیر اضافه می کنیم.
با توجه به اینکه سرعت اجرای دستورات بسیار بالا می باشد و در هنگام کلید زنی لزرش به وجود می آید احتمال اینکه با هر بار کلید زدن تعداد متغیرها بیشتر از یکی اضافه شود خیلی بالاست پس برای رفع این مشکل باید متغیری را تعریف نمود تا از این مشکل جلوگیری کند و شمارش بصورت صحیح اتفاق بی افتد.
متغیر بالا وظیفه رفع مشکل Bounce را بر عهده دارد.extern این تابع باید به کتابخانه stm32f1xx_it.c اضافه شود.
در فایل main.c ابتدا ال سی دی پیکربندی می شود و متن های مورد نظر نوشته می شوند، پس از گذشت 2 ثانیه وارد حلقه while می شویم و در این حلقه مدام تعداد کلید فشرده شده برای هر کدام از وقفه ها نمایش داده می شود و هر 500 میلی ثانیه وضعیت LED تغییر می کند و متغیر Allow_Increment با مقدار یک مقدار دهی می شود این امر باعث می شود تا قبل از اینکه اطلاعات کلید فشرده شده بر روی نمایشگر نمایش داده نشده متغیر مربوط به آن دیگر اضافه نشود. با یک شدن این متغیر مجوز افزایش متغیر مربوط به وقفه ها صادر می شود.
حال به سراغ stm32f1xx_it.c که در آن تابع مربوط به اجرای دستورات در صورت وقوع وقفه را اضافه کرده ایم می رویم.
در این تابع ابتدا بررسی می کنیم که فعال شدن کدام اینتراپت منجر به صدا زدن این تابع شده است و پس از آن بررسی می کنیم که اگر اجازه افزایش متغیر مربوط به آن اینتراپت را داریم متغیر آن را یکی اضافه می کنیم و پس از آن با صفر کردن Allow_Increment از زیاد شدن متغیر قبل از نمایش آن بر روی ال سی دی ممانعت می کنیم.
در انتها می توانید شماتیک مربوط به این جلسه و برنامه (keil , STM32CubeMX) آنرا دانلود نمایید.
دلتون شاد و لبتون پرخنده
محمد هادی دشتی
دیگر آموزش ها مرتبط با STM32:
برای مشاهده آموزش جلسه اول(معرفی هسته آرم و میکروکنترلرهای 32 بیتی شرکت ST ) کلیک کنید.
برای مشاهده آموزش جلسه دوم( معرفی نرم افزارهای مورد نیازجهت برنامه نویسی و پروگرام ) کلیک کنید.
برای مشاهده آموزش جلسه سوم( نحوه دانلود آخرین نسخه از نرم افزار STM32CubeMX ) کلیک کنید.
برای مشاهده آموزش جلسه چهارم(نحوه انجام تنظیمات در نرم افزار STM32CubeMX ) کلیک کنید.
برای مشاهده آموزش جلسه پنجم(نحوه برنامه نویسی پروژه چشمک زن با نرم افزار Keil ) کلیک کنید.
برای مشاهده آموزش جلسه ششم(نحوه تولید کد و تنظیمات در محیط STM32CubeMX و برنامه نویسی در محیط Keil برای راه اندازی کلید) کلیک کنید.
برای مشاهده آموزش جلسه هفتم(معرفی نرم افزار STM32 Flash Loader Demonstrator و نحوه دانلود برنامه و پروگرام کردن میکرو) کلیک کنید.
برای مشاهده آموزش جلسه هشتم( نحوه راه اندازی ال سی دی کاراکتری-قسمت اول) کلیک کنید.
برای مشاهده آموزش جلسه نهم( نحوه راه اندازی ال سی دی کاراکتری و آشنایی با دستورات کاربردی کتابخانه ال سی دی کاراکتری ) کلیک کنید.
برای مشاهده آموزش جلسه دهم(دوره آموزشی میکرو کنترلرهای STM32 _ راه اندازی واحد ADC(بخش اول) ) کلیک کنید.
برای مشاهده آموزش جلسه یازدهم(دوره آموزشی میکرو کنترلرهای STM32 _ راه اندازی واحد ADC(بخش دوم) ) کلیک کنید.
برای مشاهده آموزش جلسه دوازدهم(دوره آموزشی میکرو کنترلرهای STM32 _ راه اندازی واحد تایمر(بخش اول) ) کلیک کنید.
برای مشاهده آموزش جلسه سیزدهم(دوره آموزشی میکرو کنترلرهای STM32 _ راه اندازی واحد تایمر(بخش دوم) ) کلیک کنید.