اطلاعیه

Collapse
No announcement yet.

مشکل با واحد RTC ????

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل با واحد RTC ????

    سلام
    واحد RTC میکروی stm32f407 رو با کلاک خارجی 32.768 کیلوهرتز راه اندازی کردم و VBAT هم متصل هست
    مقداری را داخل رجیستر پشتیبان واحد ذخیره می کنم تا در حین خاموش روشن شدن میکرو بتوان این مقدار را خواند تا دیگر تنظیمات RTC به حالت ابتدایی برنگردد
    ولی این اتفاق نمی افته هر مقدار داخل رجیستر پشتیبان ذخیره شده و درست است ولی در خواندن مشکل دارد و مقدرا 0 رو بر می گردونه
    void rtc_intialize(void)
    {
    RTC_TimeTypeDef sTime = {0};
    RTC_DateTypeDef sDate = {0};

    /* USER CODE BEGIN RTC_Init 1 */

    /* USER CODE END RTC_Init 1 */
    /** Initialize RTC Only
    */
    hrtc.Instance = RTC;
    hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    hrtc.Init.AsynchPrediv = 127;
    hrtc.Init.SynchPrediv = 255;
    hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    if (HAL_RTC_Init(&hrtc) != HAL_OK)
    {
    Error_Handler();
    }

    /* USER CODE BEGIN Check_RTC_BKUP */

    /* USER CODE END Check_RTC_BKUP */

    /** Initialize RTC and set the Time and Date
    */
    sTime.Hours = 0x0;
    sTime.Minutes = 0x0;
    sTime.Seconds = 0x0;
    sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
    {
    Error_Handler();
    }
    sDate.WeekDay = RTC_WEEKDAY_MONDAY;
    sDate.Month = RTC_MONTH_JANUARY;
    sDate.Date = 0x25;
    sDate.Year = 0x20;

    if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
    {
    Error_Handler();
    }

    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0x1111);
    }

    داخل برنامه هم به این روش
    rtc_data=HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1);
    if(rtc_data!=0x1111)
    {
    rtc_intialize();
    }

    نمی دونم چرا درست کار نمی کنه ؟؟؟؟!!!!
    اللهم صل علی محمد و ال محمد و عجل فرجهم
    پیامبر اکرم(ص):زکات علم نشر آن است.
    در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

    #2
    پاسخ : مشکل با واحد RTC ????

    نوشته اصلی توسط seyed saeed نمایش پست ها
    سلام
    واحد RTC میکروی stm32f407 رو با کلاک خارجی 32.768 کیلوهرتز راه اندازی کردم و VBAT هم متصل هست
    مقداری را داخل رجیستر پشتیبان واحد ذخیره می کنم تا در حین خاموش روشن شدن میکرو بتوان این مقدار را خواند تا دیگر تنظیمات RTC به حالت ابتدایی برنگردد
    ولی این اتفاق نمی افته هر مقدار داخل رجیستر پشتیبان ذخیره شده و درست است ولی در خواندن مشکل دارد و مقدرا 0 رو بر می گردونه
    void rtc_intialize(void)
    {
    RTC_TimeTypeDef sTime = {0};
    RTC_DateTypeDef sDate = {0};

    /* USER CODE BEGIN RTC_Init 1 */

    /* USER CODE END RTC_Init 1 */
    /** Initialize RTC Only
    */
    hrtc.Instance = RTC;
    hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    hrtc.Init.AsynchPrediv = 127;
    hrtc.Init.SynchPrediv = 255;
    hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    if (HAL_RTC_Init(&hrtc) != HAL_OK)
    {
    Error_Handler();
    }

    /* USER CODE BEGIN Check_RTC_BKUP */

    /* USER CODE END Check_RTC_BKUP */

    /** Initialize RTC and set the Time and Date
    */
    sTime.Hours = 0x0;
    sTime.Minutes = 0x0;
    sTime.Seconds = 0x0;
    sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
    {
    Error_Handler();
    }
    sDate.WeekDay = RTC_WEEKDAY_MONDAY;
    sDate.Month = RTC_MONTH_JANUARY;
    sDate.Date = 0x25;
    sDate.Year = 0x20;

    if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
    {
    Error_Handler();
    }

    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0x1111);
    }

    داخل برنامه هم به این روش
    rtc_data=HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1);
    if(rtc_data!=0x1111)
    {
    rtc_intialize();
    }

    نمی دونم چرا درست کار نمی کنه ؟؟؟؟!!!!
    سلام
    منم قبلا همچین مشکی داشتم و آخرشم نفهمیدم دلیلش چیه. حتی از اسیلاتور داخلی هم استفاده کردم ولی فایده ای نداشت! به قول شما انگار داده داخل رجیستر ذخیره میشد ولی موقع خوندن خالی بود.
    از دوستان هرکس دلیلش رو میدونه لطف کنه بگه. ضمنا من از بورد کاتالیست eca استفاده میکردم.

    دیدگاه


      #3
      پاسخ : مشکل با واحد RTC ????

      نوشته اصلی توسط hossein.m98 نمایش پست ها
      سلام
      منم قبلا همچین مشکی داشتم و آخرشم نفهمیدم دلیلش چیه. حتی از اسیلاتور داخلی هم استفاده کردم ولی فایده ای نداشت! به قول شما انگار داده داخل رجیستر ذخیره میشد ولی موقع خوندن خالی بود.
      از دوستان هرکس دلیلش رو میدونه لطف کنه بگه. ضمنا من از بورد کاتالیست eca استفاده میکردم.
      سلام
      من چند بار رجیستر پشتیبان رو می خونم (به صورت پشت سر هم ) مقداری رو بر می گردونه که حتی نزدیک به مقدار من نیست
      سعی کردم در تعدادی از رجیستر های پشتیبان اعدادی رو ذخیره کنم ولی دیدم وقتی این کار رو می کنم فقط تو یکی از اون ها عدد ذخیره میشه اون کدوم هست اولین رجیستری که صداش می زدم
      نمی دونم نکته اش چیه
      البته تو تنظیمات cubemx دیدم که واحد مورد نظر رو بعد از 5000 میلی ثانیه فعال میکنه شاید دلیلش این باشه ؟؟؟؟!!!
      اللهم صل علی محمد و ال محمد و عجل فرجهم
      پیامبر اکرم(ص):زکات علم نشر آن است.
      در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

      دیدگاه


        #4
        پاسخ : مشکل با واحد RTC ????

        نوشته اصلی توسط hossein.m98 نمایش پست ها
        سلام
        منم قبلا همچین مشکی داشتم و آخرشم نفهمیدم دلیلش چیه. حتی از اسیلاتور داخلی هم استفاده کردم ولی فایده ای نداشت! به قول شما انگار داده داخل رجیستر ذخیره میشد ولی موقع خوندن خالی بود.
        از دوستان هرکس دلیلش رو میدونه لطف کنه بگه. ضمنا من از بورد کاتالیست eca استفاده میکردم.
        من ریز تر شدم ظاهرا مقدار رجیستر رو برنمی گردونه وقتی شما رجیستر مربوطه رو می خونید این اتفاق می افته
        uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister)
        {
        uint32_t tmp = 0U;

        /* Check the parameters */
        assert_param(IS_RTC_BKP(BackupRegister));

        tmp = (uint32_t)&(hrtc->Instance->BKP0R);
        tmp += (BackupRegister * 4U);

        /* Read the specified register */
        return (*(__IO uint32_t *)tmp);
        }

        در واقع آدرسش رجیستر رو بر می گردونه به جای مقدارش
        ولی تو مثالی که من دیدم خود مقدار رو بر می گردوند
        اللهم صل علی محمد و ال محمد و عجل فرجهم
        پیامبر اکرم(ص):زکات علم نشر آن است.
        در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

        دیدگاه


          #5
          پاسخ : مشکل با واحد RTC ????

          نوشته اصلی توسط seyed saeed نمایش پست ها
          من ریز تر شدم ظاهرا مقدار رجیستر رو برنمی گردونه وقتی شما رجیستر مربوطه رو می خونید این اتفاق می افته
          uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister)
          {
          uint32_t tmp = 0U;

          /* Check the parameters */
          assert_param(IS_RTC_BKP(BackupRegister));

          tmp = (uint32_t)&(hrtc->Instance->BKP0R);
          tmp += (BackupRegister * 4U);

          /* Read the specified register */
          return (*(__IO uint32_t *)tmp);
          }

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

          دیدگاه


            #6
            پاسخ : مشکل با واحد RTC ????

            نوشته اصلی توسط hossein.m98 نمایش پست ها
            والا یادمه با دیباگر keil بررسی اش کردم، مقدار رجیسترهای مربوط به ساعت و زمانش تغییری نمیکرد. من چون کاری با رجیسترهای پشتیبان نداشتم تا حالا، این رجیسترها رو بررسی نکردم متاسفانه. ولی به نظر میرسه قسمت rtc این میکروکنترلرها ایراد داره چون چند جای دیگه هم دیدم که گفتن با rtc این میکروکنترلرها مشکل دارن.
            درستش کردم توضیحات در پایین

            تابع init واحد RTC رو تغییر دادم و الان زمان و تاریخ در صورت خاموش بودن میکرو به کار خودشون ادامه میدن
            void rtc_intialize(void)
            {
            RTC_TimeTypeDef sTime = {0};
            RTC_DateTypeDef sDate = {0};

            /* USER CODE BEGIN RTC_Init 1 */

            /* USER CODE END RTC_Init 1 */
            /** Initialize RTC Only
            */
            hrtc.Instance = RTC;
            hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
            hrtc.Init.AsynchPrediv = 127;
            hrtc.Init.SynchPrediv = 255;
            hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
            hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
            hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
            if (HAL_RTC_Init(&hrtc) != HAL_OK)
            {
            Error_Handler();
            }

            /* USER CODE BEGIN Check_RTC_BKUP */

            /* USER CODE END Check_RTC_BKUP */

            /** Initialize RTC and set the Time and Date
            */
            rtc_data=RTC->BKP1R;
            if(rtc_data!=0x3333)
            {
            sTime.Hours = 0x0;
            sTime.Minutes = 0x0;
            sTime.Seconds = 0x0;
            sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
            sTime.StoreOperation = RTC_STOREOPERATION_RESET;
            if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
            {
            Error_Handler();
            }
            sDate.WeekDay = RTC_WEEKDAY_MONDAY;
            sDate.Month = RTC_MONTH_JANUARY;
            sDate.Date = 0x25;
            sDate.Year = 0x20;

            if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
            {
            Error_Handler();
            }
            }

            HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0x3333);
            }

            در ضمن برای خواندن رجیستر پشتیبان هم از توابع هال استفاده نکردم اگر دقت کنید اون یک بخش رو رجیستری نوشتم
            rtc_data=RTC->BKP1R;
            جدیدترین ویرایش توسط seyed saeed; ۰۸:۵۶ ۱۳۹۹/۰۲/۲۲.
            اللهم صل علی محمد و ال محمد و عجل فرجهم
            پیامبر اکرم(ص):زکات علم نشر آن است.
            در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

            دیدگاه


              #7
              پاسخ : مشکل با واحد RTC ????

              سلام.
              شاید این سمپل بتونه بهتون کمک کنه .این سمپل برای میکرو سری STM32H7XX هستش.
              دانلود کنید.

              دیدگاه


                #8
                پاسخ : مشکل با واحد RTC ????

                نوشته اصلی توسط MM320 نمایش پست ها
                سلام.
                شاید این سمپل بتونه بهتون کمک کنه .این سمپل برای میکرو سری STM32H7XX هستش.
                دانلود کنید.
                خیلی ممنون
                در پست قبلی توضیح دادم که مشکل رو چه طور حل کردم
                اللهم صل علی محمد و ال محمد و عجل فرجهم
                پیامبر اکرم(ص):زکات علم نشر آن است.
                در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

                دیدگاه

                لطفا صبر کنید...
                X