روی پینهای پورت 0 و 2 میکروکنترلر LPC1768 قابلیت ایجاد وقفه وجود دارد. و این قابلیت خیلی کاربردی هست. با هر تغییری(لبه بالا رونده و لبه پایین رونده) روی پینهای میکروکنترلر میتوانیم وقفه اایجاد کنیم.
رجیسترهای وقفههای GPIO میکروکنترلر LPC1768
رجیستر IntStatus
وضعیت کلی وقفههای GPIO را نشان میدهد.
رجیستر IntEnR
فعال و غیر فعال سازی وقفه لبه بالا رونده
رجیستر IntEnF
فعال و غیر فعال سازی وقفه لبه پایین رونده
رجیستر IntStatR
وضعیت وقفه برای لبه بالا رونده
رجیستر IntStatF
وضعیت وقفه برای لبه پایین رونده
رجیستر IntClr
پاک کردن پرچم وقفههای GPIO
توابع CMSIS وقفههای GPIO میکروکنترلر LPC1768
void GPIO_IntCmd(uint8_t portNum, uint32_t bitValue, uint8_t edgeState); FunctionalState GPIO_GetIntStatus(uint8_t portNum, uint32_t pinNum, uint8_t edgeState); void GPIO_ClearInt(uint8_t portNum, uint32_t bitValue);
این توابع داخل هدر lpc17xx_gpio.h موجود هستن و در زیر به برسی هر کدام از توابع میپردازیم.
تابع GPIO_IntCmd
void GPIO_IntCmd(uint8_t portNum, uint32_t bitValue, uint8_t edgeState);
این تابع برای فعال سازی وقفه GPIO مورد نظر روی پین و پورت مورد نظر استفاده میشود.
- ورودی اولش شماره پورت مورد نظر
- ورودی دومش شماره پین مورد نظر
- ورودی سوم هم حساس به لبه بالا رونده یا پایین رونده هست که 1 بالا رونده و 0 پایین رونده
تابع GPIO_GetIntStatus
FunctionalState GPIO_GetIntStatus(uint8_t portNum, uint32_t pinNum, uint8_t edgeState);
این تابع وضعیت وقفه را برمیگرداند که آیا وقفهای رخ داده یا نه
- ورودی اولش شماره پورت مورد نظر
- ورودی دومش شماره پین مورد نظر
- ورودی سوم هم حساس به لبه بالا رونده یا پایین رونده هست که 1 بالا رونده و 0 پایین رونده
- خروجی تابع : هم که صحیح یا غلط هست که 0و1 خودمون
تابع GPIO_ClearInt
void GPIO_ClearInt(uint8_t portNum, uint32_t bitValue);
این تابع برای پاک کردن پرچم وقفه مورد استفاده قرار میگیره.
- ورودی اولش شماره پورت مورد نظر
- ورودی دومش شماره پین مورد نظر
نکته خیلی مهم : وقفه GPIO با وقفه خارجی شماره 3 یا EINT3_IRQn به صورت مشترک هستن و روال وقفه شون هم یکی هست و در روال وقفه باید چک کنید که کدام وقفه رخ داده …. به مثال زیر توجه کنید کامل متوجه میشوید.
#include "inc/LPC17xx.h" #include "inc/lpc17xx_gpio.h" /*LPC1768 Tutorials Melec.ir M.jahandideh */ void EINT3_IRQHandler() { static uint8_t a; if(a==0) GPIO_SetValue(0, (1<<20)); else GPIO_ClearValue(0, (1<<20)); a=~a; GPIO_ClearInt(0, (1<<17)); } int main(void){ GPIO_IntCmd(0, (1<<17), 1); NVIC_SetPriority(EINT3_IRQn, 0); NVIC_EnableIRQ(EINT3_IRQn); GPIO_SetDir(0, (1<<20), 1); while(1){ } }
در این مثال پایه p0.17 که بهش یه شستی وصل کردیم را برای وقفه gpio در لبه بالا رونده تنظیم کردیم (وقفه روی پین P0.17 را در لبه بالا رونده فعال کردیم. ) بعد اومدیم اولویت بندی وقفه را 0 قرار دادیم و بعد وقفه GPIO که مشترک با وقفه خارجی شماره 3 هست را را فعال کردیم ( همانطور که در بالا مشاهده میکنید در قسمت فعال سازی اسم وقفه را نوشتیم EINT3_IRQn که در بالا علتش را توضیح دادیم).
در ادامه چایه P0.20 را که یک ال ای دی بهش وصل هست را هم بعنوان خروجی تعریف کردیم و در آخر یک حلقه بینهایت نوشتیم و برنامه را تمام کردیم.
در روال وقفه هم اگر دقت کنید میبینید که وضعیت یک ال ای دی را با هر دفعه رخ دادن وقفه برعکس میکنیم. و پرچم وقفه را غیر فعال میکنیم.
پایان این جلسه ازآموزش میکروکنترلرهای LPC1768.
منبع: میکرودیزاینرالکترونیک