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

آموزش میکروکنترلر STM32 قسمت 15 : راه‌اندازی RTC در CORTEXM4

STM32 _ RTC in CORTEXM4

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

سیسوگ در قسمت چهاردهم از آموزش میکروکنترلر STM32 به آموزش رجیستر‌های پشتیبان و کاربردی RTC پرداخت. در این قسمت از آموزش میکروکنترلر STM32 قصد دارد واحد RTC را از طریق میکروکنترلرهای خانواده CORTEXM4 راه اندازی کند. تا متوجه تفاوت‌های آن با خانواده CORTEXM3 شویم. در آخرین قسمت از آموزش میکروکنترلر STM32 با سیسوگ همراه باشید.

در CUBEMX میکروکنترلر STM32F407VGT6 را انتخاب می‌کنیم و مانند عکس زیر در قسمت RCC پایه‌های کریستال میکروکنترلر و قسمت RTC را فعال می‌کنیم و در قسمت RTC تنظیمات را به شکل عکس زیر قرار می‌دهیم، بدین صورت که دو آلارم RTC و تایمر WakeUp را هم فعال می‌کنیم، کاربرد این تایمر این است که از طریق آن می‌توانیم با هر زمانی که می‌خواهیم به صورت متوالی وقفه تولید کنیم. طریقه تنظیمات و استفاده از آن را در ادامه تفصیلاً بیان خواهیم کرد. هم‌چنین در قسمت Calibration می‌توانیم یک اسیلاتور با فرکانس مشخص 1 یا 512 هرتز روی پین PC13 داشته باشیم. یک واحد UART را نیز فعال می‌کنیم تا از آن برای دیباگ برنامه استفاده کنیم.

تنظیمات RTC برای CORTEXM4

آموزش میکروکنترلر STM32

حال به صفحه Clock Configuration می‌رویم و طبق عکس زیر فرکانس میکروکنترلر را روی 168 مگا هرتز قرار می‌دهیم و کریستال ساعت خارجی را به عنوان منبع کلاک واحد RTC انتخاب می‌کنیم.

صفحه Clock Configuration

در مرحله بعد به صفحه Configuration می‌رویم و دکمه RTC را می‌زنیم تا کادر زیر باز شود.

صفحه Configuration در CORTEXM4 STM32

همان‌طور که در قسمت عکس بالا می‌بینیم در قسمت Hour Format شما می‌توانید تعیین کنید ساعت به صورت 24 ساعته باشد یا 12 ساعته و در تقسیم کننده‌های فرکانس واحد RTC با نام‌های Asynchronous Predivider value با محدوده 0 تا 127 و Synchronous Predivider value با محدوده 0 تا 255 می‌توانید فرکانس واحد RTC را روی سرعت ایده‌آل خود یعنی 1 هرتز تنظیم کنید. طریقه کار هم بدین صورت است که ما فرکانس واحد RTC را که در اینجا 32767 یا همان فرکانس کریستال ساعت خارجی می‌باشد را به این دو عدد تقسیم می‌کنیم تا مقدار 1 حاصل گردد. توجه داشته باشید در اینجا چون اعداد مورد نظر از صفر شروع می‌شوند. ما باید در محاسبه همیشه این دو تقسیم کننده را به علاوه یک در نظر بگیریم. به عنوان مثال در اینجا فرکانس حاصل  مساوی است با:

 

32768 / ((127+1) * (255+1))

 

که نتیجه می‌شود همان 1 هرتز که نتیجه ایده‌آل ماست.

در ادامه در قسمت Calendar Time می‌توانید زمان واحد RTC را تعیین کنید و در قسمت Calendar Date هم می‌توانید تاریخ واحد RTC را تنظیم کنید. در قسمت Alarm A زمان رویداد مربوط به آلارم A یا همان آلارم اول را مشخص می‌کنیم و طبق عکس زیر زمانی که پایین‌تر می آییم در قسمت Alarm B زمان رویداد مربوط به آلارم B یا همان آلارم دوم را مشخص می‌کنیم.

تنظیمات آلارم STM32

در قسمت WakeUp در قسمت Wake Up Clock از گزینه‌های عکس زیر می‌توانیم فرکانس تایمر WakeUp را مشخص کنیم. اگر توجه کنید چهار گزینه اول فرکانس RTC را که در اینجا همان 32768 هرتز است را به ترتیب به اعداد 16 و یا 8 و یا 4 و یا 2 تقسیم می‌کنند و یا در گزینه پنجم به صورت خودکار فرکانس تایمر WakeUp را یک هرتز قرار می‌دهد. که در این حالت اگر Wake Up Counter مساوی صفر باشد هر یک ثانیه یکبار رویداد وقفه تایمر WakeUp فعال می‌گردد.

تنظیم فرکانس تایمر WakeUp STM32

گزینه بعدی Wake Up Counter است که رجیستری دو بایتی است و در نتیجه مقداری بین 0 تا 65535 می‌گیرد. همان‌طور که می‌بینید مقدار این رجیستر هم از صفر شروع می‌گردد، در نتیجه باید در محاسبات آن‌ را بعلاوه یک در نظر بگیریم. کار این رجیستر این است که مقدار شمارش تایمر WakeUp را مشخص می‌کند. یعنی اینکه در فرکانس تعیین شده برای این تایمر چه تعداد باید شمارش صورت پذیرد تا وقفه رویداد این تایمر فعال گردد. به عنوان مثال اگر Wake Up Clock روی 1HZ تنظیم شده باشد و مقدار Wake Up Counter هم مساوی 4 باشد در محاسبه آن‌ را به علاوه یک حساب می‌کنیم و به عبارتی هر 5 ثانیه یک بار وقفه رویداد رخ می‌دهد. توجه داشته باشید اگر گزینه آخر Wake Up Clock که همان 1Hz with 1 bit را انتخاب کرده باشیم تایمر WakeUp با زمان 1 هرتز پیکره بندی می‌شود و رجیستر Wake Up Counter به علاوه بیت یک هفتهم یا همان مقدار باینری 10000000000000000 می‌شوند. در نتیجه هر مقداری که ما داخل این رجیستر قرار دهیم بعلاوه 65536 خواهد شد این خاصیت زمانی کاربرد خواهد داشت که بخواهیم زمانی بیش از 65536 ثانیه را برای وقفه رویداد تایمر WakeUp داشته باشیم.

در قسمت Calibration هم می‌توانیم مقدار فرکانس کالیبره 512 هرتز را که قبلا انتخاب کرده‌ایم را ببینیم. در ضمن یکی از کاربردهای این ویژگی این است که با اندازه‌گیری آن توسط فرکانس متر متوجه شویم آیا واحد RTC با سرعت واقعی کار می‌کند و ساعت و تاریخ دقیق کار می‌کنند یا نه که اگر این فرکانس دقیق نبود میتوانیم با تغییر مقدار تقسیم کننده‌ها واحد RTC را کالیبره کنیم تا ساعت دقیقی داشته باشیم.

در مرحله بعد بمانند عکس زیر به لبه NIVIC Setting از همان برگه RTC می‌رویم و دو وقفه مربوط به آلارام و تایمر WakeUp را انتخاب می‌کنیم و بعد دکمه Ok را می‌زنیم.

لبه NIVIC Setting از برگه RTC

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

لبه NIVIC Setting از برگه RTC

NVIC Configuration

NVIC Configuration

بعد از انجام این مراحل با زدن دکمه Generate از نرم افزار CUBEMX خروجی می‌گیریم و به محیط نرم افزار keil می‌رویم. در ابتدا به تابع MX_RTC_Init می‌رویم تا ببنیم واحد RTC چگونه طبق تنظیمات ما در نرم‌افزار CUBEMX پیکره‌بندی شده است. همان‌طور که پیش از این گفته شد یکی از کاربردهای رجیسترهای پشتیبان واحد RTC تشخیص بهم خوردن تنظیمات واحد RTC و زمان و تاریخ است بدین منظور در این برنامه هم در انتهای پیکره‌بندی این واحد یکی از رجیسترهای پشتیبان با مقداری خاص پر می‌شود تا علامت زده شود که تنظیمات پیش فرض واحد RTC انجام شده است. چون در ابتدای تنظیمات چک می‌شود که آیا این رجیستر با آن مقدار خاص پر شده است یا نه، اگر رجیستر مقدارش مساوی مقدار مورد نظر نبود معلوم می‌شود که یا تنظیمات تا الان انجام نشده و یا اینکه تنظیمات مثلاً به دلیل ضعیف شدن باطری متصل به پایه VBAT میکروکنترلر بهم ریخته است. بعد از آموزش این نکته به سراغ دستورات این واحد می‌رویم.

همانطور که در عکس زیر می‌بینید ابتدا تنظیمات عمومی واحد RTC و دو رجیستر تقسیم کننده فرکانس آن که پیش از این توضیح داده شد صورت می‌پذیرد.

تنظیمات عمومی واحد RTC

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

تنظیمات پیشفرض برای زمان و تاریخ

و در مرحله زیر هم تنظیمات مربوط به آلارم A و B صورت می‌گیرد.

تنظیمات مربوط به آلارم A و B

همان‌طور که در عکس بالا میبینید ما از طریق فرمان HAL_RTC_SetAlarm_IT می‌توانیم هم زمان تنظیمات رویداد آلارم را اعمال کنیم و در ادامه مطابق عکس زیر از طریق فرمان HAL_RTCEx_SetWakeUpTimer_IT می‌توانیم تایمر WakeUp را همزمان هم پیکره‌بندی کنیم و هم وقفه رویداد آن را فعال نمائیم.

پیکربندی تایمر WakeUp

توجه داشته باشید در برنامه بالا شکل تابع HAL_RTCEx_SetWakeUpTimer_IT به صورت زیر می‌باشد.

که در این‌جا منظور از WakeUpCounter همان رجیستر کانتر تایمر WakeUp است که از صفر شروع می‌شود و منظور از WakeUpClock همان گزینه‌ای متناظر تنظیم شده داخل نرم‌افزار CUBEMX است که از طریق آن می‌توانیم فرکانس کار تایمر WakeUp را تعیین کنیم و طبق عکس زیر در برگه stm32f4xx_hal_rtc_ex.h حالات زیر را شامل می‌شود. که در اینجا منظور از RTC_WAKEUPCLOCK_CK_SPRE_16BITS همان حالت 1Hz است که در نرم افزار CUBEMX انتخاب کردیم.

برگه stm32f4xx_hal_rtc_ex.h

بعد از پیکره بندی RTC حالا باید سراغ معرفی توابع مربوط به رویدادهای وقفه های مورد استفاده برویم، همانطور که میبینید ما در این برنامه از سه وقفه استفاده کردیم اولی و دومی مربوط به رویداد های مربوط به آلارم A و آلارم B و هم‌چنین رویداد مربوط به تایمر WakeUp ، همانطور که در عکس زیر میبینید ما برای این منظور از سه تابع Callback برای هرکدام از آنها استفاده می‌کنیم.

تابع Callback

 

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

موفق باشید.



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

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

 

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

4 دیدگاه در “آموزش میکروکنترلر STM32 قسمت 15 : راه‌اندازی RTC در CORTEXM4

  1. Avatar امین گفت:

    با سلام
    Stm32 قسمت تایمر ساخت موج pwmو واحد adcنداره ؟؟این قسمتا خیلی مهمتر بودن توضیحی در این مورد می دین ما خیلی پیگیر اموزش های سایتتون هستیم.
    با تشکر

    1. N H N H گفت:

      سلام دوست عزیز
      در سری جدید آموزش های STM32 تحت عنوان آموزش میکروکنترلر STM32F4 تمام موارد از جمله adc ها و …. توضیح داده می‌شود.

  2. Avatar Amir گفت:

    این جمله آخر رو متوجه نمیشم … اگه ممکنه بیشتر توضیح دهید

    “در اینجا به پایان مجموعه آموزش میکروکنترلر STM32 رسیدیم. از اینکه در مجموعه آموزش میکروکنترلر STM32 سیسوگ را همراهی کردید سپاسگزارم.”

    ممنون!!

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

      سلام دوست عزیز – منظور اینه که این سری آموزشی مبتنی بر HAL تمام شد و انشالله منتظر سری جدید مبتنی بر SPL باشید.

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

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