آموزش میکروکنترلر STM32
در قسمت چهاردهم از آموزش میکروکنترلرSTM32 به آموزش رجیسترهای پشتیبان و کاربردی RTC پرداخت. در این قسمت از آموزش میکروکنترلر STM32 قصد داریم واحد RTC را ازطریق میکروکنترلرهای خانواده CORTEXM4 راهاندازی کنیم. تا متوجه تفاوتهای آن با خانواده CORTEXM3 شویم. در آخرین قسمت از آموزش میکروکنترلر STM32 با ما همراه باشید.
در CUBEMX میکروکنترلر STM32F407VGT6 را انتخاب میکنیم و مانند عکسزیر در قسمت RCC پایههای کریستال میکروکنترلر و قسمت RTC را فعال میکنیم و در قسمت RTC تنظیمات را بهشکل عکسزیر قرار میدهیم، بدینصورت که دو آلارم RTC و تایمر WakeUp را هم فعال میکنیم، کاربرد این تایمر این است که ازطریق آن میتوانیم با هرزمانی که میخواهیم بهصورت متوالی وقفه تولیدکنیم. طریقه تنظیمات و استفادهاز آن را در ادامه تفصیلاً بیان خواهیمکرد. همچنین در قسمت Calibration میتوانیم یک اسیلاتور با فرکانس مشخص ۱ یا ۵۱۲هرتز روی پین PC13 داشتهباشیم. یک واحد UART را نیز فعال میکنیم تا از آن برای دیباگ برنامه استفادهکنیم.
حال به صفحه Clock Configuration میرویم و طبق عکسزیر فرکانس میکروکنترلر را روی ۱۶۸مگاهرتز قرار میدهیم و کریستال ساعت خارجی را بهعنوان منبع کلاک واحد RTC انتخاب میکنیم.
در مرحلهی بعد به صفحه Configuration میرویم و دکمه RTC را میزنیم تا کادر زیر باز شود.
همانطورکه در قسمت عکسبالا میبینیم در قسمت Hour Format شما میتوانید تعیینکنید ساعت بهصورت ۲۴ساعته باشد یا ۱۲ساعته و در تقسیمکنندههای فرکانس واحد RTC با نامهای Asynchronous Predivider value با محدوده صفر تا ۱۲۷ و Synchronous Predivider value با محدوده صفر تا ۲۵۵ میتوانید فرکانس واحد RTC را روی سرعت ایدهآل خود یعنی ۱هرتز تنظیمکنید. طریقهی کار هم بدینصورت است که ما فرکانس واحد RTC را که در اینجا ۳۲۷۶۷ یا همان فرکانس کریستال ساعت خارجی میباشد را به این دو عدد تقسیم میکنیم تا مقدار ۱ حاصلگردد. توجهداشتهباشید در اینجا چون اعداد موردنظر از صفر شروع میشوند. ما باید در محاسبه همیشه این دو تقسیمکننده را بهعلاوه یک درنظربگیریم. بهعنوانمثال در اینجا فرکانس حاصل مساوی است با: ۳۲۷۶۸ / ((۱۲۷+۱) * (۲۵۵+۱)) که نتیجه میشود همان ۱ هرتز که نتیجه ایدهآل ماست.
در ادامه در قسمت Calendar Time میتوانید زمان واحد RTC را تعیینکنید و در قسمت Calendar Date هم میتوانید تاریخ واحد RTC را تنظیمکنید. در قسمت Alarm A زمان رویداد مربوطبه آلارم A یا همان آلارم اول را مشخص میکنیم و طبق عکسزیر زمانیکه پایینتر می آییم در قسمت Alarm B زمان رویداد مربوطبه آلارم B یا همان آلارم دوم را مشخص میکنیم.
در قسمت WakeUp در قسمت Wake Up Clock از گزینههای عکسزیر میتوانیم فرکانس تایمر WakeUp را مشخصکنیم. اگر توجهکنید چهار گزینهی اول فرکانس RTC را که در اینجا همان ۳۲۷۶۸هرتز است را بهترتیب به اعداد۱۶ و یا ۸ و یا ۴ و یا ۲ تقسیم میکنند و یا در گزینه پنجم بهصورت خودکار فرکانس تایمر WakeUp را ۱هرتز قرار میدهد. که در اینحالت اگر Wake Up Counter مساوی صفر باشد هر ۱ ثانیه یکبار رویداد وقفه تایمر WakeUp فعال میگردد.
گزینه بعدی Wake Up Counter است که رجیستری ۲بایتی است و درنتیجه مقداری بین صفر تا ۶۵۵۳۵ میگیرد. همانطورکه میبینید مقدار این رجیستر هم از صفر شروع میگردد، درنتیجه باید در محاسبات آن را +۱ درنظربگیریم. کار این رجیستر این است که مقدار شمارش تایمر WakeUp را مشخص میکند. یعنی اینکه در فرکانس تعیینشده برای این تایمر چهتعداد باید شمارش صورت پذیرد تا وقفه رویداد این تایمر فعالگردد. بهعنوانمثال اگر Wake Up Clock روی ۱HZ تنظیم شدهباشد و مقدار Wake Up Counter هم مساوی ۴ باشد در محاسبه آن را +۱ حساب میکنیم و بهعبارتی هر ۵ثانیه یکبار وقفه رویداد رخ میدهد. توجهداشتهباشید اگر گزینه آخر Wake Up Clock که همان 1Hz with 1 bit را انتخاب کردهباشیم تایمر WakeUp با زمان ۱هرتز پیکرهبندی میشود و رجیستر Wake Up Counter بهعلاوه بیت یک هفتهم یا همان مقدار باینری 10000000000000000 میشوند. درنتیجه هر مقداری که ما داخل این رجیستر قراردهیم بعلاوه ۶۵۵۳۶ خواهد شد این خاصیت زمانی کاربرد خواهد داشت که بخواهیم زمانی بیش از ۶۵۵۳۶ثانیه را برای وقفه رویداد تایمر WakeUp داشتهباشیم.در قسمت Calibration هم میتوانیم مقدار فرکانس کالیبره ۵۱۲ هرتز را که قبلا انتخاب کردهایم را ببینیم. درضمن یکیاز کاربردهای این ویژگی این است که با اندازهگیری آن توسط فرکانس متر متوجهشویم آیا واحد RTC با سرعت واقعی کار میکند و ساعت و تاریخ دقیق کار میکنند یا نه که اگر این فرکانس دقیق نبود میتوانیم با تغییر مقدار تقسیمکنندهها واحد RTC را کالیبره کنیم تا ساعت دقیقی داشتهباشیم.
در مرحلهی بعد مانند عکسزیر به لبه NIVIC Setting از همان برگه RTC میرویم و دو وقفه مربوطبه آلارام و تایمر WakeUp را انتخاب میکنیم و بعد دکمه Ok را میزنیم.
در مرحلهی بعد مانند عکسهای زیر اینبار دکمه NVIC را میزنیم و در اینجا هم در دو صفحه آن باز همان دو وقفه را در حالت انتخابشده قرار میدهیم و بعد دکمه Ok را میزنیم.
بعداز انجام این مراحل با زدن دکمه Generate از نرمافزار CUBEMX خروجی میگیریم و به محیط نرمافزار keil میرویم. در ابتدا به تابع MX_RTC_Init میرویم تا ببنیم واحد RTC چگونه طبق تنظیمات ما در نرمافزار CUBEMX پیکرهبندی شدهاست. همانطورکه پیشاز این گفتهشد یکیاز کاربردهای رجیسترهای پشتیبان واحد RTC تشخیص بهمخوردن تنظیمات واحد RTC و زمان و تاریخ است بدینمنظور در این برنامه هم در انتهای پیکرهبندی این واحد یکیاز رجیسترهای پشتیبان با مقداری خاص پر میشود تا علامت زدهشود که تنظیمات پیشفرض واحد RTC انجام شدهاست. چون در ابتدای تنظیمات چک میشود که آیا این رجیستر با آن مقدار خاص پر شدهاست یا نه، اگر رجیستر مقدارش مساوی مقدار موردنظر نبود معلوم میشود که یا تنظیمات تا الان انجامنشده و یا اینکه تنظیمات مثلاً بهدلیل ضعیفشدن باطری متصلبه پایه VBAT میکروکنترلر بهمریختهاست. بعد از آموزش این نکته به سراغ دستورات این واحد میرویم. همانطورکه در عکسزیر میبینید ابتدا تنظیمات عمومی واحد RTC و دو رجیستر تقسیمکننده فرکانس آن که پیشاز این توضیحدادهشد صورت میپذیرد.
در مرحلهی بعد بهشکل عکسزیر تنظیمات پیشفرض برای زمان و تاریخ این واحد صورت میگیرد.
و در مرحلهی زیر هم تنظیمات مربوطبه آلارم A و B صورت میگیرد.
همانطورکه در عکسبالا میبینید ما از طریق فرمان HAL_RTC_SetAlarm_IT میتوانیم همزمان تنظیمات رویداد آلارم را اعمالکنیم و در ادامه مطابق عکسزیر ازطریق فرمان HAL_RTCEx_SetWakeUpTimer_IT میتوانیم تایمر WakeUp را همزمان هم پیکرهبندی کنیم و هم وقفه رویداد آن را فعال نمائیم.
توجهداشتهباشید در برنامه بالا شکل تابع HAL_RTCEx_SetWakeUpTimer_IT بهصورتزیر میباشد.
(HAL_RTCEx_SetWakeUpTimer_IT(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock
که در اینجا منظور از WakeUpCounter همان رجیستر کانتر تایمر WakeUp است که از صفر شروع میشود و منظور از WakeUpClock همان گزینهای متناظر تنظیمشده داخل نرمافزار CUBEMX است که از طریق آن میتوانیم فرکانس کار تایمر WakeUp را تعیینکنیم و طبق عکسزیر در برگه stm32f4xx_hal_rtc_ex.h حالات زیر را شامل میشود. که در اینجا منظور از RTC_WAKEUPCLOCK_CK_SPRE_16BITS همان حالت ۱Hz است که در نرمافزار CUBEMX انتخابکردیم.
بعداز پیکرهبندی RTC حالا باید سراغ معرفی توابع مربوطبه رویدادهای وقفههای مورداستفاده برویم، همانطورکه میبینید ما در این برنامه از سه وقفه استفادهکردیم اولی و دومی مربوطبه رویدادهای مربوطبه آلارم A و آلارم B و همچنین رویداد مربوطبه تایمر WakeUp، همانطورکه در عکسزیر میبینید ما برای اینمنظور از سه تابع Callback برای هرکدام از آنها استفاده میکنیم.
در اینجا به پایان مجموعه آموزش میکروکنترلر STM32 رسیدیم. از اینکه در مجموعه آموزش میکروکنترلر STM32 ما را همراهی کردید سپاسگزارم. موفق باشید.
منبع: سیسوگ