در جلسه گذشته مبدل دیجیتال به آنالوگ را برسی کردیم و قبل برسی موارد دیگر از امکانات جانبی میکروکنترلر lpc1768 واجب هست که وقفه ها در LPC1768 را برسی کنیم در این جلسه به برسی وقفه ها میپردازیم.
نکته: کنترل کننده وقفه ها در LPC1768 از نوع NVIC یا کنترل کننده وقفه تودرتوی برداری میباشد که باعث افزایش کارایی میکروکنترلر میشه…که ما فعلا ازش استفاده میکنیم بعدا میریم دنبال مزایاش 🙂
منابع وقفه میکروکنترلر LPC1768
میکروکنترلر LPC1768 از 35 وقفه برای امکانات جانبی پشتیبانی میکنه که بعضی از وقفه ها دارای چند خط وقفه هستن…در عکس زیر منابع وقفه میکروکنترلر lpc1768 بهمراه شماره وقفه و اطلاعات بیشتر موجود است:
وقفه NMI
پایه P2.10 روی میکروکنترلر ، دارای وقفه غیر قابل پوشش میباشد که با انتخاب عملکرد NMI برای این پایه میتوانیم از این قابلیت استفاده کنیم که حالا بعدا میاییم دنبالش ولی فعلا بریم سر مطالب آسون تر.
رجیستر های فعال سازی وقفه
با رجیستر های ISER0,ISER1 میتونیم وقفه های امکانات جانبی را فعال کنیم.
رجیستر های غیرفعال سازی وقفه
با رجیستر های ICER0,ICER1 میتونیم وقفه های فعال را غیر فعال کنیم.
رجیستر های تعویق وقفه
اگر وقفه ای رخ دهد اما نتواند اجرا شود وقفه به تعویق میافته ! با این رجیستر ها وقفه ها را وادار به تعویق میکنیم. رجیستر های ISPR,ICPR برای ست کردن و پاک کردن حالت تعویق وقفه میباشند…
رجیستر IABR
وقتی وقفه ای رخ میده بیت مربوط به آن در این رجیستر یک میشه و بعد از اجرای روال وقفه و بازگشت از وقفه این بیت پاک میشه.
دستور یا تابع NVIC_GetActive(NAME_IRQn) این کار را راحتر انجام میده. با چک کردن خروجی این تابع میتوانیم از فعال بودن وقفه باخبر شویم.
رجیسترهای IPR یا تعیین سطح اولویت
این رجیستر ها 9 تا هستند که برای تعیین سطح اولویت 32 بیتی میباشند و هر وقفه 5 بیت جهت تعیین اولویت از این رجیستر ها را استفاده میکند. برای سادگی کار از تابع زیر برای تعیین اولویت وقفه ها استفاده میکنیم.
NVIC_SetPriority(NAME_IRQn,X);
NAME_IRQn نام یا شماره وقفه مورد نظر و X اولویت آن میباشد که 0 بیشترین و 31 کمترین اولویت میباشد. گروه بندی اولویت وقفه هم داریم که فعلا ولش کنید 🙂
رجیستر وقفه نرم افزاری STIT
از این رجیستر برای ایجاد وقفه های نرم افزاری امکانات جانبی استفاده میشود.
توابع CMSIS مربوط به وقفه ها در میکروکنترلر LPC1768
دقت داشته باشید این توابع چون برای کنترل هسته میکروکنترلر هستند پس توابع درونی هستن که بعدا در یک جلسه بیشتر توضیح میدم و این توابع نیاز به فراخوانی کتابخونه جدا مثل امکانات جانبی میکروکنترلر ندارن و با هدر های هسته در ارتباط هستن…
تابع NVIC_SetPendingIRQ
تابع فعال کردن تعویق وقفه مورد نظر
NVIC_ SetPendingIRQ (NAME_IRQn);
NAME_IRQn نام یا شماره وقفه مورد نظر میباشد.
تابع NVIC_ClearPendingIRQ
تابع غیرفعال کردن تعویق وقفه مورد نظر
NVIC_ ClearPendingIRQ (NAME_IRQn);
NAME_IRQn نام یا شماره وقفه مورد نظر میباشد.
تابع NVIC_GetPendingIRQ
دریافت وضعیت تعویق وقفه مورد نظر
Uint32_t NVIC_ GetPendingIRQ (NAME_IRQn);
NAME_IRQn نام یا شماره وقفه مورد نظر میباشد.
تابع NVIC_SetPriority
تابع فعال کردن اولویت وقفه مورد نظر
NVIC_SetPriority(NAME_IRQn,X);
NAME_IRQn نام یا شماره وقفه مورد نظر و X اولویت آن میباشد که 0 بیشترین و 31 کمترین اولویت میباشد.
تابع NVIC_GetPriority
تابع دریافت وضعیت اولویت وقفه مورد نظر
Uint32_t NVIC_GetPriority(NAME_IRQn);
NAME_IRQn نام یا شماره وقفه مورد نظر میباشد.
تابع NVIC_EnableIRQ
فعال سازی وقفه مورد نظر
NVIC_ EnableIRQ (NAME_IRQn);
NAME_IRQn نام یا شماره وقفه مورد نظر میباشد.
تابع NVIC_DisableIRQ
غیر فعال سازی وقفه مورد نظر
NVIC_ DisableIRQ (NAME_IRQn);
NAME_IRQn نام یا شماره وقفه مورد نظر میباشد.
تابع NVIC_ GetActive
تابع دریافت وضعیت فعال بودن وقفه مورد نظر
Uint32_t NVIC_ GetActive (NAME_IRQn);
NAME_IRQn نام یا شماره وقفه مورد نظر میباشد.
روال سرویس وقفه ها ISR
روش سرویس وقفه ها بصورت زیر میباشد البته شکل های دیگری هم دارد ولی این روش بدلیل شبیه بودن به تابع حفظ کردنش راحتره…
void NAME_IRQHandler(void){ //user instructions }
مثال
#include "LPC17xx.h" void EINT3_IRQHandler() { // } int main(void){ NVIC_SetPriority(EINT3_IRQn, 0); NVIC_EnableIRQ(EINT3_IRQn); while(1); }
مثال بالا را خیلی ساده نوشتم و البته خروجی خاصی هم ندارد فقط نحوه تعیین اولویت ، فعال کردن وقفه و روال وقفه را نوشتم تا ببینید کار با وقفه ها چقدر راحت هست. در جلسات آینده وقفه های خارجی را راه اندازی میکنیم. پایان جلسه هشتم آموزش میکروکنترلرهای LPC1768 ♥
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
سلام دوست گرامی .خیلی ممنون از بابت اموزشهای خیلی خوبتون .خداقوت