آموزش میکروکنترلر STM32
در قسمت دوازدهم از آموزش میکروکنترلر STM32 توابع عمومی رابط RTC و جزئیات ساختار RTC_TimeTypeDef و RTC_DateTypeDef را بیاننمودیم. در این قسمت از آموزش میکروکنترلر STM32 قصد داریم وقفههای رابط RTC و تبدیل تاریخ شمسی و میلادی و تبدیل تاریخ و زمان به عدد را آموزش دهیم. با ما همراه باشید.
وقفه ثانیه
بعداز آموزش رابط RTC وارد آموزش قسمت وقفههای رابط RTC میشویم. اولین وقفه که میخواهیم دراینجا موردبررسی قراردهیم وقفه ثانیه است، یعنی با هرثانیه اضافهشدن به زمان این وقفه فعال میگردد. ما میتوانیم این وقفه را با فرمانزیر فعال نمائیم.
__HAL_RTC_ALARM_ENABLE_IT(&hrtc,RTC_IT_SEC);
روتین مورداستفاده برای این وقفه هم تابع HAL_RTCEx_RTCEventCallback میباشد که ما میتوانیم آنرا در main برنامه مورداستفاده قراردهیم. بهعنوانمثال؛ ما در برنامهی زیر در وقفهی مربوطه زمان و تاریخ را نمایش میدهیم.
void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc) { HAL_RTC_GetTime(hrtc, &time, RTC_FORMAT_BIN); HAL_RTC_GetDate(hrtc, &date, RTC_FORMAT_BIN); printf("TIME=%02d:%02d:%02d DATE=%02d/%02d/%02d\r\n", time.Hours, time.Minutes, time.Seconds, date.Year, date.Month, date.Date); }
وقفه آلارم
وقفه مورداستفادهی دیگر وقفه آلارم میباشد که ما میتوانیم بوسیله آن در یک زمان مشخص به روتین وقفه موردنظر برویم. برای فعالکردن این وقفه ابتدا باید مثل برنامهی زیر یک ساختار ازنوع RTC_AlarmTypeDef تعریفکنیم و سپس زمان موردنظرمان را در آن قرار دهیم و سپس ازطریق فرمان HAL_RTC_SetAlarm_IT آنرا به آلارم واحد RTC اعمالکنیم و همزمان وقفه آلارم را نیز فعال نمائیم.
RTC_AlarmTypeDef atime; atime.AlarmTime.Hours = 1; atime.AlarmTime.Minutes = 0; atime.AlarmTime.Seconds = 10; HAL_RTC_SetAlarm_IT(&hrtc, &atime, RTC_FORMAT_BIN);
روتین مورداستفاده برای این وقفه هم تابع HAL_RTC_AlarmAEventCallback میباشد که ما میتوانیم آنرا در main برنامه مورداستفاده قراردهیم. بهعنوانمثال ما در برنامهی زیر در وقفهی مربوطه رویداد آلارم را گزارش میدهیم.
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { printf("Active Alarm !!! \r\n"); }
تبدیل تاریخ شمسی و میلادی
خوب بعداز فراگیری این قسمتها میخواهیم ببینیم که چطور میتوانیم تاریخ را از میلادی به شمسی و از شمسی به میلادی تبدیلکنیم. برای این امر از توابع مربوطه استفاده میکنیم. ابتدا تابع تبدیل تاریخ میلادی به شمسی را معرفی میکنیم.
miltoshmcv(unsigned char ym,unsigned char mm,unsigned char dm);
و تابع زیر هم برای تبدیل تاریخ شمسی به میلادی کاربرد دارد.
shmtomilcv(unsigned char ys ,unsigned char ms,unsigned char ds);
تبدیل تاریخ و زمان به عدد
حال میخواهیم توابع تبدیل Unix Time Stamp به DateTime را بررسیکنیم، این توابع برای تبدیل یک تاریخ و زمان به عدد Unix Time Stamp یا بالعکس مورداستفاده قرار میگیرند. unix timestamp یا بهاختصار timestamp یک پروتکل(قراردادی) است که تعداد ثانیهها از تاریخ ۱ ژانویه ۱۹۷۰ ساعت ۱۲ بامداد (به وقت GMT) تا هرلحظه را نشان میدهد. یکیاز بهترین راهها برای ذخیره تاریخ و زمان، ذخیرهنمودن timestamp میباشد. چراکه بهراحتی میتوانیم عملیات ریاضی را روی آن انجامدهیم، بهسادگی آن را به تقویمهای دیگر تبدیلکنیم و یا حتی آنرا به time zoneهای دیگر تبدیل کرد و با همین یک عدد میتوان به روز و ماه و سال و ساعت و دقیقه و ثانیه و فصل و روز هفته و شماره هفته از سال و… پی برد. یکیاز کاربردهای این روش زمانی است که میخواهید بهعنوانمثال فاصله بین دو زمان مشخص را متوجهشوید، راهحل این است که تاریخ و زمان ابتدا و انتها را به Unix Time Stamp تبدیلکنید و سپس عدد ابتدا را از عدد انتها کمکنید و عدد بدستآمده فاصله این دو برمبنای ثانیه است. کاربرد دیگر Unix Time Stamp ، روش ساده ذخیرهسازی آن است یعنی اینکه زمانیکه شما بخواهید یک عدد را ذخیرهکنید خیلی سادهتر از این است که بخواهید تکتک متدهای ثانیه و دقیقه و ساعت و روز و ماه و سال را ذخیرهکنید. یک کاربرد دیگر Unix Time Stamp هم ایناست که در بعضی مقولهها مثل خروجی پیامهای تلگرام زمان و تاریخی که برای شما بههمراه پیام ارسال میگردد با فرمت Unix Time Stamp میباشد که شما میتوانید ازطریق توابع تبدیل که داخل مثال همراه برنامه آمده آنرا بهحالت DateTime تبدیلکنید.حال بهتر است توابع مربوطبه Unix Time Stamp را بررسیکنیم.
uint32_t RTC_ToEpoch(RTC_TimeTypeDef *time, RTC_DateTypeDef *date)
ازطریق تابع بالا میتوانیم یک تاریخ و زمان را که ازطریق دو آرگومان تابع وارد میشود را به یک عدد Unix Time Stamp تبدیلکنیم.
RTC_FromEpoch(uint32_t epoch, RTC_TimeTypeDef *time, RTC_DateTypeDef *date)
ازطریق تابع بالا میتوانیم فرمت Unix Time Stamp را به فرمت DateTime تبدیلکنیم.
در قسمت چهاردهم مجموعه آموزش میکروکنترلر STM32 قصد داریم رجیسترهای پشتیبان و کاربردی RTC را آموزش دهیم. با ما همراه باشید.
منبع: سیسوگ