آموزش میکروکنترلر STM32 – قسمت سیزدهم ;
سیسوگ در قسمت دوازدهم از آموزش میکروکنترلر STM32 توابع عمومی رابط RTC و جزئیات ساختار RTC_TimeTypeDef و RTC_DateTypeDef را بیان نمود. در این قسمت از آموزش میکروکنترلر STM32 قصد دارد وقفه های رابط RTC و تبدیل تاریخ شمسی و میلادی و تبدیل تاریخ و زمان به عدد را آموزش دهد. با سیسوگ همراه باشید.
وقفه ثانیه
بعد از آموزش رابط RTC وارد آموزش قسمت وقفه های رابط RTC میشویم. اولین وقفه که میخواهیم در اینجا مورد بررسی قرار دهیم وقفه ثانیه است، یعنی با هر ثانیه اضافه شدن به زمان این وقفه فعال میگردد. ما میتوانیم این وقفه را با فرمان زیر فعال نمائیم.
1 | __HAL_RTC_ALARM_ENABLE_IT(&hrtc,RTC_IT_SEC); |
روتین مورد استفاده برای این وقفه هم تابع HAL_RTCEx_RTCEventCallback میباشد که ما میتوانیم آن را در main برنامه مورد استفاده قرار دهیم. به عنوان مثال ما در برنامه زیر در وقفه مربوطه زمان و تاریخ را نمایش میدهیم.
1 2 3 4 5 6 | 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 اعمال کنیم و همزمان وقفه آلارم را نیز فعال نمائیم.
1 2 3 4 5 | 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 برنامه مورد استفاده قرار دهیم. به عنوان مثال ما در برنامه زیر در وقفه مربوطه رویداد آلارم را گزارش میدهیم.
1 2 3 4 | void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { printf("Active Alarm !!! \r\n"); } |
تبدیل تاریخ شمسی و میلادی
خوب بعد از فراگیری این قسمتها میخواهیم ببینیم که چطور میتوانیم تاریخ را از میلادی به شمسی و از شمسی به میلادی تبدیل کنیم. برای این امر از توابع مربوطه استفاده میکنیم. ابتدا تابع تبدیل تاریخ میلادی به شمسی را معرفی میکنیم.
1 | miltoshmcv(unsigned char ym,unsigned char mm,unsigned char dm); |
و تابع زیر هم برای تبدیل تاریخ شمسی به میلادی کاربرد دارد.
1 | 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 را بررسی کنیم.
1 | uint32_t RTC_ToEpoch(RTC_TimeTypeDef *time, RTC_DateTypeDef *date) |
از طریق تابع بالا میتوانیم یک تاریخ و زمان را که از طریق دو آرگومان تابع وارد میشود را به یک عدد Unix Time Stamp تبدیل کنیم.
1 | RTC_FromEpoch(uint32_t epoch, RTC_TimeTypeDef *time, RTC_DateTypeDef *date) |
از طریق تابع بالا میتوانیم فرمت Unix Time Stamp را به فرمت DateTime تبدیل کنیم.
در قسمت چهاردهم مجموعه آموزش میکروکنترلر STM32 سیسوگ قصد دارد رجیستر های پشتیبان و کاربردی RTC را آموزش دهد. با سیسوگ همراه باشید.
انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.
شما نیز میتوانید یکی از نویسندگان سیسوگ باشید. همکاری با سیسوگ