در این جلسه میخواهیم پورتهای ورودی و خروجی lpc17xx_gpio میکروکنترلر LPC1768 را برسی کنیم البته برای سریهای مختلف فرقی ندارند و بطور کلی LPC17XX مینامیم.
میکروکنترلر LPC1768 حداکثر دارای پنج پورت و این پنج پورت سرجمع دارای هفتاد پین ورودی و خروجی میباشند. نام گذاری پورتها بصورت P0,P1,P2,P3,P4 میباشند.
بعضی پورتها دارای 32 پایه و بعضی دیگر کمترند و در داخل بعضی پورتها بعضی پینها قابل استفاده نیستن! مثلا پینهای P0[12,13,14],P1[2,3,5,6,7,11,12,13] قابل استفاده نیستن. بقیه پینها بصورت زیر هستن:
P[30:0] P1[31:0] P2[13:0] P3[26:25] P4[29:28]
فایل PDF زیر نقشه پایههای میکروکنترلر LPC1768 میباشد. فایل زیر را دانلود کنید در ادامه آموزشها هم لاز میشه.
برای اطلاعات دقیق تر در مورد پینهای ورودی و خروجی به قست pin configuration مراجعه کنید. خب اول کاری گفتم نمیخوام با رجیسترهای میکروکنترلر LPC1768 کار کنیم و سعی میکنیم همه برنامهها و آموزشها بر اساس توابع CMSIS باشند در این قسمت فقط نگاهی گذرا به رجیسترها میاندازیم و میریم سر توابع lpc17xx_gpio.h که خیلی راحتر یاد بگیریم.
رجیسترهای GPIO میروکنترلر LPC1768
- رجیستر FIOxDIR
این رجیستر برای تعیین جهت پورتها (ورودی یا خروجی ) مورد استفاده میشود.
- رجیستر FIOxSET
این رجیستر جهت 1 کردن پینهایی که بصورت خروجی تعریف شدن.
- رجیستر FIOxCLR
این رجیستر جهت 0 کردن پینهایی که بصورت خروجی تعیین شدن.
- رجیستر FIOxPIN
این رجیستر دسترسی مستقیم به پورتهای ورودی و خروجی را فراهم میکند. بطور مستقیم میتوانیم روی پین بنویسید و بخوانیم.
- رجیستر FIOxMASK
برای اینکه در پورت بعضی بیتها را از عملیات نوشتن/خواندن یا تغییر حالت ورودی/ خروجی محافظت کنیم از این رجیستر استفاده میکنیم.
- رجیسترهای PINSEL 0-10
جهت اننتخاب نحوه عملکرد پینها مورد استفاده قرار میگیرد بعضی پینها عملکردهای مختلفی مانند GPIO,UART,SPI,… دارن
- رجیسترهای PINMODE 0-9
جهت تنظیم مقاومتهای PULL-UP و PULL-DOWN داخلی پورتها
- رجیتسرهای PINMODE_OP 0-4
برای انتخاب حالت Open Drain یا درین باز پینها مورد استفاده قرار میگیرن.
خب تا اینجا مروری کردیم بر رجیسترهای GPIO میکروکنترلر LPC1768، بریم سراغ توابع CMSIS برای کار با ورودی و خروجیها.
برسی توابع کار با GPIO کتابخانه lpc17xx_gpio.h
تابع GPIO_ReadValue
Uint32_t GPIO_ReadValue(uint8_t portNum);
برای خوندن مقدار یک پورت استفاده می شود.
- ورودی تابع port_Num شماره پورتی که میخواهید بخوانید.
- خروجی تابع uint32_t وضعیت پورت
تابع GPIO_SetDir
void GPIO_SetDir(uint8_t portNum, uint32_t bitValue, uint8_t dir);
برای تعیین ورودی/خروجی پین های پورت مورد استفاده قرار میگرد.
- ورودی portNum : شماره پورت مورد نظر
- ورودی bitValue: شماره پین های مورد نظر
- ورودی dir : اگر 0 باشد ورودی و اگر 1 باشد خروجی
تابع GPIO_SetValue
void GPIO_SetValue(uint8_t portNum, uint32_t bitValue);
برای یک کردن پینهایی که خروجی تعیین شدن.
- ورودی portNum : شماره پورت مورد نظر
- ورودی bitValue : شماره پینهای مورد نظر
تابع GPIO_ClearValue
void GPIO_ClearValue(uint8_t portNum, uint32_t bitValue);
برای صفر نمودن پینهای یک پورت استفاده میشه.
- ورودی portNum: شماره پورت مورد نظر
- ورودی bitValue: شماره پینهای مورد نظر
نکته مهم : این هدر فایل دارای توابع بیشتری میباشد مثلا FIO_HalfWordSetDir که بصورت 16 بیتی میتونیم وضعیت ورودی و خروجیها را تعیین کنیم. که در این مرحله از یادگیری به این توابع نیاز نداریم.
مثال
پینهای 21 و 22 از پورت 0 را خروجی تعیین و پین 21 را 1 و پین 22 را 0 کنید.
#include "lpc17xx.h" #include "lpc17xx_gpio.c" int main(void){ GPIO_SetDir(0, (1<<21)|(1<<22), 1); GPIO_SetValue(0, (1<<21)); GPIO_ClearValue(0, (1<<22)); }
مثال دوم
مقدار پورت 0 را خوانده و در متغییر A ذخیره کنید.
#include "lpc17xx.h" #include "lpc17xx_gpio.c" int main(void){ uint32_t A; A=GPIO_ReadValue(0); }
خب فک کنم یاد گرفتین چطوری در میکروکنترلر LPC1768 پایهها را ورودی/خروجی تعیین کنید و مقدار آن را صفر/یک کنید ویا بخوانید.
منبع: میکرودیزاینرالکترونیک