Forum: Mikrocontroller und Digitale Elektronik interne RTC im STM32L benutzen?


von eagle user (Gast)


Lesenswert?

Servus!

laut Datenblatt brauchen die STM32L031, L051, L071,... einen externen 
32768Hz-Takt mit maximal 10 ns rise/fall time. Das ist doch 
vollkommen krank und unbenutzbar. Wenn da ein Quarz angeschlossen wird, 
muss der Eingang ja mit 10 us zurechtkommen. Die Eingangskapazität ist 
angeblich 0.6pF(!) obwohl die Oszillator-Pins ja auch als normale GPIO 
benutzt werden können - die wiederum eine Hysterese haben sollten.

Das fischelt doch ein wenig? Was verstehe ich hier nicht?

Weil man hier ja immer erklären soll, was man eigentlich vor hat: Das 
soll ein Wecker werden, da wäre die interne RTC ganz praktisch. Ein 
32kHz-Quarz mit 2 Cs am LSE ist mir von der Platine her zu 
schwierig/hochohmig (siehe z.B. [1] oder AN2867). Ein externer 
Oszillator wie OM-7604-C7, ASH7K,... liefert aber mit 50...100ns zu(?) 
lasche Flanken.

Also werde ich eine externe RTC verwenden oder wie? Oder vielleicht 
einen STM32L4? Bei denen steht nämlich im Datenblatt nichts von 
LSE-Anstiegszeiten, aber die gibt's nicht im Hand-lötbaren Gehäuse :(


[1] Beitrag "Richtige Quarzbeschaltung von RTC an STM Controllern"

von Jim M. (turboj)


Lesenswert?

eagle user schrieb:
> laut Datenblatt brauchen die STM32L031, L051, L071,... einen externen
> 32768Hz-Takt mit maximal 10 ns rise/fall time.

Mit anderen Worten: Da ist kein Schmidt-Trigger am Eingang, und das 
Signal muss innerhalb kürzester Zeit von 0 nach 1 gehen - sonst gibts 
böse Glitches. Das gilt aber nur wenn extern ein Rechteck als Takt 
anliegt.

Zwei Seiten weiter im DB sehen wir dann einen normalen Quarz, da ist 
dann offenbar eine etwas abgeänderte Schaltung aktiv - was wegen des 
eher analogen Quarzsignals ohnehin nötig ist.

von Stefan F. (Gast)


Lesenswert?

Funktioniert auf jeden Fall mit Quarz. Ich habe das mit einem Bluepill 
Board ausprobiert. Die Genauigkeit in unkalibriertem Zustand entspricht 
einer gewöhnlichen Uhr für Consumer im Low-Cost Segment.

Du musst aber die externen Pins am Modul entfernen, die zum Quarz 
führen.

von u8g2 (Gast)


Lesenswert?

Ich habe hier ein ähnliches Projekt: Bei mir funktionieren sowohl der 
Quarz als auch das externe Quarz Modul problemlos am STM32l031.

Hier übrigens mein Init-Code:

https://github.com/olikraus/u8g2/blob/master/sys/arm/stm32l031x6/clock/main.c#L462

Ich prüfe hier zunächst ob ein externes Taktmodul anliegt. Wenn nicht, 
dann versucht der Code den Quarz zu aktivieren.

Was ich übrigens am RTC des STM32L0 sehr schätze, sind die beiden TAMP 
Eingänge. An den TAMP Eingängen hängen die beiden Taster für den 
Benutzer, der damit den STM32L0 aus dem Deep Sleep Mode aufwecken kann. 
Der STM32L0 befindet sich 99% der Zeit im Deep Sleep, so dass der Wecker 
(XC9142, STM32L0, 128x64 OLED, Buzzer) seit 140 Tagen läuft: Die 
Spannung (2x AA) ist in dieser Zeit von 3,2 auf 2,8 Volt gesunken (OLED 
und Buzzer 1x pro Tag aktiv).

Oliver

von eagle user (Gast)


Lesenswert?

Stefan U. schrieb:
> Funktioniert auf jeden Fall mit Quarz. Ich habe das mit einem Bluepill
> Board ausprobiert. Die Genauigkeit in unkalibriertem Zustand entspricht
> einer gewöhnlichen Uhr für Consumer im Low-Cost Segment.

Wie gesagt, 32kHz-Quarze bzw. das Layout dafür sind mir zu kompliziert.

> Du musst aber die externen Pins am Modul entfernen, die zum Quarz
> führen.
???

Aber es kommt noch viel schlimmer. Die Reference Manuals für die 
STM32L0x1 und L0x2 sagen:
1
External source (LSE bypass)
2
In this mode, an external clock source must be provided. It can have a
3
frequency of up to 1 MHz. This mode is selected by setting the LSEBYP
4
and LSEON bits in the RCC_CSR (see Section 7.3.1). The external clock
5
signal (square, sinus or triangle) with ~50% duty cycle has to drive
6
the OSC32_IN pin while the OSC32_OUT pin should be left Hi-Z.

Sinus oder Dreieck mit 10ns, alles klar :(
Ich könnte den LSE als Oszillator laufen lassen, aber ohne Quarz, und 
stattdessen externe 32kHz einspeisen. Das scheint mir sicherer zu sein 
und sollte entweder gut oder garnicht funktionieren.


u8g2 schrieb:
> Ich habe hier ein ähnliches Projekt: Bei mir funktionieren sowohl der
> Quarz als auch das externe Quarz Modul problemlos am STM32l031.
> Hier übrigens mein Init-Code:

Danke, aber es ist ja ein Hardware-Problem. Wenn der Takt nicht sauber 
ist, rettet mich keine Software. Was für ein Quarz Modul und was für 
eine Platine verwendest du denn, wahrscheinlich eine eigene?

von Stefan F. (Gast)


Lesenswert?

> Du musst aber die externen Pins am Modul entfernen, die zum Quarz
> führen.
???

Will sagen: Wenn du ein Mikrocontroller Modul verwendest, wo man den 
32kHz Quarz auflöten kann, und diese Pins auch auf externe Stiftleisten 
herausgeführt sind, dann musst du die Stifte entfernen. Sie stören sonst 
die Schwingung.

Vielleicht wird das klar, wenn du dieses Bild siehst: 
http://stefanfrings.de/stm32/STM32F103C8T6_board.png

von u8g2 (Gast)


Angehängte Dateien:

Lesenswert?

eagle user schrieb:
> Danke, aber es ist ja ein Hardware-Problem. Wenn der Takt nicht sauber
> ist, rettet mich keine Software. Was für ein Quarz Modul und was für
> eine Platine verwendest du denn, wahrscheinlich eine eigene?

Bei dem Quarz Modul handelt es sich um folgendes (vom Distributor 
kopiert):

Manufacturer Part No:SG-3030JC 32.7680KB3:ROHS
Manufacturer: Epson Timing
Description: Standard Clock Oscillators 32.768KHz 1.5-5.5V 5+/-23ppm 
-40C +85C

Wie gesagt, bei mir haben sowohl das genannte Modul als auch ein 
Standard-Quarz mit 32,768KHz und den üblichen Kondensatoren problemlos 
funktioniert (Adapterplatine mit freier Verdrahtung, siehe Anhang).
Ich glaube wenn ich das Datenblatt ebenso gründlich gelesen hätte, wäre 
ich heute noch am grübeln, ob das klappt. Tatsächlich scheint mir der 
STM32L0 recht robust zu sein und so ziemlich alles was irgendwie nach 
Takt ausschaut zu akzeptieren.

Grüße,
Oliver

von eagle user (Gast)


Lesenswert?

Stefan U. schrieb:
> Will sagen: Wenn du ein Mikrocontroller Modul verwendest, wo man den
> 32kHz Quarz auflöten kann, und diese Pins auch auf externe Stiftleisten
> herausgeführt sind, dann musst du die Stifte entfernen.

Danke, dann ist das klar (Module gibt's ja ganz verschiedene).
"Modul" ist ein gutes Stichwort: kennt evt. jemand eins mit einem 
STM32L4xxC drauf? 'C' deshalb, weil 48 Pins leicht reichen und es sonst 
so groß wird.

u8g2 schrieb:
> Manufacturer Part No:SG-3030JC 32.7680KB3:ROHS
und
> STM32L031
witzig, das war auch meine erste Wahl. Da gibt es ca. 800 verschiedene 
STM32 und knapp 200 verschiedene 32kHz-Oszillatoren, aber für einen 
Wecker verwendet "jeder" diese beiden :)


Jeder? Nein, Quarze werden völlig überbewertet!
Für den Systemtakt nimmt man schon lange den internen Oszillator, warum 
nicht auch für die Uhr? Spart Strom, Platz und EMV-Stress.
1
LSI oscillator frequency drift:
2
STM32L031:   0°C to  85°C  -10% - 4%
3
STM32L433: -40°C to 125°C  29.5 - 34kHz

jeweils bei VDD = 1.62 to 3.6V, aber in Wirklichkeit habe ich geregelte 
3.3V (TPS70933 FTW!). Gegen den statischen Frequenzfehler helfen 
Prescaler plus "Smooth Calibration". Der Abgleich passiert bei einer 
bekannten Temperatur und im Betrieb wird die Temperatur kaum mehr als 3 
bis 5 Grad abweichen.

Der Frequenzfehler dürfte also unter 1% bleiben, das wären während einer 
Nacht weniger als 5 Minuten Weckzeit-Fehler -- soviel Zeit muss sein!

von W.S. (Gast)


Lesenswert?

eagle user schrieb:
> Für den Systemtakt nimmt man schon lange den internen Oszillator

Man?

Nee, du und diejenigen, die du kennst. Mach mal nen stabilen USB-VCP 
o.ä. mit nem unstabilisierten internen RC-Takt...

W.S.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

eagle user schrieb:
> Das
> soll ein Wecker werden, da wäre die interne RTC ganz praktisch.

Ich hab zuletzt den ABS07-120-32.768KHZ-T ( Farnell: 2467864 ) mit zwei 
2pF Cs verwendet und das läuft stabil, schwingt gut an und die Zeit 
stimmt auch.

Ansonsten kann ich die die Oscillator Design Guide für STM8 und STM32 
empfehlen.

Da stehen auch noch viele andere kompatible Typen drin:

http://www.st.com/content/ccc/resource/technical/document/application_note/c6/eb/5e/11/e3/69/43/eb/CD00221665.pdf/files/CD00221665.pdf/jcr:content/translations/en.CD00221665.pdf

von Mampf F. (mampf) Benutzerseite


Lesenswert?

u8g2 schrieb:
> der damit den STM32L0 aus dem Deep Sleep Mode aufwecken kann.

Dafür reicht doch der EXTI auch, oder nicht?

Zumindest hat das bei mir im Stop-Mode wunderbarst funktioniert und 
sowas wie Temper hab ich nicht benötigt.

Der EXTI ist ja so schön, weil man fast jeden GPIO als Wakeup-Source 
verwenden kann. An einem GPIO hatte ich einen Taster, am anderen quasi 
USB-5V zum Aufwecken, sobald USB angesteckt wird. Da lohnen sich die 
5V-toleranten Pins schon ;-)

Der Temper-GPIO ist eh elektrisch seltsam - vermeide ich immer zu 
verwenden ;-)

: Bearbeitet durch User
von Mampf F. (mampf) Benutzerseite


Lesenswert?

eagle user schrieb:
> Sinus oder Dreieck mit 10ns, alles klar :(
> Ich könnte den LSE als Oszillator laufen lassen, aber ohne Quarz, und
> stattdessen externe 32kHz einspeisen. Das scheint mir sicherer zu sein
> und sollte entweder gut oder garnicht funktionieren.

Ähm, du verrennst dich ja ganz schön ... Mach es einfach so, wie alle 
anderen, dann wird's schon funktionieren - pragmatischer Ansatz.

Btw, bei mir ist es ein STM32L162 und kein STM32L031 (oder so)^^

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

> Sinus oder Dreieck mit 10ns, alles klar :(

Schau Dir das Diagramm "Figure 21. Low-speed external clock source AC 
timing diagram" im Datenblatt an, sowie die Tabelle direkt darüber.

VLESH ist >= 0,7*VDD
VLESL ist <= 0,3*VDD

Der Bereich dazwischen sind die im Diagramm genannten 100%. Der Bereich 
zwischen 10% und 90% muss innerhalb von 10ns durchlaufen werden. Das 
sind bei 3,3V Versorgungsspannung konkret

Untere Schwelle = 0,3*3,3V*1,1 = 1,089V
Obere Schwelle = 0,7*3,3V*0,9 = 2,079V

Eine Halbwelle eines symmetrischen 32,768kHz Signals dauert ca. 30µs. 
Wenn der Pegel den Bereich von 0 bis 3,3V abdeckt, entfällt etwa ein 
drittel von Spannung und Zeit auf den Bereich, der maximal 10ns dauern 
darf. Ein Drittel von 30µs sind 10µs. Da liegen wir also im Faktor 1000 
daneben.

Nach dieser Überschlagsrechnung brauche ich auch gar nicht über ein 
Sinus Signal nachdenken, das würde auch nie im Leben passen.

Also muss das externe Taktsignal wohl zwangsläufig ein Rechteck-Signal 
sein. Und zwar ein schön steiles.

Man sollte aber auch zur Kenntnis nehmen, dass diese Anforderungen nur 
gelten, wenn man den Pin als Eingang für eine externe Taktquelle 
verwendet. Wenn man ihn als Oszillator verwendet, gelten diese 
Anforderungen nicht.

Einige Absätze weiter unten stehen die Bedingungen für "Low-speed 
external clock generated from a crystal/ceramic resonator". Und dort 
werden keine Anforderungen an die Flankensteilheit genannt.

Wenn du da also ein externes Sinus Signal anlegen möchtest, würde ich 
den Eingang einfach als Oszillator konfigurieren und dann 
zweckentfremden.

von eagle user (Gast)


Lesenswert?

W.S. schrieb:
> Mach mal nen stabilen USB-VCP
> o.ä. mit nem unstabilisierten internen RC-Takt...

ich dachte, dafür gibt's das Clock Recovery System.

Mampf F. schrieb:
> Ich hab zuletzt den ABS07-120-32.768KHZ-T ( Farnell: 2467864 ) mit zwei
> 2pF Cs verwendet
> Ansonsten kann ich die die Oscillator Design Guide für STM8 und STM32
> empfehlen.

Nachdem ich den zweimal gelesen habe, weiß ich, dass Quarzozillatoren 
nichts für mich sind.

Mampf F. schrieb:
> u8g2 schrieb:
>> der damit den STM32L0 aus dem Deep Sleep Mode aufwecken kann.
>
> Dafür reicht doch der EXTI auch, oder nicht?

Der EXTI reagiert ungefiltert auf Flanken, die Tamper-Eingänge haben 
digitale Filter.

Mampf F. schrieb:
> Ähm, du verrennst dich ja ganz schön ... Mach es einfach so, wie alle
> anderen, dann wird's schon funktionieren - pragmatischer Ansatz.

Wahrscheinlich, aber wenn nicht, gibt es extrem hässliche Fehler...

> Btw, bei mir ist es ein STM32L162 und kein STM32L031 (oder so)^^

Egal, der LSE hat die gleichen Daten.

Stefan U. schrieb:
> Eine Halbwelle eines symmetrischen 32,768kHz Signals dauert ca. 30µs.
> Wenn der Pegel den Bereich von 0 bis 3,3V abdeckt, entfällt etwa ein
> drittel von Spannung und Zeit auf den Bereich, der maximal 10ns dauern
> darf. Ein Drittel von 30µs sind 10µs. Da liegen wir also im Faktor 1000
> daneben.
>
> Nach dieser Überschlagsrechnung brauche ich auch gar nicht über ein
> Sinus Signal nachdenken, das würde auch nie im Leben passen.

Drum lasse ich mich nicht darauf ein, auch wenn das Reference Manual das 
Gegenteil behauptet. ST kommt mit diesen Eingängen nicht gut klar; aus 
den Errata zum L051:
1
The external clock selected in LSE bypass mode to drive
2
the OSC32_IN pin is no more effective in Standby mode.
3
No workaround available.
und beim HSE des L031:
1
Schmitt trigger hysteresis disabled on PH0 and PH1 inputs
2
When an I/O port is configured as an input, the Schmitt trigger input
3
should be activated. However, the Schmitt trigger hysteresis feature
4
is deactivated on PH0 and PH1, thus preventing them to filter noise
5
during I/O switching. Only LQFP48 package is impacted.
6
Workaround: None.

> Wenn du da also ein externes Sinus Signal anlegen möchtest,
> würde ich den Eingang einfach als Oszillator konfigurieren
> und dann zweckentfremden.

Sag' ich ja, das ist mein Plan B.
Aber Quarz-freie Uhren sind viel spannender :)

von Mampf F. (mampf) Benutzerseite


Lesenswert?

eagle user schrieb:
> Mampf F. schrieb:
>> Ähm, du verrennst dich ja ganz schön ... Mach es einfach so, wie alle
>> anderen, dann wird's schon funktionieren - pragmatischer Ansatz.
>
> Wahrscheinlich, aber wenn nicht, gibt es extrem hässliche Fehler...

Pedant, geh mal Risiken ein ???

Bestimmt sitzt du nur zuhause und traust dich nicht raus, weil es könnte 
dir ja was passieren xD

Ist nicht ernst gemeint :D

von Alex W. (Gast)


Lesenswert?

Stefan U. schrieb:
> Du musst aber die externen Pins am Modul entfernen, die zum Quarz
> führen.

Wegen den parasitären Kapazitäten der Leitungen?

von Stefan F. (Gast)


Lesenswert?

> Wegen den parasitären Kapazitäten der Leitungen?

Da bin ich unsicher. Die können eigentlich gar nicht so hoch sein - auf 
Lochraster.

Aber das haben hier zwei Leute geschrieben und ein paar Monate später 
hatte auch ich völlig falsche Schwing-Frequenz, solange die Pins dran 
waren.

von eagle user (Gast)


Lesenswert?

Stefan U. schrieb:
>> Wegen den parasitären Kapazitäten der Leitungen?
>
> Da bin ich unsicher. Die können eigentlich gar nicht so hoch sein - auf
> Lochraster.
>
> Aber das haben hier zwei Leute geschrieben und ein paar Monate später
> hatte auch ich völlig falsche Schwing-Frequenz, solange die Pins dran
> waren.

Genau solche Überraschungen erwarte ich bei so hochohmigen Schaltungen.

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.