ساعت سری LPC2xxx یک ساعت دقیق که برای کار تا سال 2099 تنظیم شده است می باشد. مانند تمام واحدهای جانبی دیگر میکرو های ارم ،RTC نیز توسط PCLK کلاک زده می شود و احتیاج به اسیلاتور خارجی ندارد .RTC این سری به گونه ای طراحی شده است که یک واحد جانبی با مصرف توان فوق العاده پایین باشد و در صورت استفاده از LPC2xxx در مدهای کم توان مناسب برای استفاده برای عملکرد بدون باتری می باشد.علاوه بر فراهم کردن یک تقویم زمانی RTC دارای یک دسته از رجیسترهای هشدار (alarm)می باشد که می تواند برای تریگر کردن یک زمان و تاریخ خاص و یا در هنگام رسیدن به یک مقدار ذخیره شده در رجیستر زمان شمار استفاده شود.
مخصوص اعضای ویژه (vip)
کلاک RTC در فرکانس استاندارد 32.7KHz کار می کند. به منظور فراهم کردن این فرکانس PCLK به مقسم کلاک مرجع متصل است. این مقسم می تواند با دقت فراوان هر فرکانسی از PCLK را برای تولید فرکانس 32.7KHz استفاده کند.
برای اطمینان از اینکه کلاک RTC بتواند با دقت از مقادیر مختلف PCLK بدست آید مقسم این واحد پیچیده تر از مقسم تایمر همه منظوره عمل می کند. این مقسم به وسیله دو رجیستر به نامهای PREINT و PREFRAC برنامه ریزی می شود . همانطور که از نام آنها مشخص است این رجیسترها مقدار صحیح و اعشار مقدار مقسم را نگه می دارد. معادله استفاده شده برای محاسبه مقادیر لازم برای این رجیستر به صورت زیر می باشد.
PREINT=(int)(PCLK/32768)-1.
PREFRAC=PCLK-((PREINT+1)*32768).
به عنوان مثال برای PCLK=30MHz داریم:
PREINT=(int)(30,000,000/32768)-1=914.
PREFRAC=30,000,000-((914+1)*32768)=17280.
حال این مقادیر می تواند به صورت مستقیم در داخل رجیسترهای مقسم RTC قرار بگیرد و بعد از آن RTC آماده کارکردن می باشد. در انتها باید کلاک را در رجیستر کنترل کلاک فعال کرد تا شمارنده های زمان به کار افتد. واحد RTC دارای هشت رجیستر شمارنده زمان است که هر کدام از آنها شامل یک کمیت زمانی مستقل خواهد بود که می توان به طور مستقل در هر زمان خوانده شوند.به علاوه یک دسته از رجیستر های پیوسته وجود دارند که همان کمیت های زمانی را در یک رجیستر سه کلمه ای نگه می دارد که به کاربر اجازه می دهد همه اطلاعات زمانی را در طی سه عملیات بخواند. همچنین RTC می تواند آلارمهایی را به صورت وقفه در زمان های قابل برنامه ریزی تولید کند. دو مکانیزم برای تولید وقفه وجود دارد.در حالت اول شما می توانید RTC را برای تولید وقفه هنگامیکه هر یک از رجیستر های شمارنده زمان افزایش می یابد تنظیم کنید بطوریکه به عنوان مثال شما می توانید یک وقفه را هر یک ثانیه هنگامیکه شمارنده ثانیه به روز می شود تولید کنید یا یکبار در سال هنگامیکه شمارنده سال افزایش می یابد. رجیستر شمارنده افزایش وقفه CIIR این امکان را به شما می دهد که یک وقفه افزایشی را برای هر یک از این 8 رجیستر فعال کنید. حالت دوم برای تولید وقفه به وسیله رجیستر های آلارم می باشد.هر بار که رجیستر شمارنده یک تطابق با رجیستر آلارم داشته باشد اگر رجیستر انطباق آلارم ماسک نشده باشد و با رجیستر شمارنده زمان مطابقت یابد یک وقفه تولید می شود. اگر همه رجیستر های آلارم با رجیسترهای شمارنده زمان تطابق یابد یک وقفه تولید خواهد شد که در این صورت می توان یک وقفه بین زمان حال تا سال 2099 با دقت یک ثانیه تولید کرد. رجیستر پوشش آلارم تعیین می کند که کدام رجیستر آلارم در هنگام مقایسه فعال شود. هر دو رویداد آلارم و افزایش می توانند یک وقفه RTC تولید کنند و ضروری است که بین آنها تمایز قائل شوید. رجیستر محل وقفه ILR دارای دو پرچم می باشد که می توان برای مشخص کردن علت وقفه RTC مورد بازبینی قرار گیرد.همچنین بیاد داشته باشید که این پرچم ها باید برای لغو کردن وقفه پاک شوند. یک نمونه برنامه RTC که ساعت را تنظیم و از هر دونوع وقفه استفاده می کند در زیر آمده است.
#include <LPC21xx.H>
void clock(void);
void RTC_isr(void)__irq;
unsigned counter = 0;
int main(void)
{
IODIR1= 0x00FF0000; // set LED ports to output
IOCLR1 = 0x00FF0000;
PREINT = 0x00000392; //Set RTC prescaler for 12.000Mhz Xtal
PREFRAC = 0x00004380;
CIIR = 0x00000001; //Enable seconds counter interrupt
SEC= 0x00000000;
ALSEC= 0x00000003;//Set alarm register for 3 seconds
AMR= 0x000000FE; //Enable seconds Alarm
CCR= 0x00000001; //Start the RTC
VICVectAddr13 = (unsigned)RTC_isr; //Set the timer ISR vector address
VICVectCntl13 = 0x0000002D; //Set channel
VICIntEnable= 0x00002000; //Enable the interrupt
while(1)
{
counter++;
}
}
void RTC_isr(void)__irq
{
unsigned led;
if(ILR&0x00000001) //Test for RTC counter interrupt
{
led = IOPIN1; //read the current state of the IO pins
IOSET1= 0x00010000; //Set the idle LED
ILR= 0x00000001; //Clear the interrupt register
}
if(ILR & 0x00000002)
{
IOSET1 = 0x00100000; //Set LED 0.7
ILR = 0x00000002;
}
VICVectAddr = 0x00000000; //Dummy write to signal end of interrupt
}
در زیر رجیسترهای RTC را مشاهده می کنید که در مورد هرکدام یک توضیح مختصر داده ام. ILR : رجیستر محل وقوع وقفه؛ این رجیستر تعیین می کند که کدام بلوک درخواست وقفه کرده است.نوشتن یک در هر بیت وقفه متناظر را پاک کمی کند.این روش به برنامه نویس این امکان را می دهد که مقدار این رجیستر را بخواند و مجددا در آن بنویسد تا فقط وقفه ای که روی داده شده است پاک شود.این رجیستر دارای دوبیت RTCCIF مربوط به وقفه افزایش شمارنده و RTCALF وقفه مربوط به رجیستر آلارم می باشد.
رجیستر CCR :رجیستر کنترل ساعت؛ این رجیستر عملکرد مدار تقسیم کلاک را کنترل می کند که دارای 4 بیت می باشد. CLKEN که با یک کردن این بیت کانتر فعال می شود.CTCRST هنگامیکه این بیت یک است مقدار رجیستر CTC ریست می شود و تا هنگامیکه به صفر تغییر نکند در همین حالت باقی می ماند.CTTEST این بیتها باید در حال عملکرد عادی صفر بمانند.
رجیستر CIIR: این رجیستر این قابلیت را دارد که هر بار که شمارنده افزایش یابد تولید یک وقفه نماید و این وقفه معتبر می ماند تا هنگامیکه بوسیله نوشتن مقدار یک در رجیستر [0]ILR پاک شود.
AMR: این رجیستر به شما این امکان را می دهد که هر یک از رجیستر های الارم را ماسک نمایید.جدول زیر رابطه بین بیتهای رجیستر AMR و آلارم را نمایش می دهد.برای عملرد آلارم هر رجیستر ماسک نشده باید با شمارنده زمان متناظر مطابقت داشته باشد تا یک وقفه در هنگام تطابق تولید شود.وقفه هنگامی تولید می شود که شمارنده اولین تغییر از حالت غیر برابر به برابر را مشاهده کند.برای پاک کردن وقفه باید مقدار یک در بیت متناظر رجیستر محل وقوع وقفه ILR نوشته شود.
توجه :کاربر گرامی شما علاوه بر خرید مستقیم همچنین میتوانید این فایل را با خرید اشتراک ماهانه دانلود نمایید پس مشترک ماهانه ی سایت شوید و تا پایان مدت اشتراک از آپدیت ها و فایلهای جدید موجود در سایت بهره مند گردید.
لیست فایلهای اعضای اشتراکی
نام فایل :
پروژه ساعت و تقویم با RTC داخلی ARM
حداقل اشتراک |
محتویات |
زمان ایجاد |
حجم فایل |
تعداد دانلودها |
تنها کاربران عضو یا دارای مجوز میتوانند دانلود نمایند |
توضیحات :