Hallo,
ich benutze die RTC von einen STM32F103C8T6. Das Beispiel arbeitet mit
einer 1s basis, d.h. der Counter wird jede Sekunde um ein erhöht. Ich
möchte den jetzt so umkonfigurieren das der Counter jede Millisekunde um
ein erhöht wird. Ich habe versucht dieses zu erreichen, in dem Ich die
Zeile RTC_SetPrescaler(32767); zu RTC_SetPrescaler(32); geändert haben.
Dieses scheint aber nicht das gewünschte Ergenis gebracht zu haben.
Ist der Wert 32 Falsch oder muß nocht etwas anderes geändert werden?
Lass die RTC eine Uhr sein, die wie es sich gehört Sekunden zählt, und
verwende den Systick-Timer für die Millisekunde. Dafür ist der da.
Spätestens bei Migration auf neuere STM32 wirst du nämlich sonst
frustriert feststellen, dass deren RTC mit BCD-Darstellung arbeitet und
dir das ganze Konzept verhagelt.
Das hatte Ich mir vorher auch schon überlegt,
wie müßte man den dann Systick-Timer konfigureieren, wie der
Systick-Timer für Millisekunden konfiguriert werden muß ist klar,
aber wie mache Ich das dieser synchron zum RTC Counter läuft und auch
nur von 0-999 zählt?
Ich muß in diesen Projekt einen Intervall mit ms Auflösung und Startzeit
haben.
Sky12 schrieb:> aber wie mache Ich das dieser synchron zum RTC Counter läuft
Vorzugsweise überhaupt nicht. Wozu ist das nötig? Man kann aus
Milliksekunden auch Sekunden ableiten - ist weitaus einfacher als
andersrum. Diese Sekunden sind dann eben nicht ganz synchron zu den
Sekunden der RTC.
A. K. schrieb:>> aber wie mache Ich das dieser synchron zum RTC Counter läuft>> Vorzugsweise überhaupt nicht. Wozu ist das nötig? Man kann aus> Milliksekunden auch Sekunden ableiten - ist weitaus einfacher als> andersrum. Diese Sekunden sind dann eben nicht ganz synchron zu den> Sekunden der RTC.
Bei der Wahl interne RTC und interner Timer ist es wirklich egal, da
beide vom gleichen Oszillator geclockt werden und somit intern
"synchron" laufen und nicht gegeneinander driften.
Bei einer internen/externen RTC musst du den internen Timer auf den
internen/externen Sekunden-Interrupt synchronisieren, sprich bei
Interrupt den internen Timer einschalten und dann immer schön
nachziehen, wenn die RTC genauer ist und der Timer driften kann.
Grüße.
Welchen Sinn hat die Nutzung einer separaten RTC, die auf den Systemtakt
läuft, wenn man per Systick einen 1ms Takt erzeugt? Wenn Strom oder
Systemtakt weg, dann ist die auch weg.
A. K. schrieb:> Welchen Sinn hat die Nutzung einer separaten RTC, die auf den Systemtakt> läuft, wenn man per Systick einen 1ms Takt erzeugt? Wenn Strom oder> Systemtakt weg, dann ist die auch weg.
Z.B. Kalender und Alarm, wenn es nicht in Software sein soll. Übrigens
kann die RTC komplett in der Backup-Domain laufen, also nicht unbedingt
weg wenn keine VDD mehr da ist.
Grüße.
Kalle schrieb:> Z.B. Kalender und Alarm, wenn es nicht in Software sein soll.
Welcher Kalender? Die RTC der STM32F10x ist ein simpler binärer
Sekundenzähler. Da kalendert nix. Und der eine Vergleich für den
Alarm...
> Übrigens> kann die RTC komplett in der Backup-Domain laufen, also nicht unbedingt> weg wenn keine VDD mehr da ist.
Doch weg, wenn wie hier vom Systakt versorgt, denn der gehört nicht zur
Backup-Domain. Das meinte ich doch, dass die RTC primär mit separatem
Quarz Sinn ergibt, nicht so sehr ohne.
Ich habe das Problem gefunden, weshalb der RTC_SetPrescaler(32); nicht
funktionierte. Die Spannungsversorgung muß nach dem Programmieren einmal
komplett getrennt werden, dann läuft der Counter in der neuen
Geschwindigkeit.
Leider löse Ich damit das Problem nicht ganz zu meiner Zufriedenheit den
Ich benötige leider auch ein Datum.
Variante 1.
RTC mit Sekunden Taktung und Systick
Problem hier ist, es kann nicht direkt mit den RTC Counter gearbeitet
werden, d.h. nach erreicheren der Startzeit muß der Systick benutzt
werden. Dabei entsteht eine Ungenauigkeit beim wechsel von RTC- zum
Systick Counter, da der RTC-Counter dann nicht unbedingt 0ms hat.
Variante 2.
RTC mit Millisekunden Takten, voteil hierbei ist, das direkt mit den
RTC-Counter gearbeitet werden kann. Nachteil ist leider das der
RTC-Counter nur 32-Bit hat und zusammen mit Millisekunden dann kein
Datum gespeichert werden kann.
Bei beiden Varianten muß gebastelt werden, ich hatte gadacht das ich mir
genau das erspare, wenn ich einen Mikrocontroller mit Hardware RTC
nehme.
Da habe ich wohl geirrt.
@A. K.
Die Bezeichnung Calender aus dem Application Note ist wirklich nicht
besonders passend, aber ein Datum ist da drin, wenn im RTC-Counter die
Sekunden z.B. ab den Jahr 2000 gespeichert werden, dann läßt sich daraus
ein Datum berechnen.
Problematisch ist halt, das im 32-Bit RTC-Counter nicht genug Platz für
Millisekunden vorhanden ist. Es könnten maximal ca. 50 Tage in ms
gespeichert werden.
Sky12 schrieb:> Bei beiden Varianten muß gebastelt werden, ich hatte gadacht das ich mir> genau das erspare, wenn ich einen Mikrocontroller mit Hardware RTC> nehme.> Da habe ich wohl geirrt.
Hallo,
geirrt hast du wohl was die sogenannte RTC angeht (nachgeprüft habe ich
das nicht, aber so sind die Aussagen hier). Am besten ist dir geholfen
mit einer kompletten RTC mit Sek, Min, usw bis zum Jahr, und mit
Batterieversorgung. Da gibt es extern unzählige Versionen, eingebaut in
Prozessoren dagegen kaum. So eine RTC liefert dir auch ausgeschaltet
nach 2 Jahren noch korrekt Datum und Uhrzeit.
Allerdings haben die meisten keine ms, schon weil sie einen 32kHz-Quarz
haben. Das ist im Prinzip kein Problem, wenn man wirklich ms mit Bezug
zur Uhrzeit braucht (wofür eigentlich, so pünktlich muss keiner
aufstehen). Man stellt einfach mit jedem Sekundentakt der RTC einen
16bit-Wert auf 0 und zählt ihn mit dem 1 ms-Systemtimer hoch.
Gruss Reinhard