آموزش میکروکنترلر STM32 – قسمت پانزدهم ;
سیسوگ در قسمت چهاردهم از آموزش میکروکنترلر STM32 به آموزش رجیسترهای پشتیبان و کاربردی RTC پرداخت. در این قسمت از آموزش میکروکنترلر STM32 قصد دارد واحد RTC را از طریق میکروکنترلرهای خانواده CORTEXM4 راه اندازی کند. تا متوجه تفاوتهای آن با خانواده CORTEXM3 شویم. در آخرین قسمت از آموزش میکروکنترلر STM32 با سیسوگ همراه باشید.
در CUBEMX میکروکنترلر STM32F407VGT6 را انتخاب میکنیم و مانند عکس زیر در قسمت RCC پایههای کریستال میکروکنترلر و قسمت RTC را فعال میکنیم و در قسمت RTC تنظیمات را به شکل عکس زیر قرار میدهیم، بدین صورت که دو آلارم RTC و تایمر WakeUp را هم فعال میکنیم، کاربرد این تایمر این است که از طریق آن میتوانیم با هر زمانی که میخواهیم به صورت متوالی وقفه تولید کنیم. طریقه تنظیمات و استفاده از آن را در ادامه تفصیلاً بیان خواهیم کرد. همچنین در قسمت Calibration میتوانیم یک اسیلاتور با فرکانس مشخص 1 یا 512 هرتز روی پین PC13 داشته باشیم. یک واحد UART را نیز فعال میکنیم تا از آن برای دیباگ برنامه استفاده کنیم.
حال به صفحه Clock Configuration میرویم و طبق عکس زیر فرکانس میکروکنترلر را روی 168 مگا هرتز قرار میدهیم و کریستال ساعت خارجی را به عنوان منبع کلاک واحد RTC انتخاب میکنیم.
در مرحله بعد به صفحه Configuration میرویم و دکمه RTC را میزنیم تا کادر زیر باز شود.
همانطور که در قسمت عکس بالا میبینیم در قسمت 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 یا همان آلارم دوم را مشخص میکنیم.
در قسمت WakeUp در قسمت Wake Up Clock از گزینههای عکس زیر میتوانیم فرکانس تایمر WakeUp را مشخص کنیم. اگر توجه کنید چهار گزینه اول فرکانس RTC را که در اینجا همان 32768 هرتز است را به ترتیب به اعداد 16 و یا 8 و یا 4 و یا 2 تقسیم میکنند و یا در گزینه پنجم به صورت خودکار فرکانس تایمر WakeUp را یک هرتز قرار میدهد. که در این حالت اگر Wake Up Counter مساوی صفر باشد هر یک ثانیه یکبار رویداد وقفه تایمر WakeUp فعال میگردد.
گزینه بعدی 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 را میزنیم.
در مرحله بعد به مانند عکسهای زیر اینبار دکمه 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 به صورت زیر میباشد.
1 | (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 همان حالت 1Hz است که در نرم افزار CUBEMX انتخاب کردیم.
بعد از پیکره بندی RTC حالا باید سراغ معرفی توابع مربوط به رویدادهای وقفه های مورد استفاده برویم، همانطور که میبینید ما در این برنامه از سه وقفه استفاده کردیم اولی و دومی مربوط به رویداد های مربوط به آلارم A و آلارم B و همچنین رویداد مربوط به تایمر WakeUp ، همانطور که در عکس زیر میبینید ما برای این منظور از سه تابع Callback برای هرکدام از آنها استفاده میکنیم.
در اینجا به پایان مجموعه آموزش میکروکنترلر STM32 رسیدیم. از اینکه در مجموعه آموزش میکروکنترلر STM32 سیسوگ را همراهی کردید سپاسگزارم.
موفق باشید.
سلام
آقا من دیشب یه سوال اینجا پرسیدم
الان اومدم جوابشو ببینم، ولی سوالمم نیست 😎
سوالتون بود 🙂
سلام بزرگوار
من از میکرو stm32f051c8t6 داخل یک پروژه استفاده کردم
قسمت rtc این میکرو انگار کمی متفاوت هستش
توابعی که شما فرمودید رو نداره
حتی دکمه ی فعال سازی اینتراپت تایمر هم نداره
بعضی از توابعش رو هم که فراخوانی میکنم کامپایلر ارور میده
برنامه آپدیت شده ست و تمامی تنظیمات rtc هم صحیح هستش
امکانش هست راهنمایی بفرمایید؟
ممنون
سلام دوست عزیز
مساله اینه فکر میکنم برای میکروی شما اسم توابع متفاوت باشه و به همین دلیل هم هست که جواب نمی گیرید
با سلام
من در حال راه اندازی RTC داخلی آیسی STM32F302CBT6 هستم و برای انتقال دیتا از USB توی مد CDC استفاده میکنم مشکلی که هست اینه زمانی که USB داخل برنامه فعال میشه و RTC نداریم همه چیز به درستی کار میده اما از زمانی که RTC میاد داخل برنامه همه چیز به هم میریزد و هیچ قسمتی کار نمیکنه حتی GPIO فعال نمیشه که بخوام پین مربوط به اتصال USB را کنترل کنم
ممکنه RTC درست راه اندازی نشه و به این دلیل باشه این مساله
یک جایی توی توابع داخلی سعی میکنه که نوسان ساز رو راه اندازی کنه و اگر راه اندازی نشه ، همونجا میمونه
سلام.خدا قوت .ممنون از آموزش های خوبتون
ورژن CUBEMX که استفاده می کنید چند هست؟….منوهاش با اینی که من دارم فرق می کنه
سلام دوست عزیز
قطعا وقتی که مقاله تدوین شده ورژن های امروزی در درسترس نبودن و به طبع این تغییرات بخاطر آپدیت های جدید هست
سلام
آقا یه سوال؟ چطوری میتونم تو stm32f103 مثلا 8 تا زمان مختلف با unix timestamp مشخص کرده باشم و به طور خودکار میکروکنترلر با وقفه به سرویس روتین رفته و دستورات سرویس را انجام دهد همچنین این زمان ها پرودیک هستند و در یک فاصله زمانی مشخصی مثلا 5 دقیقه interval دارند.
ممنون از راهنمایی تون
تا اونجا که میدونم تنها یک زمان رو برای ویک آپ میتونید تنظیم کنید – البته راه کارهای نرم افزاری دیگه ای وجود داره مثل این که زمان ها رو پشت سر هم بر اساس زمان مرتب کنید و با تنظیم اولین زمان منتظر وقوع اون بشید و با وقوع اون توی اینتراپت زمان دوم رو تنظیم کنید و همینطور تا آخر ادامه بدید …
البته راه کارهای دیگع ای هم وجود داره که احتمالا با مقداری زمان گذاشتن خودتون بهتر می تونید با توجه به صورت مساله به نتیجه برسید.
سلام ممنون از آموزش هاتون
چرا ادامه نداديد؟ قسمت ارتباط can رو نوشته بوديد كه آموزش مي ديد.
چرا انقدر براي اين ارتباط can ،مطلب كمه تو نت آخه!
سلام دوست عزیز
فکر میکنم آموزش can توی سایت داشته باشیم
توی سایت جستجو کنید.
سلام
یه مشکلی که من دارم با این واحد اینه که وقتی میکرو ریست میشه به هر دلیلی
مثل قطع شدن برق زمان درست میمونه تو حافظه ولی تاریخ صفر میشه
با کیوب تنظیمات انجام شده و با توابع hal کار میکنم نمیدونم مشکل از کجاست
کسی به این مشکل برخورد داشته ؟
خوب این مورد میتونه از برنامه نویسی باشه
در میکروکنترلر STM32 شما بعد از ریست باید چک کنید و ببینید قبلا RTC مقداری دهی شده یا نه و مثلا اگر قبلا RTC رو مقدار دهی کرده بودید از مقدار دهی مجدد اون صرف نظر کنید
برای این کار میتونید از رجیستر های Backup کمک بگیرد ؛ مثلا بعد از مقدار دهی RTC مقدار خاصی رو توی یکی از این رجیستر ها یاداشت کنید. و بعد از ریست چک کنید مقدار یاداشت شده رو
سلام ممنون
نه مقدار دهی نمیکنم
و این که ساعت درست هست مشکل نمیخوره فقط تاریخ ریست میشه
اینو تو سایت های دیگه هم دیدم که تاریخ بروز نمیشه وقتی برق میکرو قطع میشه البته تو سری f1
ممنون میشم شما هم یه بررسی داشته باشید
سخت افزار به درستی کار مکینه و مشکلی هم نداره فقط مثل این که رجیستر های تاریخ رو میکرو افزایش نمیده
سلام ؛ خوب احتمال قوی اینه که مشکل از برنامه تون هست ، چون STM32 زمان رو به صورت Unix TimeStamp نگهداری میکنه ؛
پس اگز ساعت درسته ؛ تاریخ هم باید درست باشه ؛ چون این دو دقیقا وابسته به هم هستند و نمیشه یکی درست باشه و یکی نباشه
در مورد Unix TimeStamp قبلا مقاله ای منتشر کردیم . که میتونید مطالعه کنید و دلیل صحبتم رو بهتر درک کنید.
با سلام
Stm32 قسمت تایمر ساخت موج pwmو واحد adcنداره ؟؟این قسمتا خیلی مهمتر بودن توضیحی در این مورد می دین ما خیلی پیگیر اموزش های سایتتون هستیم.
با تشکر
سلام دوست عزیز
در سری جدید آموزش های STM32 تحت عنوان آموزش میکروکنترلر STM32F4 تمام موارد از جمله adc ها و …. توضیح داده میشود.
این جمله آخر رو متوجه نمیشم … اگه ممکنه بیشتر توضیح دهید
“در اینجا به پایان مجموعه آموزش میکروکنترلر STM32 رسیدیم. از اینکه در مجموعه آموزش میکروکنترلر STM32 سیسوگ را همراهی کردید سپاسگزارم.”
ممنون!!
سلام دوست عزیز – منظور اینه که این سری آموزشی مبتنی بر HAL تمام شد و انشالله منتظر سری جدید مبتنی بر SPL باشید.
سلام
روش اموزشت خیلی عالی بود کاش باز هم hal رو ادامه بدید.
بازم تشکر