ممکن است تنظیم کلاک میکروکنترلر LPC1768 برای عده ای از کاربران کمی گیج کننده به نظر برسد. به خصوص زمانی که به ظاهر تنظیمات کلاک به درستی انجام شده اما عملکرد میکروکنترلر قابل پیش بینی نیست. مثلا انتقال اطلاعات توسط UART به درستی انجام نمی شود. بنابراین داشتن درک کامل از چگونگی تنظیم کلاک LPC1768 بسیار حیاتی است.

LPC1768 منابع کلاک

در مرحله اول باید منبع کلاک واحد PLL0 را تعیین کنیم. در واقع کلاک اصلی به PLL0 وارد می شود و سپس فرکانس آن در چند عدد ضرب و تقسیم شده و کلاک پردازنده و سایر قسمتها تعیین می گردد. فرکانس کلاک توصیه شده برای میکروکنترلر LPC1768 از جانب NXP حداکثر 100MHz است و می تواند 3 نوع منبع کلاک مختلف داشته باشد:

• اسیلاتور RC داخلی که مقدار نامی آن 4MHz است و چندان دقیق نیست. این منبع پیش فرض می باشد.
• اسیلاتور خارجی که فرکانس آن می تواند بین 1 تا 24MHz باشد.
• اسیلاتور RTC که فرکانس 1Hz را برای واحد ساعت واقعی و 32KHz را برای PLL0 و CPU و watchdog تولید می کند.

باید دقت کرد که فقط اسیلاتور خارجی برای کار با واحدهای USB و CAN مناسب است. برای انتخاب یکی از این سه منبع از رجیستر CLKSRCSEL استفاده می کنیم. بیتهای 0 و 1 این رجیستر برای انتخاب منبع کلاک استفاده می شوند و سایر بیتها رزرو شده اند. برای انتخاب اسیلاتور داخلی 00 ، اسیلاتور اصلی ( خارجی ) 01 ، اسیلاتور RTC 10 را به بیتهای فوق نسبت می دهیم. اما 11 رزرو شده و نباید این دو بیت را با 11 تنظیم نمود. بنابراین در صورتی که بخواهیم منبع کلاک خارجی را انتخاب کنیم می توانیم از دستور زیر استفاده نماییم:

;LPC_SC->CLKSRCSEL=0X00000001


محدوده فرکانس اسیلاتور اصلی می تواند فرکانس پایین و از 1 تا 20MHz و فرکانس بالا بین 15MHz تا 24MHz باشد. برای انتخاب یکی از این دو محدوده از بیت شماره 4 رجیستر SCS به نام OSCRANGE استفاده می شود. 0 بودن این بیت به معنی انتخاب محدوده فرکانس پایین و 1 بودن آن به معنی انتخاب محدوده فرکانس بالا است.

همچنین برای فعال ساختن اسیلاتور اصلی از بیت 5 رجیستر SCS به نام OSCEN استفاده می شود که با 0 کردن آن اسیلاتور غیرفعال و با 1 کردنش اسیلاتور فعال می شود.

بیت 6 رجیستر SCS نیز فقط خواندنی بوده و 0 بودن آن به معنی آماده نبودن اسیلاتور و 1 بودنش به معنی آماده بودن اسیلاتور می باشد.

سایر بیتهای رجیستر SCS رزرو شده هستند. بنابراین اگر بخواهیم از کریستال خارجی 12MHz به عنوان منبع کلاک استفاده کنیم باید از دستور زیر استفاده نماییم:

;LPC_SC->SCS=0x20

PLL0 تنظیم فرکانس

حالا که منبع کلاک و محدوده آن مشخص شد باید فرکانس کلاک PLL0 را مشخص کنیم. فرکانس خروجی PLL0 طبق رابطه زیر محاسبه می شود:

که:
FCCO: فرکانس PLLCLK یا همان خروجی PLL است. مقدار این فرکانس باید بین 275MHz تا 550MHz باشد.
FIN: فرکانس کلاک ورودی PLL است که باید بین 32KHz تا 50MHz باشد.
N: مقداری است که فرکانس ورودی به آن تقسیم می شود و مقدار آن بین 1 تا 32 می باشد.
M: مقداری است که فرکانس در آن ضرب شده و افزایش می یابد. مقدار آن در فرکانسهای محدوده MHz می تواند بین 6 تا 512 باشد.

برای تنظیم فرکانس مورد نظر باید 4 مرحله زیر به ترتیب انجام شوند:

1- با استفاده از رجیستر PLL0CON واحد PLL0 را فعال کرده و خروجی آن را به سایر واحدها وصل می کنیم.
2- با استفاده از رجیستر PLL0CFG مقادیر ضرب کننده و تقسیم کننده M و N را تنظیم و فرکانس خروجی PLL0 را مشخص می نماییم.
3- مقدار رجیستر PLL0STAT را بررسی می کنیم تا خروجی PLL روی فرکانس دلخواه قفل شده باشد.
4- با استفاده از رجیستر PLL0FEED مقادیر تعیین شده در رجیسترهای PLL0CON و PLL0CFG را اعمال می نماییم.

شرح بیتهای 4 رجیستر بالا به شرح زیر است.

PLL0CON: فقط بیتهای 0 و 1 مورد استفاده قرار می گیرند. با 1 کردن بیت 0 واحد PLL اجازه می یابد روی فرکانس دلخواه قفل شود. با 1 کردن بیت 1 خروجی واحد PLL به سایر واحدها متصل می شود.

PLL0CFG: بیتهای 0 تا 14 این رجیستر مربوط به انتخاب ضرب کننده M هستند. هر مقداری که در این قسمت رجیستر قرار داده شود برابر M-1 است. بیت 15 رزرو شده است. بیتهای 16 تا 23 مربوط به انتخاب تقسیم کننده N هستند. هر مقداری که در این قسمت رجیستر قرار داده شود برابر N-1 است. بیتهای 24 تا 31 نیز رزرو شده اند.

PLL0STAT: این رجیستر وضعیت PLL را برمی گرداند. بیتهای 0 تا 14 نشان دهنده M-1 و بیتهای 16 تا 23 نشان دهنده N-1 هستند. بیت 24 نشان دهنده وضعیت فعال بودن PLL است. بیت 25 اتصال خروجی PLL به سایر واحدها را نشان می دهند. اگر بیت 26 این رجیستر 1 باشد PLL0 روی فرکانس مورد نظر قفل شده است. سایر بیتها رزرو شده اند.

PLL0FEED: با نوشتن مقدار 0xAA و بعد مقدار 0x55 در این رجیستر ، مقادیر رجیسترهای PLL0CON و PLL0CFG اعمال می شوند. در واقع تنظیم این دو رجیستر به تنهایی و بدون نوشتن مقدار 0xAA مقدار 0x55 در PLL0FEED هیچ تغییری در PLL0 ایجاد نخواهد کرد.

یکی از نکاتی که هنگام تعیین فرکانس باید رعایت شود این است که آیا قرار است از USB استفاده شود یا خیر؟ چرا که این واحد به دیوتی سایکل 50% فرکانس 48MHz نیاز دارد. بنابراین اگر بخواهیم از USB استفاده کنیم حتما فرکانس خروجی PLL0 باید مضرب صحیحی از 48MHz باشد.

همچنین باید توجه کرد که با انتخاب N کوچک ، M نیز کوچک خواهد بود و PLL0 با ثبات تر عمل خواهد نمود.

PLL0 مثال تنظیم فرکانس

اکنون با یک مثال نحوه محاسبات N و M را بررسی می کنیم.

فرض می کنیم که کریستال خارجی ما 10MHz است، از USB استفاده نمی کنیم و می خواهیم فرکانس کلاک پردازنده 100MHz باشد.

ابتدا با جابه جایی پارامترهای رابطه محاسبه فرکانس PLL0 آن را به شکل زیر بازنویسی می کنیم:

می دانیم که FIN برابر 10MHz است. برای اینکه FCCO مضرب صحیحی از 100MHz باشد و ضمنا بین 275MHz و 550MHz باشد می توانیم دو عدد 400MHz و 300MHz را در نظر بگیریم که از بین این دو 300MHz مناسب تر است چرا که انرژی کمتری مصرف می شود. با انتخاب این عدد و انتخاب N=1 ( کوچکترین عدد صحیح ممکن ) مقدار M برابر 15 خواهد بود. باید توجه نمود که مقادیر باید به نحوی انتخاب شوند که M عددی صحیح باشد.

بنابراین مقداری که باید در رجیستر PLL0CFG نوشته شود 0x0E خواهد بود. چرا که M-1=14 و N-1=0 .

تنظیم کلاک سایر واحدها

کلاک خروجی PLL که همان PLLCLK نامیده می شود کلاک سه بخش مختلف را تامین می کند:

1- کلاک پردازنده یا CCLK
2- کلاک USB یا USBCLK
3- کلاک لوازم جانبی یا PCLK

برای تنظیم فرکانس کلاک پردازنده باید خروجی PLL0 را بر یک عدد بین 1 تا 256 تقسیم نمود. این کار با استفاده از بیتهای 0 تا 7 رجیستر CCLKCFG انجام می شود که CCLKSEL نامیده می شود و مقداری که در آن می ریزیم باید 1 واحد کمتر از عدد تقسیم کننده باشد. برای واضح شدن این مطلب مثال قبل را در نظر می گیریم. با توجه به اینکه می خواستیم CCLK برابر 100MHz باشد و FCCO برابر 300MHz بود بنابراین عدد تقسیم کننده باید برابر 3 باشد و در نتیجه CCLKSEL را با دستور زیر برابر 2 تنظیم می کنیم:

;LPC_SC->CCLKCFG=0x00000002

برای تنظیم کلاک USB یا USBCLK روش مشابهی وجود دارد که روی رجیستر USBCLKCFG اعمال می شود. بیتهای 0 تا 3 که USBSEL نامیده می شود عدد تقسیم کننده FCCO را تعیین می کند که باید باز هم با 1 واحد جمع شود.

تنظیم کلاک لوازم جانبی نیز با استفاده از رجیسترهای PCLKSEL1 و PCLKSEL0 انجام می شود.

در صورتی که نخواهیم USB را با استفاده از خروجی PLL0 راه اندازی کنیم می توانیم کلاک آن را از PLL1 تامین نماییم. در این صورت خروجی PLL0 خود به خود از USB قطع می شود.

PLL0 مراحل راه اندازی

در پایان مراحل کامل راه اندازی PLL0 شرح داده می شود:

1- اگر PLL0 متصل است آن را با یک توالی PLL0FEED قطع می کنیم.
2- PLL0 را با یک توالی PLL0FEED غیر فعال می کنیم.
3- در صورت لزوم CCLKSEL را تغییر می دهیم تا عملیات بدون استفاده از PLL0 تسریع شود.
4- در صورت لزوم CLKSRCSEL برای تعیین منبع کلاک تنظیم می کنیم.
5- PLL0CFG را برای تعیین فرکانس کلاک خروجی PLL0 تنظیم می کنیم و آن را با یک توالی PLL0FEED اعمال می نماییم. توجه شود که PLL0CFG فقط زمانی قابل تغییر است که PLL0 غیرفعال شده باشد.
6- PLL0 را با یک توالی PLL0FEED فعال می کنیم
7- تقسیم کننده کلاک پردازنده یعنی CCLKSEL را با تنظیم CCLKCFG تغییر می دهیم. این کار حتما باید قبل از اتصال PLL0 انجام شود.
8- با بررسی بیت 26 رجیستر PLL0STAT مطمئن می شویم که فرکانس PLL0 قفل شده است. در بعضی فرکانسهای مرج PLL0 ممکن است این بیت 1 نشود. بنابراین می توان یک زمان ثابت نیز برای تثبیت شدن فرکانس خروجی در نظر گرفت و پس از گذشت آن زمان به مرحله بعد رفت.
9- واحد PLL0 را با یک توالی PLL0FEED به واحدهای دیگر وصل می کنیم.

برنامه

در مثال زیر می خواهیم نحوه برنامه نویسی مطالب فوق را نمایش دهیم.

فرض می کنیم که کریستال 12MHz را به عنوان منبع کلاک به کار برده ایم و می خواهیم فرکانس کلاک پردازنده 72MHz باشد. همچنین از USB استفاده نکرده و فرکانس کلاک لوازم جانبی هم مقدار پیش فرض یک چهارم فرکانس پردازنده است.

#include "lpc17xx.h"
	
	int main()
	{
		LPC_SC ->SCS=0x00000020;			//چون از کریستال 12 مگاهرتز استفاده می کنیم 
		while ((LPC_SC->SCS & (1<<6)) == 0);	// صبر می کنیم تا اسیلاتور آماده شود 
		LPC_SC->CCLKCFG   =0x00000003;		// تقسیم کننده پردازنده اصلی را برابر 4 در نظر می گیریم
		LPC_SC->CLKSRCSEL =0x00000001;		// اسیلاتور خارجی را به عنوان منبع کلاک تعیین می کنیم
		LPC_SC->PLL0CFG =0x0000000B;		// N=1 , M=12 => FCCO=288MHz 
		LPC_SC->PLL0CON   = 0x01;			//  را فعال می کنیم PLL0
		LPC_SC->PLL0FEED  = 0xAA;			//  را اعمال می کنیم PLL0 تنظیمات
		LPC_SC->PLL0FEED  = 0x55;
		while (!(LPC_SC->PLL0STAT & (1<<26)));	//   قفل شود PLL0 صبر می کنیم تا فرکانس 
		LPC_SC->PLL0CON   = 0x03;			//  را فعال و وصل می کنیم PLL0  
		LPC_SC->PLL0FEED  = 0xAA;			//  را اعمال می کنیم PLL0 تنظیمات
		LPC_SC->PLL0FEED  = 0x55;
		LPC_SC->PCLKSEL0  = 0x00000000;		// لوازم جانبی به صورت پیش فرض با فرکانس 
		LPC_SC->PCLKSEL0  = 0x00000000;		// یک چهارم کلاک پردازنده کار می کنند
	}

در مطلب بعدی خواهیم دید که چگونه همه تنظیمات فوق به وسیله configuration wizard به راحتی قابل انجام است.