Forum: Mikrocontroller und Digitale Elektronik STM32F4 RTC tickt falsch


von Nilix (Gast)


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);

}

von Nilix (Gast)


Lesenswert?

Ich habs gefunden.
Setzen und lesen der Uhrzeit im Hexadezimal format.

von Felix (Gast)


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);

}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.