Hallo,
Ich stehe heut wieder mal wie der Ochs' vorm Berg und finde den Fehler
nicht. Dabei ist es eigentlich eine einfache Sache. Als Controller
verwende ich STM32F100RB / RC (bei beiden geht es nicht):
Um die RTC einzurichten muss man
- Das INIT bit im ISR-Register setzen
- Auf das INITF bit im ISR-Register warten
- ...
(AN 3371 Rev 4 Seite 7 sowie RM0038 Rev 12 Seite 511)
Eigentlich eine einfache Anweisung, funktioniert aber nicht; das INITF
bit kommt einfach nicht, egal was ich tue. Das einzige, was ich bis
jetzt nicht probiert habe, wäre einen Uhrenquarz dranzulöten, es muss
aber auch mit dem HSE laufen.
| timestamp->wday << 13 //always < 10, so BCD == BIN
60
| byte_to_bcd(timestamp->month) << 8
61
| byte_to_bcd(timestamp->day);
62
RTC->TR = byte_to_bcd(timestamp->hour) << 16
63
| byte_to_bcd(timestamp->minute) << 8
64
| byte_to_bcd(timestamp->second);
65
}
ST macht in ihrem Code (RTC_EnterInitMode) im Prinzip das gleiche (und
der Aufruf der Funktion funktioniert bei mir auch nicht - als ob es die
RTC nicht gäbe, dabei sind die Register da und ich bilde mir ein, sie
schonmal mit 8facher Geschwindigkeit laufen gesehen zu haben...)
In einem zweiten Schritt habe ich mal mein STM32L100 discovery board
geschnappt, dort X3 samt Brücken und Lastkapazitäten bestückt
http://www.st.com/web/catalog/tools/PF259096
ein komplett neues Projekt aufgemacht, (EM-Blocks, siehe Anhang)
und den democode von ST probiert, sowohl mit LSI als auch mit LSE
Ergebnis: trommelwirbel funktioniert NICHT :(
Edith: Der LSE funktioniert natürlich, ich komm beim debuggen über die
Schleife drüber. Er hängt wie gehabt im RTC_EnterInitMode in der SPL,
bzw. verlässt diese mit ERROR, da das INITF-Flag nicht gesetzt wird.
Fehler gefunden!
Die RTC muss eingeschaltet werden, bevor der InitMode benutzt werden
kann
also direkt nach der Clock config muss ausgeführt werden:
RCC_RTCCLKCmd(ENABLE);
Das taucht weder im Reference Manual, noch in der Application Note von
ST auf, in den Examples der SPL ist es auch falsch.
So muss es aussehen:
Stimmt, beim ARM ist es völlig unnormal, ein Peripheral einzuschalten
und mit Takt zu versorgen. Da ist RTC eine totale Ausnahme. Alles andere
hat 7 Gang Automatik. :-( :-( :-(
le compileur schrieb:> Stimmt, beim ARM ist es völlig unnormal, ein Peripheral> einzuschalten> und mit Takt zu versorgen. Da ist RTC eine totale Ausnahme. Alles andere> hat 7 Gang Automatik. :-( :-( :-(
Deiner unterschwelligen Ironie zum trotz möchte ich einmal entgegnen,
dass der normale Ablauf ist: Clock einschalten (Siehe erste Zeile, PWR
peripheral kriegt APB1 Clock), Peripheral initialisieren, Peripheral
anschalten.
Bei der RTC ists halt anders rum: Peripheral einschalten, Peripheral
initialisieren.
Genau genommen ist es natürlich logisch, dass er den Init Mode erst
erreicht, wenn im Hintergrund schon die asynchrone RTC clock läuft
(nicht nur die PWR clock)