وقفه‌ها در میکروکنترلر LPC1768

0
84
وقفه ها در میکروکنترلر LPC1768
وقفه ها در میکروکنترلر LPC1768

وقفه‌ها در میکروکنترلر LPC1768 ، قبل برسی موارد دیگر از امکانات جانبی میکروکنترلر lpc1768 واجب هست که وقفه‌ها در LPC1768 را برسی کنیم در این جلسه به برسی وقفه‌ها می‌پردازیم.

 

وقفه ها در میکروکنترلر LPC1768
وقفه ها در میکروکنترلر LPC1768

نکته: کنترل کننده وقفه‌ها در LPC1768 از نوع NVIC یا کنترل کننده وقفه تودرتوی برداری می‌باشد که باعث افزایش کارایی میکروکنترلر می‌شه…که ما فعلا ازش استفاده می‌کنیم بعدا می‌ریم دنبال مزایاش ?

منابع وقفه میکروکنترلر LPC1768

میکروکنترلر LPC1768 از 35 وقفه برای امکانات جانبی پشتیبانی می‌کنه که بعضی از وقفه‌ها دارای چند خط وقفه هستن…در عکس زیر منابع وقفه میکروکنترلر lpc1768 بهمراه شماره وقفه و اطلاعات بیشتر موجود است:

 

وقفه ها در میکروکنترلر LPC1768
وقفه ها در میکروکنترلر LPC1768
وقفه ها در میکروکنترلر LPC1768
وقفه ها در میکروکنترلر 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

پاسخ دهید

لطفا نظر خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید