STM32F4 RTC tickt falsch

Gast #3107116
Lesenswert?

Hallo Zusammen
Ich habe ein STM32F4Discovery board und habe die RTC initialisiert mit 
externen Quarz. IDE CooCox. Eigentlich solten nach 59 Sekunden die 
Minuten um 1 erhöt werden, leider Zählt er bis 99 und erhöht dann erst.
Ist mir völlig unklar warum. Kann mir da jemand helfen?.
Gruß Nilix

Code:
//===================================================================
//
//===================================================================
void Init_RTC(void)
{
RTC_InitTypeDef  RTC_InitStructure;

///System Clock aktivieren
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);

//Zugriff RTC erlaubn
PWR_BackupAccessCmd(ENABLE);

//Rücksetzen RTC Domain
RCC_BackupResetCmd(ENABLE);
RCC_BackupResetCmd(DISABLE);

//Aktiviere  Oszilator
// RCC_LSICmd(ENABLE);
RCC_LSEConfig(RCC_LSE_ON);

//Warten bis LSE Fertig
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)  { } 
//RCC_FLAG_LSERDY RCC_FLAG_LSIRDY

//Taktquelle auswählen
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);  //RCC_RTCCLKSource_LSE 
RCC_RTCCLKSource_LSI

// Warten auf RTC APB registers synchronisation
RTC_WaitForSynchro();

//Datenregister und Prescaler einstellen
//Predcaler ck_spe =RTCCLK / ((PREDIV_A+1)*(PREDIV_S+1))
//RTCCLK        PREDIV_A  PREDIV_S  ck_spe
//HSE_RTC 1MHZ    124      7999    1Hz
//LSE = 32,768kHz  127      249      1Hz
//LSI = 32 kHz    127      249      1Hz
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
RTC_InitStructure.RTC_SynchPrediv  = 0xFF;    /* (32KHz / 128) - 1 = 
0xFF*/
RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;
RTC_Init(&RTC_InitStructure);

//Aktivieren
RCC_RTCCLKCmd(ENABLE);
}

//===================================================================
// SetTime_RTC(20,31,00);  20:31:00
//===================================================================
void SetTime_RTC(int Hour,int Min,int Sec)
{
RTC_TimeTypeDef  RTC_TimeStruct;

// Uhrzeit Stellen  00h 00mn 00s
RTC_TimeStruct.RTC_H12     = RTC_H12_AM;
RTC_TimeStruct.RTC_Hours   = Hour;
RTC_TimeStruct.RTC_Minutes = Min;
RTC_TimeStruct.RTC_Seconds = Sec;
RTC_SetTime(RTC_Format_BCD, &RTC_TimeStruct);

}

//===================================================================
//
//===================================================================
void GetTime_RTC(char *buffer)
{
RTC_TimeTypeDef  RTC_TimeStruct;

RTC_GetTime(RTC_Format_BCD, &RTC_TimeStruct );

sprintf(buffer, "%02u:%02u:%02u", 
RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_S 
econds);

}
Gast #3771784
Lesenswert?

2 kleine Fehler in der INIT (LSI Paramter auskommentiert und 
RCC_RTCCLKCmd(ENABLE); vor RTC_WaitForSynchro(); gesetzt):


void Init_RTC(void)
  RTC_InitTypeDef  RTC_InitStructure;

  ///System Clock aktivieren
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

  //Zugriff RTC erlaubn
  PWR_BackupAccessCmd(ENABLE);

  //Rücksetzen RTC Domain
  RCC_BackupResetCmd(ENABLE);
  RCC_BackupResetCmd(DISABLE);

  //Aktiviere  Oszilator
  RCC_LSICmd(ENABLE);
  //RCC_LSEConfig(RCC_LSE_ON);

  //Warten bis LSE Fertig
  while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)  { }
  //RCC_FLAG_LSERDY RCC_FLAG_LSIRDY

  //Taktquelle auswählen
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);  //RCC_RTCCLKSource_LSE
  //RCC_RTCCLKSource_LSI

  //Aktivieren
  RCC_RTCCLKCmd(ENABLE);

  // Warten auf RTC APB registers synchronisation
  RTC_WaitForSynchro();

  //Datenregister und Prescaler einstellen
  //Predcaler ck_spe =RTCCLK / ((PREDIV_A+1)*(PREDIV_S+1))
  //RTCCLK        PREDIV_A  PREDIV_S  ck_spe
  //HSE_RTC 1MHZ    124      7999    1Hz
  //LSE = 32,768kHz  127      249      1Hz
  //LSI = 32 kHz    127      249      1Hz
  RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
  RTC_InitStructure.RTC_SynchPrediv  = 0xFF;    /* (32KHz / 128) - 1 = 
0xFF*/
  RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;
  RTC_Init(&RTC_InitStructure);

}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren