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

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

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

آموزش میکروکنترلر 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 را آموزش دهد. با سیسوگ همراه باشید.

 

1 نفر

پــــســنــدیـده انـد

توجه

مهدی عبدالهی
مهدی عبدالهی

کانال میکروالکترونیک @microstm32

دیدگاه ها

28 دیدگاه

  • محمد عزیز
    محمد عزیز
    ۳۰ فروردین ۱۴۰۱

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

    • Zeus ‌
      Zeus ‌
      ۳۱ فروردین ۱۴۰۱

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

      • محمد عزیز
        محمد عزیز
        ۳۱ فروردین ۱۴۰۱

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

        • Zeus ‌
          Zeus ‌
          ۳۱ فروردین ۱۴۰۱

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

          • محمد عزیز
            محمد عزیز
            ۱ اردیبهشت ۱۴۰۱

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

            0
          • Zeus ‌
            Zeus ‌
            ۵ اردیبهشت ۱۴۰۱

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

            0
  • زهره
    ۱۳ اسفند ۱۴۰۰

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

  • زهره
    ۱۲ اسفند ۱۴۰۰

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

    • Zeus ‌
      Zeus ‌
      ۲۸ فروردین ۱۴۰۱

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

  • محمد عزیز
    محمد عزیزپور
    ۲ خرداد ۱۴۰۰

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

    • Zeus ‌
      zeus
      ۴ خرداد ۱۴۰۰

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

  • محمد
    ۱ خرداد ۱۴۰۰

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

    implicit declaration function is invalide in C99

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

    • Zeus ‌
      zeus
      ۴ خرداد ۱۴۰۰

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

      • محمد عزیز
        محمد عزیزپور
        ۷ خرداد ۱۴۰۰

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

  • َAmir
    ۳۰ آبان ۱۳۹۹

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

    • Sisoog Os
      Sisoog Os
      ۱ آذر ۱۳۹۹

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

  • رضا
    ۳۱ شهریور ۱۳۹۹

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

  • سعید
    ۱۷ مهر ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۲۱ مهر ۱۳۹۸

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

      • سعید
        ۲۴ مهر ۱۳۹۸

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

        • Zeus ‌
          زئوس Zeus
          ۲۶ مهر ۱۳۹۸

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

          • حجت
            ۲۱ مرداد ۱۳۹۹

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

            0
          • Zeus ‌
            زئوس Zeus
            ۳۰ مرداد ۱۳۹۹

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

            0
          • محمد عزیز
            محمد عزیز
            ۲۹ فروردین ۱۴۰۱

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

            0
          • Zeus ‌
            Zeus ‌
            ۳۰ فروردین ۱۴۰۱

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

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

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

    • Zeus ‌
      زئوس Zeus
      ۲۶ شهریور ۱۳۹۸

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

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 3 سال پیش
راه اندازی LCD گرافیکی Nokia 1661

راه اندازی LCD گرافیکی Nokia 1661

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش
ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش
همه چیز درباره ریموت کنترل‌های هاپینگ

همه چیز درباره ریموت کنترل‌های هاپینگ

امنیت همیشه و در همه‌ی اعصار، مقوله‌ی مهم و قابل‌توجه‌ ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموت‌های کنترل خواهیم پرداخت....

Zeus ‌ Zeus ‌
  • 5 سال پیش
مسابقه سوم: استخراج داده از رشته ها در زبان C

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش
مسابقه ششم: بزن میکروکنترلر را بسوزون!

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 12 ماه پیش
آموزش قدم به قدم راه اندازی NRF24L01

آموزش قدم به قدم راه اندازی NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش
ساخت ماینر با FPGA و ARM

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش
کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 3 سال پیش
مسابقه چهارم: کدام حلقه سریع‌تر است؟

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 2 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک