ARM, STM32, آموزش, توصیه شده, دوره آموزشی STM32, مقاله های سیسوگ

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

STM32 _ RTC Exti

آموزش میکروکنترلر 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 دیدگاه در “آموزش میکروکنترلر STM32 قسمت سیزدهم: وقفه های رابط RTC و تبدیل تاریخ

  1. Avatar for محمد محمد گفت:

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

  2. Avatar for محمد عزیز محمد عزیز گفت:

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

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

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

      1. Avatar for محمد عزیز محمد عزیز گفت:

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

        1. Avatar for Zeus ‌ Zeus ‌ گفت:

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

          1. Avatar for محمد عزیز محمد عزیز گفت:

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

          2. Avatar for Zeus ‌ Zeus ‌ گفت:

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

  3. Avatar for زهره زهره گفت:

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

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

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

  4. Avatar for زهره زهره گفت:

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

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

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

  5. Avatar for محمد عزیزپور محمد عزیزپور گفت:

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

    1. Avatar for zeus zeus گفت:

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

      1. Avatar for محمد عزیزپور محمد عزیزپور گفت:

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

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

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

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

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

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

  6. Avatar for محمد محمد گفت:

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

    implicit declaration function is invalide in C99

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

    1. Avatar for zeus zeus گفت:

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

      1. Avatar for محمد عزیزپور محمد عزیزپور گفت:

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

  7. Avatar for صالح آبادی صالح آبادی گفت:

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

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

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

  8. Avatar for َAmir َAmir گفت:

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

    1. Avatar for Sisoog Os Sisoog Os گفت:

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

  9. Avatar for رضا رضا گفت:

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

  10. Avatar for سعید سعید گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

      1. Avatar for سعید سعید گفت:

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

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

          1. Avatar for حجت حجت گفت:

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

          2. Avatar for زئوس Zeus زئوس Zeus گفت:

            بله من با این تابع کار کردم فکر نمیکنم مشکل داشته باشه – خیر داده ها نباید bcd باشند

          3. Avatar for محمد عزیز محمد عزیز گفت:

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

          4. Avatar for Zeus ‌ Zeus ‌ گفت:

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

  11. Avatar for p 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); //برای این خط ارور میزند.
    }

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *