Stm32f401 RTC problemi

Başlatan yamak, 03 Mart 2015, 08:32:33

yamak

Stm32f401'de RTC biriminde şöyle bir sorunla karşı karşıyayım:
Time ı sorunsuz bir şekilde okuyabilirken date okumaya çalıştığımda gün dönümlerin doğru sonucu alamıyorum.Örneği saat 23:59:59 tarih de 03/03/15 olsun.1 saniye sonra saat 00:00:00 oluyor fakat tarih 03/03/15 te kalıyo ancak bir kaç saniye sonra (hatta bu 20-30 saniyeye bulabiliyor) doğru tarihi okuyabiliyorum.Fakat asıl problem şu: RTC nin date register'ları gayet güzel çalışıyor,yani registerlar doğru değeri gösteriyor,fakat ben okuduğumda eski değeri okuyorum.
Disassembly'de compiler RTC->DR registerını R1 registerına okuyo.R1 i registerını da gözlemlediğimde yine yanlış sonucu okuduğunu görüyorum.Yani temel sorun CPU RTC-DR registerındaki değeri yanlış okuyo.Böyle bi sorunla karşılaşan oldu mu?St nin forumlarında RTC ile problem yaşayan başkalarını da gördüm.Fakat böyle bi soruna rastlayamadım.Chip in bi bug ı mı bu yoksa bi yerde yanlış yapıyorum.Init kodlarım ve get date kodum aşağıda:
RTC Init:
  
  RTC_InitTypeDef RTC_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
  PWR_BackupAccessCmd(ENABLE);
  RCC_LSEConfig(RCC_LSE_ON);
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)
  {
    
  }
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
  RCC_RTCCLKCmd(ENABLE);
  RTC_WaitForSynchro();
  RTC_InitStructure.RTC_AsynchPrediv=0x7F;/* ck_spre(1Hz) = RTCCLK(LSE) /(uwAsynchPrediv + 1)*(uwSynchPrediv + 1)*/
  RTC_InitStructure.RTC_SynchPrediv=0xFF;
  RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
  RTC_Init(&RTC_InitStructure);

Get date:
void vBO_RTC_GetDate(BO_RTC_DateStruct* date)
{
  RTC_DateTypeDef RTC_DateStructure;
  RTC_GetDate(RTC_Format_BIN,&RTC_DateStructure);
  date->Month=RTC_DateStructure.RTC_Month;
  date->MonthDay=RTC_DateStructure.RTC_Date;
  date->WeekDay=RTC_DateStructure.RTC_WeekDay;
  date->Year=RTC_DateStructure.RTC_Year;
}


Std periph lib de mi bi sorun var acaba diye şüphelenip fonksiyonları kendim yazdığımda da aynı sorunla karşılaştım.Daha önce 407'de kullanmıştım RTC yi ama böyle bi sorunla karşılaşmamıştım.

izturk

#1
Eski bir konu yenisini açmak istemedim. Ben de benzer problemi yaşıyorum. stm32f401rct

saati okumaya çalıştığımda ilk okunan değer kalıyor. dakika hiç artmıyor.
elektriği kesip verdiğimde saat yeni doğru değerini alıyor. yani saat normalde çalışıyor ama ben okuyamıyorum.

debug yaptığımda herşey normal çalışıyor.

static void MX_RTC_Init(void)
{

  RTC_TimeTypeDef sTime;
  RTC_DateTypeDef sDate;

    /**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(__FILE__, __LINE__);
  }

    /**Initialize RTC and set the Time and Date 
    */
  if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2){
  sTime.Hours = 18;
  sTime.Minutes = 18;
  sTime.Seconds = 0;
  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  sTime.StoreOperation = RTC_STOREOPERATION_SET;
  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sDate.WeekDay = RTC_WEEKDAY_SATURDAY;
  sDate.Month = RTC_MONTH_MARCH;
  sDate.Date = 21;
  sDate.Year = 20;

  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2);
  }

}
cube mx in üretiiği ayar kodları

void saat_goster(void)
{
 char zaman[6];
 HAL_RTC_GetTime(&hrtc, &sTime , RTC_FORMAT_BIN);
 dakika = sTime.Minutes;
 saat = sTime.Hours;
 
 
 if(dakika_eski != dakika)
 {
 glcd_box(110,118,155,125,0);
 dakika_eski=dakika;
 if(dakika>=10&&saat>=10)sprintf(zaman,"%d:%d",saat,dakika);
 if(dakika<10&&saat>=10)sprintf(zaman,"%d:0%d",saat,dakika);
 if(dakika>=10&&saat<10)sprintf(zaman,"0%d:%d",saat,dakika);
 if(dakika<10&&saat<10)sprintf(zaman,"0%d:0%d",saat,dakika);
 glcd_text57(110,118,zaman,1,1);
 }
}
bu da benim okuma yaptığım kod

izturk

Güncel, hala bi çözüm bulamadım
Ustalar bi el atsa da kaldırsak

serkan

Bu şekil denedinizmi?

void saat_goster(void)
{
 char zaman[20];
 HAL_RTC_GetTime(&hrtc, &sTime , RTC_FORMAT_BIN);
 dakika = sTime.Minutes;
 saat = sTime.Hours;
 
sprintf(zaman,"%02d:%02d",saat,dakika);
 glcd_text57(110,118,zaman,1,1);

}

8051-ARM

Merhaba örnekte sadece saati okumuşsunuz birde şöyle deneyin önce saati hemen ardından tarihi okuyun ekrana basma işlemini sonra gerçekleştirin.

HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
/* Ekrana Bas*/

izturk

Alıntı yapılan: serkan - 24 Mart 2020, 12:09:47Bu şekil denedinizmi?

void saat_goster(void)
{
 char zaman[20];
 HAL_RTC_GetTime(&hrtc, &sTime , RTC_FORMAT_BIN);
 dakika = sTime.Minutes;
 saat = sTime.Hours;
 
sprintf(zaman,"%02d:%02d",saat,dakika);
 glcd_text57(110,118,zaman,1,1);

}

serkan hocam dediğiniz gibi denedim çalışmadı.
Alıntı yapılan: 8051-ARM - 24 Mart 2020, 22:35:00Merhaba örnekte sadece saati okumuşsunuz birde şöyle deneyin önce saati hemen ardından tarihi okuyun ekrana basma işlemini sonra gerçekleştirin.

HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
/* Ekrana Bas*/

8051-ARM hocam tarihi de okutup ekrana basınca düzeldi

cevaplar için teşekkür ederim.