آموزش میکروکنترلر STM32 قسمت سیزدهم: وقفه های رابط RTC و تبدیل تاریخ

blog
۱۳۹۷-۰۷-۱۲
4 دقیقه

آموزش میکروکنترلر STM32 – قسمت سیزدهم ;

سیسوگ در قسمت دوازدهم از آموزش میکروکنترلر STM32 توابع عمومی رابط RTC  و جزئیات ساختار RTC_TimeTypeDef  و RTC_DateTypeDef را بیان نمود. در این قسمت از آموزش میکروکنترلر STM32 قصد دارد وقفه های رابط RTC و تبدیل تاریخ شمسی و میلادی و تبدیل تاریخ و زمان به عدد را آموزش دهد. با سیسوگ همراه باشید.

وقفه ثانیه

بعد از آموزش رابط RTC وارد آموزش قسمت وقفه های رابط RTC می‌شویم. اولین وقفه که می‌خواهیم در اینجا مورد بررسی قرار دهیم وقفه ثانیه است، یعنی با هر ثانیه اضافه شدن به زمان این وقفه فعال می‌گردد. ما می‌توانیم این وقفه را با فرمان زیر فعال نمائیم.

روتین مورد استفاده برای این وقفه هم تابع HAL_RTCEx_RTCEventCallback می‌باشد که ما می‌توانیم  آن را در main برنامه مورد استفاده قرار دهیم. به عنوان مثال ما در برنامه زیر در وقفه مربوطه زمان و تاریخ را نمایش می‌دهیم.

وقفه آلارم

وقفه مورد استفاده دیگر وقفه آلارم می‌باشد که ما می‌توانیم بوسیله آن در یک زمان مشخص به روتین وقفه مورد نظر برویم. برای فعال کردن این وقفه ابتدا باید مثل برنامه زیر یک ساختار از نوع RTC_AlarmTypeDef  تعریف کنیم و سپس زمان مورد نظرمان را در آن قرار دهیم و سپس از طریق فرمان HAL_RTC_SetAlarm_IT  آن را به آلارم واحد RTC اعمال کنیم و همزمان وقفه آلارم را نیز فعال نمائیم.

روتین مورد استفاده برای این وقفه هم تابع HAL_RTC_AlarmAEventCallback می‌باشد که ما می‌توانیم آن را در main برنامه مورد استفاده قرار دهیم. به عنوان مثال ما در برنامه زیر در وقفه مربوطه رویداد آلارم را گزارش می‌دهیم.

تبدیل تاریخ شمسی و میلادی

خوب بعد از فراگیری این قسمت‌ها می‌خواهیم ببینیم که چطور می‌توانیم تاریخ را از میلادی به شمسی و از شمسی به میلادی تبدیل کنیم. برای این امر از توابع مربوطه استفاده می‌کنیم. ابتدا تابع تبدیل تاریخ میلادی به شمسی را معرفی می‌کنیم.

و تابع زیر هم برای تبدیل تاریخ شمسی به میلادی کاربرد دارد.

تبدیل تاریخ و زمان به عدد

حال می‌خواهیم توابع تبدیل 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 را بررسی کنیم.

 

از طریق تابع بالا میتوانیم یک تاریخ و زمان را که از طریق دو آرگومان تابع وارد می‌شود را به یک عدد Unix Time Stamp تبدیل کنیم.

از طریق تابع بالا میتوانیم فرمت Unix Time Stamp را به فرمت DateTime تبدیل کنیم.

در قسمت چهاردهم مجموعه آموزش میکروکنترلر STM32 سیسوگ قصد دارد رجیستر های پشتیبان و کاربردی RTC را آموزش دهد. با سیسوگ همراه باشید.

 

اطلاعات
31
0
لینک و اشتراک
profile

Sisoog Os

متخصص الکترونیک

کارآفرین, تولید کننده, طراح الکترونیک و ....

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند.
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد.
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند.
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند.
family

دیدگاه ها

profile
محمد گفت :
۱۴۰۲-۰۳-۱۲ ۰۱:۰۶

سلام در تبدیل تاریخ میلادی به شمسی سال میلادی را به شمسی درست تبدیل نمیکنه.ممنون میشم بررسی بفرمایید

profile
محمد عزیز گفت :
۱۴۰۱-۰۱-۳۰ ۱۱:۱۵

سلام بر سیسوگ و دانشمندانش
مسئلتن !
مشکل عقب افتادن ساعت در پروژه هایی که قراره همزمان چک بشه و فعالیتی در تایم مشخصی انجام بشه رو از قدیم توسط avr کارها میشنیدم که چند میکروثانیه عقب افتادگی پیدا میکنه و به مرور این خطا بیشتر و بیشتر میشه و آنها برای اصلاح این مشکل استفاده از آیسی ساعت استفاده میکنند.
از اساتیدی شنیدم که در arm هم این مورد هست و بهتره برای این نوع پروژه ها از آی سی ساعت استفاده شه چون هزینش از تجهیز بخش rtc کمتره. نظر شما چیه؟

profile
Zeus ‌ گفت :
۱۴۰۱-۰۱-۳۱ ۰۹:۳۹

سلام و درود بر شما
خوب این مساله توی تمام شمارنده های RTC صادق هست، ولی خوب راهکار داره، البته یه سری آیسی RTC هست که کریستال و نوسان سازش داخلی هست ، اینا توی شرکت کالیبره میشن
برای آیسی های ST هم همین مساله صادقه، البته شرکت ST برای کالیبره کردن RTC داکیومنت خوبی داره و البته توی سری آموزش های LL قراره بهش بپردازیم، ولی جواب کوتاه به سوال شما این میشه که بله این مشکل هست و البته راه حلشم هست 🙂

profile
محمد عزیز گفت :
۱۴۰۱-۰۱-۳۱ ۱۳:۲۶

سلام زئوسه بت شکن
از المپ چه خبر حال و هوا خوبه؟
بله منظورم قیاس استفاده بین آیسی ساعت های آماده که از 5 تومن الان در بازار یافت میشه تا 50 تومن حدودا و RTC کالیبره شده خود میکرو با در نظر گرفتن همون ملاحضات که فرمودید بود.
از نظر قیمتی و اقتصادی منظورمه و حجم وقت و دردسر و دقت عملش آیا توصیه شما باز کالیبره کردن RTC میکروست؟
اگر لینک مفیدی از ST در این مورد دارید ممنون میشم به اشتراک بگذارید.

profile
Zeus ‌ گفت :
۱۴۰۱-۰۱-۳۱ ۱۴:۲۶

سلام و درود بر شما دوست عزیز
بت شکن کجا بوده :/، والا خیلی خیلی شلوغه و اصلا خودمم هم نمی فهمم دارم چکار میکنم
ببینید ما حدود ۷ سال پیش ساعت درست می‌کردیم، خوب مهم ترین چیز توی ساعت اینه که تایم رو گم نکنه و عقب و جلو نشه، ما از RTC خود STM32 استفاده کردیم البته برای هر برد نیاز به کالیبره کردن داشت که یه فرکانس متر دقیق خیلی دقیق خریدیم و هر کدوم رو کالیبره میکردم بدون مشکل به کار خودش ادامه میداد و دقتش اگر بیشتر از آیسی های RTC نبود کمتر هم نبود
و ما تعداد زیادی ازش تولید کردیم و فروختیم، البته باید حواستان به جنس های غیر اورجینال هم باشد

profile
محمد عزیز گفت :
۱۴۰۱-۰۲-۰۱ ۱۶:۱۰

سلام
حاج زئوس نفهمه چکار میکنه پس منه god of war تقلبی چی بگم ! 🙂
عاقا این توابع LL رو میشه مثل قیمه ها ریخت تو ماستای توابع hal ؟
یعنی میشه در کنار هم در پروژه استفاده کرد؟ :l
نکاتی که میفرمایید مطرح شده در آموزش LL قابل استفاده در دنیای HAL که من فعلا درگیرشم هست؟
راستی شما از بین CMSIS , LL و HAL بیشتر کدومو ترجیح میدی؟ من هیچی از اون دوتای دیگه بجز HAL نمیدونم چون ورود من به دنیای STM32F1 با HAL بوده و فعلا هست تا زمانی که توش به تسلط برسم. آیا لازمه اصلا یادگیری اونا ؟
سپاس

profile
Zeus ‌ گفت :
۱۴۰۱-۰۲-۰۵ ۱۱:۱۶

سلام
خوب باید بگم بله امکانش هست که هر دو سری کتابخانه رو توی یک پروژه استفاده کنید و بخش هایی رو با توابع LL پیش ببرید و بخش دیگری را با کتابخانه HAL
خود stmcube این امکان رو داره که موقع ساختن پروژه تعریف کنید کدام بخش ها با کدام کتابخانه هندل بشه
من خودم که از spl منسوخ شده استفاده می‌کنم ! اما نزدیکتر به ll هست ساختارش، این که کدام کتابخانه رو استفاده کنید بیشتر برمیگرده به این که دقیقا بخواید چکار کنید مثلا اگر قابلیت حمل کد براتون مهم باشه مثلا امروز با st راه انداختید فردا بخواید ببرید روی nxp استفاده از cmsis مزایای زیادی داره

profile
زهره گفت :
۱۴۰۰-۱۲-۱۳ ۱۸:۰۸

سلام مجدد
لینک سورس تابع برای تبدیل rtc tp epoch
لطفا داخل مقاله قرار بدین برای استفاده ی دیگران.

profile
Zeus ‌ گفت :
۱۴۰۱-۰۱-۲۸ ۱۱:۴۳

سلام دوست عزیز
ممنونم برای تذکرتون – سورس توابع مذکور رو می‌تونید در لینک زیر پیدا کنید.
https://github.com/LonelyWolf/stm32/blob/master/stm32l-dosfs/RTC.c

profile
زهره گفت :
۱۴۰۰-۱۲-۱۲ ۱۹:۴۳

سلام وقت بخیر
می بخشید من تابع RTC_TOepoch رو داخل کتابخونهhal پیدا نمی کنم. میشه راهنمایی کنید ؟

profile
Zeus ‌ گفت :
۱۴۰۱-۰۱-۲۸ ۱۱:۴۸

سلام دوست عزیز
تابع مریوطه توی مطلب قرار دادم

profile
محمد عزیزپور گفت :
۱۴۰۰-۰۳-۰۲ ۱۰:۴۱

سلام ، تشکر از مطلب خوبتون
مشکل قبول نکردن تابع تبدیل میلادی به شمسی در C99 رو چطور میتونم در نرم افزار keil 5.15 حل کنم ارور invalid in C99 میده ، سپاس

profile
zeus گفت :
۱۴۰۰-۰۳-۰۴ ۲۲:۲۸

سلام دوست عزیز
توی تنظیمات پروژه توی کیل یه تیک هست که به کامپایلر کیل امکان c99 رو اضافه میکنه
اونطور که یادم میآد توی تب c/c++ بود

profile
محمد عزیزپور گفت :
۱۴۰۰-۰۳-۲۳ ۱۹:۲۵

سلام بر خدای خدایان زئوس(استغفرالله) 🙂

آقا تشکر اما تا زمانی که بدنه ی تابع رو که زحمت کشیدید پایین تر برا آقا سعید لینک گذاشتید استفاده نکرده بودم جواب نداد.

دو اشکال وجود داره یکی جزئی و یکی کلی !

اشکال جزئی در خط 56 لینکی که گذاشتید در خط دوم تایع تبدیل شمسی به میلادیه که نوشتید yss باید بشه ys

اما اشکال کلی و غیر قابل اغماض اینه که با ورود تابع به سال کبیسه شمسی مثلا 1404 یا 1408روزها در خروجی یکی می افتند جلو و بعبارتی یک روز جلوتر رو تقویم نمایش میده.

میشه راهنمایی بفرمایید چه میشود کرد که همه چی بهم نریزه؟:)

profile
محمد گفت :
۱۴۰۰-۰۳-۰۱ ۲۰:۴۰

سلام و خدا قوت و سپاس بابت وقتی که گذاشتید
آقا من تایع miltoshmcv و shtomilmcv رو که مینویسم این خطا رو میده:

implicit declaration function is invalide in C99

چطور میتونم تو نرم افزار keil V5.15 این ارور رو رفع کنم ؟
تشکر

profile
zeus گفت :
۱۴۰۰-۰۳-۰۴ ۲۲:۳۱

سلام دوست عزیز
ساده است مطابق عکس زیر عمل کنید

profile
محمد عزیزپور گفت :
۱۴۰۰-۰۳-۰۷ ۱۲:۴۹

خیلی ممنون از زحمتی که کشیدید

profile
صالح آبادی گفت :
۱۳۹۹-۱۰-۲۲ ۱۹:۳۲

سلام
طریقه استفاده از تابع تبدیل میلادی به شمسی چطور هست .

من اینطوری نوشتم ولی خطا میده . بدنه تابع رو هم به برنامه اضافه کردم .

unsigned char sal=”21″;
unsigned char mah=”1″;
unsigned char roz=”11″;
unsigned char datee;
datee=miltoshmcv( sal, mah, roz);

profile
َAmir گفت :
۱۳۹۹-۰۸-۳۰ ۱۹:۰۷

سلام
این آموزش خیلی خوب بود . ممنونم

profile
Sisoog Os گفت :
۱۳۹۹-۰۹-۰۱ ۱۲:۱۵

خواهش میکنم دوست عزیز

profile
رضا گفت :
۱۳۹۹-۰۶-۳۱ ۱۸:۲۷

سلام اگه میشه بدنه این تابع رو هم بزارین چک کردم نبود. ممنون
RTC_ToEpoch

profile
سعید گفت :
۱۳۹۸-۰۷-۱۷ ۱۴:۴۸

سلام خسته نباشید
تو این قسمت فقط اسم و ورودی توابع رو گذاشتین؟ بدنه ندارن ؟ یا من نمیتونم پیدا کنم ؟
با تشکر

profile
زئوس Zeus گفت :
۱۳۹۸-۰۷-۲۱ ۰۹:۰۰

احتمالا باید داخل کتابخونه HAL باشه !

profile
سعید گفت :
۱۳۹۸-۰۷-۲۴ ۱۱:۴۴

توابع اولیه که گفتین آره ماله هال هستن و داخل هدر فایلها میشه پیدا کرد.اما منظورم توابع تبدیل شمسی به میلادی و تبدیل تاریخ و زمان به عدد بودش..چون داخل توابع هال رو سرچ زدم نبودن

profile
زئوس Zeus گفت :
۱۳۹۸-۰۷-۲۶ ۱۸:۲۳

سلام بله درسته
بدنه رو تو لینک زیر قرار دادم
https://gist.github.com/Sisoog/592013ee188b4bd6abdb9fbba2c34578

profile
محمد عزیز گفت :
۱۴۰۱-۰۱-۲۹ ۱۳:۴۴

سلام زئوس جان، این تابع تا قبل از 1400 رو درست کار میکنه، کلا اکثر دیوایس های تقویم فارسی داری که من اطرافم میشناختم با ورود به قرن جدید به مشکل افتادن و رفتن کارخونه برای دریافت برنامه جدید !
احتمالا از همین برنامه استفاده میکردند 🙂
با ورود به 1400 یک روز عقب یا جلو می افتاد مخصوصا درسالهای کبیسه تا جایی که یادمه من با مکافات چون دقیق نفهمیدم توش داره اتفاقی میفته از بیرون اعداد دریافتی رو اصلاح کردم و با تقویم موبایل “باد صبا” تطبیق دادم اما از سورس کد صحیحش استقبال میکنم 🙂

profile
Zeus ‌ گفت :
۱۴۰۱-۰۱-۳۰ ۰۹:۲۶

سلام و درود بر شما ، اتفاقا این اتفاق برای دستگاه های ما هم افتاد، سالها پیش ما ساعت تولید میکردیم و این تکه کد از همون ساعته که من قرار داده بودم
اما واقعا چون مربوط به خیلی سال پیش بود به دنبال اصلاحش نرفتم ، اگر شما اصلاح کردید خوشحال میشم که کدتون رو با ما به اشتراک بذارید یا حتی خودتون در موردش مقاله ای بنویسید
میدونم نیاز تعداد زیادی از دوستان هست این مساله 🙂

profile
حجت گفت :
۱۳۹۹-۰۵-۲۱ ۱۲:۲۳

این رو تست کردید درسته برا من که درست کار نمی کنه باید ورودی تابع bcd باشه

profile
p گفت :
۱۳۹۸-۰۶-۲۵ ۱۳:۵۲

سلام
خسته نباشید
من میخواهم در تابع وقفه ی آلارم, تنظیمات جدیدی برای آلارم ایجاد کنم. به همان صورت که در تابع main این تنظیمات رو ایجاد میکنیم, انجام میدهم ولی با ارور زیر مواجه میشم:
Error[Pe167]: argument of type “struct **” is incompatible with parameter of type “struct *”

این هم کد داخل تابع وقفه:
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){
RTC_AlarmTypeDef atime;
aflag=0;
atime.AlarmTime.Hours = 0;
atime.AlarmTime.Minutes = 15;
atime.AlarmTime.Seconds = 0;
HAL_RTC_SetAlarm_IT(&hrtc, &atime, RTC_FORMAT_BIN); //برای این خط ارور میزند.
}

ممنون میشم راهنمایی کنید.

profile
زئوس Zeus گفت :
۱۳۹۸-۰۶-۲۶ ۰۹:۲۹

سلام دوست گرامی
خطایی که دارید دریافت میکنید – درواقع به این معنی است که پارامتر پاس داده شده به تابع که ظاهرا یه structure هست ِ هم خوانی نداره با اون چیزی که باید باشه
در واقع یعنی نوع اشتباهی رو دارید توی ورودی تابع پاس میدید.

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله