Forum: Mikrocontroller und Digitale Elektronik STM32F2xx RTC nach Setzen wieder auslesen liefert altes Datum


von Sonke A. (soeni)


Lesenswert?

Hallo,

ich habe folgendes Problem. Ich habe den STM32F217 und Setze die RTC mit 
einem Datum und einer Uhrzeit.
Anschließend lese ich beides aus. Die Uhrzeit wird sofort übernommen und 
beim anschließenden auslesen richtig angezeit.
Das Datum hingegen wird nicht deterministisch erst bei 10 mal auslesen 
oder nach 10-20 Sekunden richtig angezeit (So wie ich es vorher gesetzt 
hatte)

Ich nutze die Funktionen der ST Bibliothek.

Hier der Code zum Setzen der RTC
1
    RTC_TimeTypeDef rtcTimeStampStructure;
2
    RTC_DateTypeDef rtcTimeStampDateStructure;
3
4
    rtcTimeStampDateStructure.RTC_WeekDay   = 1;
5
    rtcTimeStampDateStructure.RTC_Year      = year - 2000;
6
    rtcTimeStampDateStructure.RTC_Month     = month;
7
    rtcTimeStampDateStructure.RTC_Date      = day;
8
9
    rtcTimeStampStructure.RTC_Hours         = hour;
10
    rtcTimeStampStructure.RTC_Minutes       = minute;
11
    rtcTimeStampStructure.RTC_Seconds       = second;
12
    rtcTimeStampStructure.RTC_H12           = RTC_H12_AM;
13
14
    // Configure the RTC time register
15
    if ( RTC_SetTime(RTC_Format_BIN, &rtcTimeStampStructure) == ERROR )
16
    {
17
        throw RtcIsNotSetableException();
18
    } else {
19
        RTC_WriteBackupRegister(RTC_BKP_DR0, 0x32F2);
20
    }
21
22
    // Configure the RTC date register
23
    if ( RTC_SetDate(RTC_Format_BIN, &rtcTimeStampDateStructure) == ERROR )
24
    {
25
        throw RtcIsNotSetableException();
26
    } else {
27
        RTC_WriteBackupRegister(RTC_BKP_DR0, 0x32F2);
28
    }

Hier der Code zum Lesen:
1
 RTC_TimeTypeDef rtcTimeStampStructure;
2
    RTC_DateTypeDef rtcTimeStampDateStructure;
3
4
    RTC_GetDate(RTC_Format_BIN,&rtcTimeStampDateStructure);
5
    RTC_GetTime(RTC_Format_BIN,&rtcTimeStampStructure);
6
7
    struct tm timeToSet; // TODO SP umbenennen
8
    timeToSet.tm_sec  = rtcTimeStampStructure.RTC_Seconds;
9
    timeToSet.tm_min  = rtcTimeStampStructure.RTC_Minutes;
10
    timeToSet.tm_hour = rtcTimeStampStructure.RTC_Hours;
11
    timeToSet.tm_mday = rtcTimeStampDateStructure.RTC_Date;
12
    timeToSet.tm_mon  = rtcTimeStampDateStructure.RTC_Month-1;
13
    timeToSet.tm_year = rtcTimeStampDateStructure.RTC_Year + 2000-1900;
14
15
    time_t timestamp = mktime(&timeToSet);
16
    ret = static_cast<long long>(timestamp);


Habt ihr eine Idee, warum das so ist? Bzw. wie man es beheben kann?

Gruß

von (prx) A. K. (prx)


Lesenswert?

Vielleicht hängt das hiermit zusammen: "In addition, writing to any RTC 
register is only enabled if the previous write operation is finished. To 
enable the software to detect this situation, the RTOFF status bit is 
provided in the RTC_CR register to indicate that an update of the 
registers is in progress. A new value can be written to the RTC 
registers only when the RTOFF status bit value is ’1’."

von Sonke A. (soeni)


Lesenswert?

Das Schreiben funktioniert ja. Lediglich das Lesen liefert noch ein Paar 
mal den alten Wert, bis dann der neue Wert gelesen wird.

Nach einem Reset steht im Übrigen immer der richtige Wert drinn. Mach 
ich nach dem Setzen ein Reset so funktioniert das lesen.

von (prx) A. K. (prx)


Lesenswert?

Dann solltest du mal direkt an die Hardware gehen, ohne die Lib zu 
verwenden. Schreibend wie lesend.

von Sonke A. (soeni)


Lesenswert?

NAch dem lesen der Zeit muss das RTC->DR Register zurüfckgesetzt werden

(void)RTC->DR;


(Für die, die das gleiche Problem haben)

von (prx) A. K. (prx)


Lesenswert?

Hat der 200er STM32 eine andere RTC als der 100er? Da gibts kein DR.

von Sonke A. (soeni)


Lesenswert?

Jep. Die 100er haben einen RealTime COUNTER und die 200er eine 
RealTimeClock

Gruß

von (prx) A. K. (prx)


Lesenswert?

Sonke A. schrieb:

> NAch dem lesen der Zeit muss das RTC->DR Register zurüfckgesetzt werden

Besser: Erst die Zeit und dann das Datum lesen, nicht andersrum wie 
oben. Lesen vom TR fixiert DR, damit das konsistent bleibt.

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.