به نام خدا : تو این مطلب از آموزش آرم، میخوام آموزش راه اندازی RTC رو براتون قرار بدم، البته پروژه هاش رو، قبلا آموزشش رو گزاشتم تو سایت ( آموزش آرم میکروکنترلر lpc1768 جلسه ۱۲ rtc ) >>> آموزش پروژه محور آرم lpc1768 مبحث rtc
آموزش پروژه محور آرم lpc1768 مبحث rtc
کتابخانه rtc میکروکنترلر lpc1768
این کتابخونه ای که تو این مطلب میخوام براتون بزارم رو من از مطلب RTC Programming in LPC1768 برداشتم و مشکلاتی داشت که رفع کردم و توابعی کم داشت که اضافه کردم ( دوستان مشتاق! میتونن دو کتابخونه فوق رو بررسی کنن و فرقشون رو ببینن )؛ این کتابخونه شامل توابع زیر هستش :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void RTC_IRQHandler (void); void RTCInit( void ); void RTCStart( void ); void RTCStop( void ); void RTC_CTCReset( void ); void RTCSetTime( RtcTime ); RtcTime RTCGetTime( void ); void RTCSetIncrementInterrupt( uint8_t IncrementInterrupt ); void RTCSetAlarmInterrupt( RtcTime ); void RTCSetAlarmMask( uint32_t AlarmMask ); void RTCEnableOscillatorFailInterrupt(void); void RTCDisableOscillatorFailInterrupt(void); void RTCBackupData0(uint32_t Data0); void RTCBackupData1(uint32_t Data1); void RTCBackupData2(uint32_t Data2); void RTCBackupData3(uint32_t Data3); void RTCBackupData4(uint32_t Data4); uint32_t RTCRestoreData0(void); uint32_t RTCRestoreData1(void); uint32_t RTCRestoreData2(void); uint32_t RTCRestoreData3(void); uint32_t RTCRestoreData4(void); |
که در زیر توضیح میدم تک تک توابع رو :
۱) تابع وقفه RTC_IRQHandler :
1 |
void RTC_IRQHandler (void); |
خب این تابع وقفه ما هستش، که داخل کتابخونه تعریف شده و اگه وقفه ای رخ بده یکی از سه متغیر AlarmInterrupt یا CounterIncrementInterrupt یا OscillatorFailInterrupt رو مقدارشون رو ۱ میکنه، و با ۱ شدن این متغییر ها ما متوجه میشیم که چه وقفه ای رخ داده.
توجه : برای خوندن مقدار این متغییر ها و اطلاع از وقفه رخ داده باید در اول پروژه هاتون به صورت زیر این متغییر ها رو تعریف کنید :
1 |
extern uint32_t AlarmInterrupt, CounterIncrementInterrupt, OscillatorFailInterrupt; |
۲) تابع راه اندازی RTC با نام RTCInit
1 |
void RTCInit( void ); |
از این تابع برای راه اندازی اولیه RTC استفاده میکنیم که باید در تابع MAIN و در خطوط اول این تابع فراخونی بشه.
۳) توابع صدور فرمان آغاز به کار و توقف RTC با نامهای RTCStart و RTCStop
1 2 |
void RTCStart( void ); void RTCStop( void ); |
بعد از فراخونی تابع RTCInit نوبت میرسه به صودر فرمان آغاز به کار واحد RTC که هر جا که نیاز داشتید میتونید شمارنده های RTC رو متوقف کنید ( RTCStop ) و هر جا نیاز داشتید بگید شمارش رو شروع کنند ( RTCStart )
۴) تابع ریست کردن CTC
1 |
void RTC_CTCReset( void ); |
این تابع رو هم همون طور که در مطلب آموزش RTC گفتم و در فیلم این مطلب هم فک کنم گفتم، تو دیتاشیت چیز خاصی دربارش نگفته، فقط گفته این بیت رو ۱ کنی و بعد ۰ کنی، CTC ریست میشه؛ حالا کاربردش کجا هستش دقیقا نمیدونم؛ فعلا استفاده ازز این تابع اجباری نیست.
۵) توابع تنظیم زمان و خوندن زمان
1 2 |
void RTCSetTime( RtcTime ); RtcTime RTCGetTime( void ); |
برا تنظیم زمان از تابع RTCSetTime و برا خوندن زمان از تابع RTCGetTime استفاده میکنیم.
توجه : برا استفاده از این توابع باید متغییر هایی از نوع ساختار RtcTime ایجاد کنیم و بعد متغیر هاشو رو مقدار دهی کنیم و بعد به تابع RTCSetTime بدیم، برا تابع RTCGetTime هم … ولش حال توضیح نیست، ادامه متنو بخونید راه حل رو گفتم ^_^ آموزش ماهی گیری!!!، اگه در مورد struct چییزی نمیدونید، مطالب زیر رو حتما بخونید :
۶) فعال کردن وقفه افزایش شمارنده
1 |
void RTCSetIncrementInterrupt( uint8_t IncrementInterrupt ); |
به کمک این تابع میتونیم وقفه افزایش شمارنده رو فعال کنیم، و اگه خواستیم غیر فعالش کنیم باید ۰ بهش بدیم؛ مقداری که میتونید به این تابع بدید رو در زیر براتون قرار میدم که میتونیم چند تاشون رو با اور بیتی کنید و بعد بدید به این تابع :
CIIR_IMSEC : شمارنده ثانیه
CIIR_IMMIN : شمارنده دقیقه
CIIR_IMHOUR : شمارنده ساعت
CIIR_IMDOM : شمارنده روز از ماه
CIIR_IMDOW : شمارنده روز از هفته
CIIR_IMDOY : شمارنده روز از سال
CIIR_IMMON : شمارنده ماه
CIIR_IMYEAR : شمارنده سال
حالا میتویند این مقادیر رو به این تابع بدید یا همون طور که گفتم اور کنید چند تاشون رو بعد بدی به این تابع، به کمک این تابع میتونیم تعیین کنیم که مثلا هر ثانیه یا هر دقیقه یه وقفه رخ بده که با یک شدن متغییر CounterIncrementInterrupt ما متوجه رخ دادن این وقفه میشیم ( فیلم آموزش و تست پروژه این مطلب رو ببنید حتما )
۷) فعال کردن و ماسک گزاری آلارم
1 2 |
void RTCSetAlarmInterrupt( RtcTime ); void RTCSetAlarmMask( uint32_t AlarmMask ); |
به کمک تابع RTCSetAlarmInterrupt میتونیم وقفه آلارم رو فعال کنیم کنیم که ورودیش از نوع ساختار RtcTime هستش که قبلا دربارش حرف زدم، نمونه کد و نحوه تعریف و … هم در پروژه ته مطلب میتونید ببینید؛ تابع RTCSetAlarmMask هم برای ماسک گزاری هستش تا اون موارد که مهم نیست براتون، در عمل مقایسه، مورد مقایسه قرار نگیرند، مقادیری که به این تابع میتویند بدید به صورت زیر هستش ( دیگه از اسمشون معلومه که چی هستن، لذا توضیح نمیدم ) :
AMR_SEC
AMR_MIN
AMR_HOUR
AMR_DOM
AMR_DOW
AMR_DOY
AMR_MON
AMR_YEAR
۸) فعال/غیر فعال کردن وقفه عدم شناسایی ( یا هر مشکل دیگه ای ) اسیلاتور ۳۲KHz
1 2 |
void RTCEnableOscillatorFailInterrupt(void); void RTCDisableOscillatorFailInterrupt(void); |
به کمک تابع RTCEnableOscillatorFailInterrupt میتونیم این وقفه رو فعال کنیم، و به کمک تابع RTCDisableOscillatorFailInterrupt هم میتونیم غیر فعال کنیم؛ وقتی متغییر OscillatorFailInterrupt مقدارش ۱ بشه یعنی این وقفه رخ داده.
۹) توابع پیشیبان گرفتن و بازگردانی اطلاعات، مربوط به رجیستر های بکاب
1 2 3 4 5 6 7 8 9 10 |
void RTCBackupData0(uint32_t Data0); void RTCBackupData1(uint32_t Data1); void RTCBackupData2(uint32_t Data2); void RTCBackupData3(uint32_t Data3); void RTCBackupData4(uint32_t Data4); uint32_t RTCRestoreData0(void); uint32_t RTCRestoreData1(void); uint32_t RTCRestoreData2(void); uint32_t RTCRestoreData3(void); uint32_t RTCRestoreData4(void); |
به کمک این توابع میتونید در رجیستر های بکاب اطلاعات ذخیره کنید یا مقدارشون رو بخونید.
خب توضیح توابع در این جا به پایان رسید، میریم سراغ پروژه این مطلب :
پروژه ساعت دیجیتال rtc با lpc1768
عملکرد پروژه : نمایش ساعت در کامپیوتر ( نرم افزار ارتباط سریال )، در زمان تعیین شده آلارم رخ میده، پایه های اسیلاتور ساعت رو به هم وصل کنید یا اسیلاتور رو از مدار جدا کنید، وقفه عدم تشخیص اسلاتور رخ میده.
شماتیک پروژه : باتری بکاب رو وصل کنید، به پایه های GND و VBAT؛ ماژول ارتباط سریال ( USB TO TTL ) رو به پایه های UART3 وصل کنید.
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#include <lpc17xx.h> #include "serial.h" #include "rtc.h" #include <stdio.h> RtcTime Time, Alarm; extern uint32_t AlarmInterrupt, CounterIncrementInterrupt, OscillatorFailInterrupt; int main() { char str[60]; uint16_t year; uint8_t hour, min, sec, date, month; uart3_init( ۱/*TxEnable*/, 0/*RxEnable*/, 9600, 0/*use_Recive_Interrupt*/, 0/*autoBaud_Enable*/, ۰/*use_AutoBaud_Finish_Interrupt*/, _1Character/*NumberCharRxTrigger*/); // Initialize RTC module RTCInit(); // Set local time /*Time.RTC_Year = 1395; Time.RTC_Mon = 12; Time.RTC_Yday = 349; Time.RTC_Mday = 13; Time.RTC_Wday = 6; Time.RTC_Hour = 9; Time.RTC_Min = 55; Time.RTC_Sec = 50; RTCSetTime( Time );*/ // Set Alarm Alarm.RTC_Year = 0; Alarm.RTC_Mon = 0; Alarm.RTC_Yday = 0; Alarm.RTC_Mday = 0; Alarm.RTC_Wday = 0; Alarm.RTC_Hour = 10; Alarm.RTC_Min = 1; Alarm.RTC_Sec = 25; RTCSetAlarmMask( AMR_DOM | AMR_DOW | AMR_DOY | AMR_MON | AMR_YEAR ); RTCSetAlarmInterrupt( Alarm ); RTCSetIncrementInterrupt( CIIR_IMSEC ); RTCEnableOscillatorFailInterrupt(); // Enable Interrupt NVIC_EnableIRQ(RTC_IRQn); // Start RTC RTCStart(); // //LPC_PINCON->PINSEL3 |= (1<<22); //LPC_PINCON->PINSEL3 &= ~(1<<23); //LPC_SC->CLKOUTCFG = 260; // Selects the RTC oscillator as the CLKOUT source. while(1) { if( AlarmInterrupt ) { uart3_println(" Alarm Interrupt Enabled "); AlarmInterrupt = 0; } if( CounterIncrementInterrupt ) { // Get current time when alarm is on Time = RTCGetTime(); // Read Time hour = Time.RTC_Hour; min = Time.RTC_Min; sec = Time.RTC_Sec; // Read Date date = Time.RTC_Mday; month = Time.RTC_Mon; year = Time.RTC_Year; sprintf( str, "Year = %d, Month = %d, Day = %d, Hour = %d, Min = %d, Sec = %d", year, month, date, hour, min, sec ); uart3_println(str); CounterIncrementInterrupt = 0; } if( OscillatorFailInterrupt ) { uart3_println(" Oscillator Fail Interrupt "); OscillatorFailInterrupt = 0; } } } |
فیلم پروژه + آموزش :
مطلب مرتبط : LPC1768 İle Dijital-Analog Saat Tasarımı
امیدوارم این مطلب ناچیز مورد استفاده شما قرار بگیری و مفید باشه براتون؛ بیش از این مزاحم نمیشم، فعلا یا علی.