در بسیاری از مدلهای دیگر LPC ممکنه روال کار همین شکلی باشه . دوستانی که با 1768 و ... کار کردن بهتر میدونند.
همون طور که از اسم این دو رجیستر معلومه اولی برای کانفیگ کردن پورت و دومی برای نسبت دادن یا خواندن از پورت است.
مقداردهی به رجیستر IOCON باید طبق منوال صورت بگیره . از صفحه 55 تا 79 نوشته که هر پین به چه صورتهایی میتونه کانفیگ بشه ..
بعضی از پینها بصورت پیش فرض در حالت GPIO قرار دارند و بعضی دیگه مثل پینهای مربوط به JTAG و SWD و I2C در حالت عملکرد خودشون هستند و اگه ما دستورات GPIO رو براشون بکار ببریم مشاهده میکنیم که پین هیچ تغییری نمی کنه ! چون اصلا تو مد GPIO نیست . هر پین این میکرو میتونه بصورت ورودی- خروجی - pullup- pull down و همچنین حالت hystersis قرار بگیره .
همچنین این میکرو با قابلیت جالبی بنام GPIO MASK شما رو قادر به این امر میکنه که در حالت ورودی یا خروجی بدون اعمال عملیات بیتی اضافی مثل and و or و .. اطلاعاتتون رو مستقیم روی پورت بریزید و تنها تغییرات روی پین های مورد نظر شما اعمال بشه .
در واقع رجیستر MASK مثل یک غربال (آبکش) عمل میکنه ! شما اطلاعات رو توش میریزید و سوراخهایی که بسته هستند اطلاعات رو عبور نمیدن ولی قسمتهای دیگه اطلاعات رو روی پین های مورد نظر شما انتقال میدن .. به شکل بالا و قسمت ENABLE پین نگاه کنید ..
همون طور که میدونید میکروهای Cortex-M3 از پشتیبانی CMSIS برخوردارند . پس باید یه سری توابع آماده برای این میکرو وجود داشته باشه ولی من زمانی که کار با این میکرو رو شروع کردم فکر میکردم با ساپورتی مثل STM32 مواجه بشم ولی متاسفانه منابع کمی براش دیدم و یه کتابخانه CMSIS که حتی قسمت GPIO اون کمی ایراد داشت و منو چند ساعت برای راه اندازی پورتهای GPIO معطل کرد !!
خب ، به هر حال یه فایل LPC13xx.h به ما تحویل دادن که رجیستر های این میکرو داخلش نوشته شده . مثلا برای دسترسی به پین ها یک structure ترکیبی با Mask پورت گذاشتن به این صورت :
[PHP]LPC_GPIO[portNum]->MASKED_ACCESS[0xfff] |= 1<<5;[/PHP]
در این دستور بجای portNum باید شماره پورت میکرو از 0 تا 3 قرار بگیره
در زیر شاخه این ساختار ما به Mask پورت دسترسی داریم که در اینجا FFF گذاشته یعنی همه پورت جهت تغییرات انتخاب شده . چرا FFF ؟ چون هر پورت 12 بیتی هست البته بجز پورت 3 .
در قسمت آخر شما عدد مورد نظر رو به پورت یا پین نسبت میدید . علت تخصیص دادن مقدار با عملگر OR رو هم که میدونید . برای اینکه هر بار با مقدار دهی به پورت بقیه مقادیر تغییر نکنند ما دیتای جدید رو OR میکنیم . البته اگر بخواهیم بیتی رو پاک کنیم باید از AND استفاده کنیم . در ادامه مثال میزنم ..
ضمنا اگه مطالب زیادی ساده گفته شد ببخشید . لطفا نظر هم بدید بد نیست !