آموزش میکروکنترلر STM32 – قسمت دوازدهم ;
سیسوگ در قسمت یازدهم از آموزش میکروکنترلر STM32 تنظیمات نرمافزار CubeMX برای رابط RTC در خانواده CORTEXM3 را آموزش داد و تنظیمات را به نرم افزار Keil منتقل کرد. در این قسمت از آموزش میکروکنترلر STM32 قصد دارد در ابتدا توابع عمومی رابط RTC را بررسی کند و جزئیات ساختار RTC_TimeTypeDef و RTC_DateTypeDef را بیان نمایید. در مجموعه آموزش میکروکنترلر STM32 با سیسوگ همراه باشید.
در قسمت قبل از نرم افزار Cubemx خروجی گرفتیم و وارد نرم افزار Keil شدیم. حال باید در ابتدا توابع عمومی رابط RTC را بررسی کنیم.
1 | HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) |
بوسیله تابع بالا میتوانید زمان را که تشکیل شده از ساعت به همراه دقیقه و ثانیه داخل یک ساختار از نوع RTC_TimeTypeDef را دریافت کنید. برای اینکه متوجه اعضای این ساختار شوید به محل تعریف آن میرویم. در عکس زیر میتوانید اعضای این ساختار را مشاهده کنید.
بعنوان مثال ما سه خط برنامه زیر ابتدا یک ساختار از نوع زمان تعریف میکنیم و در خط دوم زمان را از رابط RTC میخوانیم و داخل ساختار مورد نظر میریزیم و در خط سوم زمان دریافتی را روی رابط سریال نمایش میدهیم.
1 2 3 | RTC_TimeTypeDef time; HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN); printf("TIME=%02d:%02d:%02d\r\n", time.Hours, time.Minutes, time.Seconds); |
توجه داشته باشید در خط دوم برنامه بالا آرگومان اول همان اسم واحد RTC مورد استفاده شماست و آرگومان دوم همان ساختار متغیر زمان است که در خط بالاتر تعریف کردید و آرگومان سوم همان نوع فرمت اطلاعات دریافتی است که در نرم افزار Cubemx هم آن را بصورت Binary تعیین کردیم.
1 | HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format) |
بوسیله تابع بالا میتوانید تاریخ را که تشکیل شده از سال به همراه ماه و روز و نام روز هفته داخل یک ساختار از نوع RTC_DateTypeDef دریافت کنید برای اینکه متوجه اعضای این ساختار شوید به محل تعریف آن میرویم. در عکس زیر میتوانید اعضای این ساختار را مشاهده کنید.
به عنوان مثال، در سه خط برنامه زیر ابتدا یک ساختار از نوع تاریخ تعریف میکنیم و در خط دوم تاریخ را از رابط RTC میخوانیم و داخل ساختار مورد نظر میریزیم و در خط سوم تاریخ دریافتی را روی رابط سریال نمایش میدهیم.
1 2 3 | RTC_DateTypeDef date; HAL_RTC_GetTime(&hrtc, &date, RTC_FORMAT_BIN); printf("DATE=%02d/%02d/%02d\r\n", date.Year, date.Month, date.Date); |
حال به قسمت توضیح توابع تنظیم زمان و تاریخ میرسیم.
1 | HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) |
بوسیله تابع بالا میتوانید زمان را که قبلا در یک ساختار از نوع RTC_TimeTypeDef ذخیره شده، به واحد RTC اعمال کنیم. به عنوان نمونه ما در مثال زیر ابتدا یک ساختار از نوع RTC_TimeTypeDef تعریف میکنیم و سپس در سه خط بعد زمان خودمان را داخل آن قرار میدهیم و سپس در خط پنجم آن را به واحد RTC اعمال میکنیم تا با این زمان تنظیم شود.
1 2 3 4 5 | RTC_TimeTypeDef time; time.Hours = 1; time.Minutes = 0; time.Seconds = 0 HAL_RTC_SetTime(&hrtc, &time, RTC_FORMAT_BIN); |
خوب حالا باید تابع تنظیم تاریخ را توضیح دهیم.
1 | HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format) |
بوسیله تابع بالا میتوانید تاریخ را که قبلا در یک ساختار از نوع RTC_DateTypeDef ذخیره شده، به واحد RTC اعمال کنیم. به عنوان نمونه، در مثال زیر ابتدا یک ساختار از نوع RTC_DateTypeDef تعریف میکنیم و سپس در چهار خط بعد تاریخ خودمان را داخل آن قرار میدهیم و سپس در خط ششم آن را به واحد RTC اعمال میکنیم تا با این زمان تنظیم شود.
1 2 3 4 5 6 | RTC_DateTypeDef date; date.WeekDay = RTC_WEEKDAY_MONDAY; date.Month = 1; date.Date = 12; date.Year = 18; HAL_RTC_SetDate(&hrtc, &date, RTC_FORMAT_BIN); |
در خط دوم از کدهای بالا، میتوانیم روز هفته را تنظیم نمائیم که محدوده آن بین 0 تا 6 میباشد که میتوانیم از ماکروهای از پیش تعریف شده نیز استفاده کنیم که میتوانید در عکس زیر مشاهده نمائید.
برای تنظیم ماه هم میتوانیم از ماکرو های عکس زیر استفاده کنیم ولیکن تنها در فرمت BCD و چون ما در اینجا از فرمت باینری استفاده میکنیم باید از محدوده اعداد 1 تا 12 برای تنظیم ماه استفاده کنیم.
در قسمت تنظیم سال هم ما باید عدد سال میلادی را منحی 2000 وارد کنیم یعنی اگر سال 2018 است ما باید عدد 18 را به عنوان سال وارد نمائیم.
بروز رسانی 1399/01/19
یکی از دوستان در قسمت نظرها نوشته بودند که تاریخ در سری F103 بعد از خاموش روشن شدن میکرو ریست میشود. برای ایشان توضیح دادم که این مشکل باگی هست که کتابخانه HAL برای سری F103 دارد و با تغییراتی در فایلهای مربوط به RTC مشکل برطرف میگردد. (امکان دارد این مورد در نسخههای جدید کتابخانه برطرف گردد.)
با این حال فایلهای اصلاح شده که در آن تاریخ مشکلی ندارد را می توانید از اینجا دانلود کنید.
در قسمت سیزدهم مجموعه آموزش میکروکنترلر STM32 سیسوگ قصد دارد وقفه های رابط RTC را آموزش دهد. با سیسوگ همراه باشید.
سلام وقتتون بخیر
مرسی از سایت و مطالب فوق العادتون. در مورد ریست شدن تاریخ که شما در متن در قسمت بروزرسلانی یک سری فایل ها رو گذاشتین، این فایل ها دقیقا به کدوم قسمت پروژه باید اضافه بشه؟ فایلی که اسمش stm32f1xx_hal_rtc است رو پیدا کردم که کجاس ولی اون یکی با نام rtc.c رو هر جایی اضافه میکنم، کامپایل خطای این که rtc.h موجود نیست رو میده.ممنون میشم راهنمایی کنین
سلام
مشکل من هنوز حل شده خواهش میکنم یه راهنمایی بکنین برای یه پروژه بهش بدجوری نیاز دارم.
اون قضیه محل قرار گیری فایل ها و اصلاح ریست شدن تاریخ رو انجام دادم. یک بار درسته ولی وقتی ریست میشه کلا تاریخ بهم میریزه و یه چیز دیگه نشون میده. ازتون خواهش میکنم یه راهنمایی بکنین که غیر از قرار دادن این فایل ها و پاک کردن اون چند خط کد واسه ریست شدن تاریخ و ساعت کار دیگه ای هم باید انجام بشه یا ن؟
سلام ممنون از مطلبتون
وقتی دستمو به کریستال ساعت میزنم تا وقتی دستم روش هست دیگه تایم رو نمی شماره!!
راه حلی هست براش؟
بدنه کریستال رو به زمین مدار هم لحیم کردم
خوب به کجای کریستال ساعت دست میزنید ؟
البته منطقیه که وقتی ظرفیت خازنی پایه های کریستال عوض میشه نوسان ساز از کار بیفته
به ترك هاي مسير بين كريستال و ميكرو
اين اتفاق تو يك برد ديگه هم براي كريستال اصلي افتاده
وقي انگشتمو به مسير بين كريستال و ميكرو ميزنم سرعت چشمك زدن يكي از پايه هاي ميكرو كه به ال اي دي وصله تغيير ميكنه و درنهايت ميكرو ريست ميشه(فكر ميكنم چون واچ داگ فعاله)
البته اينم بگم كه برد بدون چاپ محافظ هست
خب دوست عزیز نباید به اون قسمت دست بزنید
کوچکترین امپدانس میتونه باعث اختلال قسمت اسیلاتور بشه و این موضوع عادی هست
بله متوجه شدم، خيلي ممنون
سلام من از برد آزمایشی f103 استفاده میکنم. باتری را هم قرار دادم و ولتاژش هم درسته. وقتی میکرو ریست میشه ساعت و تاریخ صفر میشه و از اول شروع به شمارش میکنه.نباید شمارش را ادامه بده؟ این دستور rtc_int آیا باعث دوباره کانفیگ شدن واحد rtc نمیشه؟ ممنون از آموزش های خوبتون.
سلام دوست عزیز – تا اونجا که به خاطر دارم کتابخانه rtc این مساله رو هندل می کرد به این شکل که اگر مثلا مقدار رجیسترهای بک آپ (توی تری ۱۰۳ ۱۶ رجیستر بک اپ داریم که با قطع برق مقدارشون حفظ میشه) مقدار خاصی باشه – نشون میده که ما قبلا rtc رو مقدار دهی کردیم و اگر چنین نبود میرفت برای مقدار دهی rtc و بعد از اتمام کار مقدار بک آپ رجیستر ست میشد. من فکر میکنم بیشتر مشکل شما نرم افزاری باشه
سمپل های کتابخانه رو برای rtc ببینید احتمالا مشکلتون رو بتونید حل کنید.
سلام
خوبی؟؟
ممنون از آموزش کامل و جامعت
یک موردی که من خودم زیاد بهش برخوردم نحوه خواندن زمان و تاریخ از میکرو هستش
توی یک پروژه ای این مشکل بود ما اول زمان رو میخوندیم و بعدش میرفتیم سراغ خواندن تاریخ و همیشه به مشکل میخوردیم
یکی از دوستان پیشنهاد داد اول تاریخ رو بخون بعدش زمان رو بخون از همین تکنیک استفاده کردیم و جواب داد
نمیگم برای شما هم جواب میده ولی جالبه تستش کنید و بگین چی شد!!
سلام و عرض ادب خداقوت و تشکر
بنده با همین میکرو کار میکنم ولی قسمت تاریخ ظاهرا کار نمیکنه و بعد از ریست میکرو اون هم ریست میشه
بعد از کمی تحقیقات متوجه شدم مدل F103 از تاریخ پشتیبانی نمیکنه. درس میگم؟
ببیند F103 داری واحد RTC است پس از زمان و تاریخ به درستی پشتیبانی میکنه ، اما نکنه ای که باید بهش توجه داشته باشید اول این است که خانواده های ST بر خلاف خانواده های NXP که RTC داری رجیتسر های مجزا برای تاریخ (سال / روز / ماه) هستند ، داری رجیستر مجزا نیست و در واقع زمان رو به صورت unix Timestamp ذخیره میکنه یعنی یه عدد 32 بیتی
پس جدا سازی سال و روز و ماه و …. به صورت نرم افزاری باید انجام بشه که کتابخونه های عرضه شده از سوی شرکت مشکلی ندارد !
اما دلیل این که وقتی میکرو ریست میشه زمان هم ریست میشه برمیگرده به باگ نرم افزاری که ممکنه شما با هر بار روشن شدن میکرو زمان رو ست بکنید که قائدتا این کار درستی نیست
سلام؛
موردی که مطرح کردید باگی هست که کتابخانه HAL برای سری F103 داره و با تغییراتی در فایل های مربوط به RTC حل میشه (ممکنه تو نسخه های جدید کتابخانه این مورد اصلاح بشه)
من فایل های اصلاح شده رو هم فرستادم برای سیسوگ که اگه صلاح دونستن به این پست اضافه کنن
سلام
میشه توضیح بدید چیکارشون کنیم فایلارو؟
سلام
باید جایگزین فایل های همنام در پروژه بشن.
سلام
داخل فایل rtc.c یه include public.h هست. اما فایل public.h وجود نداره. چیکارش کنیم؟