10 Nisan 2020, 12:22:33

Haberler:

Picproje Pazar Sohbetleri: https://bit.ly/2GHsjAK


Stm32f401 RTC problemi

Başlatan yamak, 03 Mart 2015, 11: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_DateStructdate)
{
  
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

22 Mart 2020, 14:57:49 #1 Son düzenlenme: 22 Mart 2020, 14:59:54 izturk
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(&hrtcRTC_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, &sTimeRTC_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, &sDateRTC_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);

}
İlim ve fennin haricinde mürşit aramak gaflettir, cehalettir, dalalettir.

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, &sTimeRTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDateRTC_FORMAT_BIN);
/* Ekrana Bas*/

izturk

Alıntı yapılan: serkan - 24 Mart 2020, 15: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 - 25 Mart 2020, 01: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, &sTimeRTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDateRTC_FORMAT_BIN);
/* Ekrana Bas*/

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

cevaplar için teşekkür ederim.