وقفهها در میکروکنترلر LPC1768 ، قبل برسی موارد دیگر از امکانات جانبی میکروکنترلر 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); }
مثال بالا را خیلی ساده نوشتم و البته خروجی خاصی هم ندارد فقط نحوه تعیین اولویت، فعال کردن وقفه و روال وقفه را نوشتم تا ببینید کار با وقفهها چقدر راحت هست.
منبع: میکرودیزاینرالکترونیک