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

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

آموزش میکروکنترلرهای LPC1768 جلسه هشتم: وقفه ها NVIC

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

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

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

آموزش میکروکنترلرهای LPC1768 جلسه هشتم: وقفه ها NVICآموزش میکروکنترلرهای LPC1768 جلسه هشتم: وقفه ها NVIC

وقفه NMI

پایه  P2.10 روی میکروکنترلر ، دارای وقفه غیر قابل پوشش میباشد که با انتخاب عملکرد NMI برای این پایه میتوانیم از این قابلیت استفاده کنیم که حالا بعدا میاییم دنبالش ولی فعلا بریم سر مطالب آسون تر.

رجیستر های فعال سازی وقفه

با رجیستر های ISER0,ISER1 میتونیم وقفه های امکانات جانبی را فعال کنیم.

رجیستر های غیرفعال سازی وقفه

با رجیستر های  ICER0,ICER1 میتونیم وقفه های فعال را غیر فعال کنیم.

رجیستر های تعویق وقفه

اگر وقفه ای رخ دهد اما نتواند اجرا شود وقفه به تعویق میافته ! با این رجیستر ها وقفه ها را وادار به تعویق میکنیم. رجیستر های ISPR,ICPR برای ست کردن و پاک کردن حالت تعویق وقفه میباشند…

مطلب پیشنهادی:  پورت های ورودی و خروجی میکروکنترلر LPC1768

رجیستر IABR

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

دستور یا تابع  NVIC_GetActive(NAME_IRQn)  این کار را راحتر انجام میده. با چک کردن خروجی این تابع میتوانیم از فعال بودن وقفه باخبر شویم.

رجیسترهای IPR یا تعیین سطح اولویت

این رجیستر ها 9 تا هستند که برای تعیین سطح اولویت 32 بیتی میباشند و هر وقفه 5 بیت جهت تعیین اولویت از این رجیستر ها را استفاده میکند. برای سادگی کار از تابع زیر برای تعیین اولویت وقفه ها استفاده میکنیم.

NVIC_SetPriority(NAME_IRQn,X);

NAME_IRQn  نام یا شماره وقفه مورد نظر و X اولویت آن میباشد که 0 بیشترین و 31 کمترین اولویت میباشد. گروه بندی اولویت وقفه هم داریم که فعلا ولش کنید 🙂

رجیستر وقفه نرم افزاری STIT

از این رجیستر برای ایجاد وقفه های نرم افزاری امکانات جانبی استفاده میشود.

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

دقت داشته باشید این توابع چون برای کنترل هسته میکروکنترلر هستند پس توابع درونی هستن که بعدا در یک جلسه بیشتر توضیح میدم و این توابع نیاز به فراخوانی کتابخونه جدا مثل امکانات جانبی میکروکنترلر ندارن و با هدر های هسته در ارتباط هستن…

مطلب پیشنهادی:  نرم افزار ARMwizard

تابع 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 ♥

مطلب پیشنهادی:  آموزش ایجاد پروژه در Keil

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>

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

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

یک دیدگاه

  1. سلام دوست گرامی .خیلی ممنون از بابت اموزشهای خیلی خوبتون .خداقوت