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

آموزش STM32 با توابع LL قسمت بیست و ششم: استفاده از RTC

در قسمت قبلی با راه‌اندازی ارتباط I2C آشنا شدیم و در آموزش‌های قبلی، در چند بخش از تایمرها استفاده کردیم. Real Time Clock یا همان RTC عنصری است که از آن برای اندازه‌گیری دقیق زمان واقعی استفاده می‌شود. ممکن است این سؤال پیش بیاید که این عمل بدون استفاده از RTC نیز امکان‌پذیر است. چه نیازی به استفاده از این واحد داریم؟ که در جواب باید گفت استفاده از RTC مزایایی دارد که ازجمله آن‌ها می‌توان به موارد زیر اشاره کرد:

  • مصرف توان پایین (در کاربردهایی که از باتری یا منابع محدود برای توان استفاده می‌شود اهمیت دارد).
  • باعث خالی بودن سیستم جهت انجام عملیات مهم با وابستگی زمانی دقیق می‌شود.
  • بعضی‌اوقات از روش‌های دیگر دقیق‌تر است.

در این بخش می‌خواهیم واحد RTC داخلی میکرو را راه‌اندازی کنیم و علاوه بر اندازه‌گیری تاریخ و ساعت، یک هشدار یا Alarm تنظیم کنیم. با سیسوگ همراه باشید.

 

ایجاد پروژه

مثل قبل بخش‌های دیباگ و USART را تنظیم می‌کنیم. در این پروژه برای بخش کلاک هر دو بخش HSE و LSE را فعال می‌کنیم. زیرا می‌خواهیم برای کلاک RTC از کریستال فرکانس پایین استفاده کنیم. توجه کنید که اگر روی بورد BluePill شما این کریستال تعبیه نشده است از هدر بورد چیپ STM32F103RET6 استفاده کنید.

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

 

حالا باید به سراغ واحد RTC برویم. مانند شکل‌های زیر تنظیم این بخش را انجام می‌دهیم و وقفه را برای آن فعال می‌کنیم.

 

بقیه‌ی مراحل را مانند قبل انجام می‌دهیم و وارد بخش برنامه‌نویسی می‌شویم.

نوشتن کد برنامه

مثل پروژه قبل، در ابتدا کتابخانه stdio را به برنامه اضافه کرده و توابع ریدایرکت به USART را می‌نویسیم و تنظیمات مربوط به آن را انجام می‌دهیم. سپس ساختارها و متغیر‌های مورد نیاز برای تاریخ و ساعت را تعریف می‌کنیم؛

اکنون باید توابع موردنیازمان برای تنظیم و همچنین به‌روزرسانی تاریخ و ساعت، و نیز تنظیم هشدار را تعریف کنیم. این توابع را به‌صورت زیر می‌نویسیم:

 

حالا باید درون int main و قبل از حلقه while(1) تنظیم واحد RTC را انجام دهیم؛

تنها کاری که برای آماده‌سازی واحد RTC باقی‌مانده است، تنظیم Prescaler برای شمارش ثانیه است. همان‌طور که گفتیم برای این واحد از LSE به‌عنوان منبع کلاک استفاده کرده‌ایم. بنابراین فرکانس کلاک RTC برابر با 32.768KHz است. برای اینکه شمارش ثانیه به‌درستی انجام شود، باید مقدار Prescaler را برابر با معادل هگز 32768 یعنی 00008000 قرار دهیم؛

اکنون می‌توانیم زمان را اندازه‌گیری کنیم. کافی است در حلقه while(1) از توابع به‌روزرسانی زمان که نوشتیم استفاده کنیم. برای اطمینان از درستی عملکرد، زمان و تاریخ را به پورت سریال می‌فرستیم؛

در کدهای قبلی زمان هشدار را تنظیم کرده‌ایم. برای روشن کردن یک LED در زمان وقوع وقفه، در فایل stm32f1xx_it.c و در بدنه تابع مربوط به وقفه RTC کد زیر را می‌نویسیم:

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

   لینک این پروژه در گیت‌هاب

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

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

بازگشت به لیست

نوشته های مشابه

2 دیدگاه در “آموزش STM32 با توابع LL قسمت بیست و ششم: استفاده از RTC

  1. امیرحسین شریف زاده گفت:

    ممنون از مهندس ایرانپاک بخاطر مطلبشون در مورد RTC
    یک انتقاد و یک سوال داشتم از ایشون.
    انتقادم در مورد اینکه تابع DATE_Update به هیچ عنوان بهینه نیست و ممکنه در صورت بروز ثانیه ای خطا عمل نکنه، توصیه من استفاده از اختلاف ساعت حال و قبل هست برای تشخیص و آپدیت تاریخ.
    سوالم در این مورد هست که اگه بین کد هامون بخوایم دوباره آلارم رو تنظیم کنیم چیکار باید بکنیم؟ به طور مثال من میخوام بعد از اولین آلارم اون رو برای 5 دقیقه بعد نیز دوباره تنظیم کنم و منتظر وقفه اون باشم. این کار با استفاده از تابعی که نوشتید عمل نکرد. من فکر کردم مربوط به تابع LL_RTC_EnableWriteProtection(RTC); هست ولی حتی با غیرفعال کردن این مورد نیز عمل نکرد.

    1. سیاوش گفت:

      سلام دوست عزیز، خوشحالم که این مطلب مورد استفاده شما قرار گرفته.
      در مورد اول باید بگم که متوجه حالت رخ داد خطایی که فرمودین نمیشم، اگه ممکنه شرح بدین که توی چه حالتی ممکنه این خطای ثانیه رخ بده.
      در مورد دوم، آیا بعد از ست کردن دوباره آلارم وقفه رو فعال میکنین؟
      کدتون رو به چه صورت نوشتین؟

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

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