Forum: Mikrocontroller und Digitale Elektronik LSERDY wird nicht ready - STM32F407 LSE Clock


von Christoph K. (chriskuku)


Lesenswert?

Habe folgenden Assemblercode:
1
@ clock configuration word to be loaded into RCC_BDCR register
2
.set   RTCCONF, RTCEN << 15 | RTCSEL << 8 | LSEON
3
@-----------------------------------------------------------------------
4
@ enable RTC clock
5
@-----------------------------------------------------------------------
6
  ldr  r0, = RTCCONF  @ init backup domain control register
7
  str  r0, [r6, #RCC_BDCR]  @ r6 has RCC base address
8
@
9
10
@ wait until LSE oscillator ready
11
5:     ldr     r0, [r6, #RCC_BDCR]
12
       tst     r0, #0x02               @ LSERDY set?
13
       beq     5b
14
15
16
------
17
18
r0  0x8101 (Hex)    
19
r1  0x0 (Hex)    
20
r2  0x1 (Hex)    
21
r3  0x10000004 (Hex)    
22
r4  0x24c (Hex)    
23
r5  0x40007000 (Hex)    
24
r6  0x40023800 (Hex)

Das DBP-bit im PWR Register ist gesetzt:

@ Power configuration word to be loaded into PWR_CR register
.set    PWRCONF,        VOS << 14 | DBP << 8

Das Programm loopt.

: Bearbeitet durch User
von weiter weg (Gast)


Lesenswert?

Danke dass du uns an deinen Unternehmungen teilhaben lässt.

Deinem Bericht nach zu urteilen hast du keine Fragen dazu.
Dann kann hier ja geschlossen werden.

von Christoph K. (chriskuku)


Lesenswert?

weiter weg schrieb:
> Danke dass du uns an deinen Unternehmungen teilhaben lässt.
>
> Deinem Bericht nach zu urteilen hast du keine Fragen dazu.
> Dann kann hier ja geschlossen werden.

Willst Du hier nur stänkern? "das Programm loopt" ist doch Frage genug, 
oder?

von PittyJ (Gast)


Lesenswert?

Also ich verstehe das Fragment auch nicht so ganz.

Was soll da passieren, was sind die Erwartungen? Vielleicht ist ja alles 
total korrekt, und dein Verständnis passt nicht zum Registersatz?

Was haben die Register r1..r5 damit zu tun?

von Achim M. (minifloat)


Lesenswert?

LSERDY = Low Speed (Oscillator) External Ready? Kann es sein dass da was 
an Beschaltung extern fehlt, nicht funktioniert oder irgendwelche Pins 
(noch) falsch konfiguriert sind?

mfg mf

von Jim M. (turboj)


Lesenswert?

Die modernen µC haben komplexen Clock Tree, bist Du sicher dass da der 
Bus Takt am Peripherial ankommt?

von Christoph K. (chriskuku)


Lesenswert?

Jim M. schrieb:
> Die modernen µC haben komplexen Clock Tree, bist Du sicher dass da der
> Bus Takt am Peripherial ankommt?

SYSCLK ist 168 MHz und mit PLL richtig konfiguriert. Das System 
funktioniert im großen und ganzen. Ich wollte jetzt nur die LSE-Clock 
statt der internen RTC-Clock einschalten, weil der Chip eine externe 
Beschaltung mit 32KHz Quarz hat.

Die Register hatte ich nur deshalb zitiert, weil r0 und r6 im Code 
vorkommen zur Kontrolle, daß die richtigen Werte benutzt werden. Das war 
Cut/Paste aus dem Debugger (STM32CubeIDE)

Andere Stellen, wo so eine Warteschleife gemacht wird, kommen auch vor, 
weshalb ich mich eben wundere, warum diese gerade nicht funktioniert.
1
@-----------------------------------------------------------------------
2
@ wait until clock source effective
3
@-----------------------------------------------------------------------
4
4:  ldr  r0, [r6, #RCC_CFGR]  @ r6 has RCC base address
5
    tst  r0, #0x08    @ SWS = PLL?
6
    beq  4b

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Christoph K. schrieb:
> .set   RTCCONF, RTCEN << 15 | RTCSEL << 8 | LSEON

Damit das funktioniert, müssten RTCEN bis LSEON alle drei = 1 sein. Sehr 
ungewöhnlich...
Normal würde ich da sowas erwarten:
.set   RTCCONF, RTCEN | RTCSEL | LSEON

Oder was man hier im Forum öfter sieht:
.set   RTCCONF, 1 << RTCEN | 1 << RTCSEL | 1 << LSEON

von Christoph K. (chriskuku)


Lesenswert?

Bauform B. schrieb:
> Christoph K. schrieb:
>> .set   RTCCONF, RTCEN << 15 | RTCSEL << 8 | LSEON
>
> Damit das funktioniert, müssten RTCEN bis LSEON alle drei = 1 sein. Sehr
> ungewöhnlich...
> Normal würde ich da sowas erwarten:
> .set   RTCCONF, RTCEN | RTCSEL | LSEON
>
> Oder was man hier im Forum öfter sieht:
> .set   RTCCONF, 1 << RTCEN | 1 << RTCSEL | 1 << LSEON

Das ist schon OK:
1
.if    LSE_fitted
2
.set   LSEON, 1                        @ enable LSE oscillator
3
.set   RTCSEL, 1                       @ select LSE as RTC clock source
4
.set   RTCPRE, 0                       @ RTC clock prescaler off
5
.else
6
.set   LSEON, 0                        @ disable LSE oscillator
7
.set   RTCSEL, 3                       @ select HSE as RTC clock source
8
.set   RTCPRE, HSECLK / 1000000        @ RTC clock must be 1 MHz
9
.endif
10
.set   RTCEN, 1                        @ enable RTC clock


Aber ich habe gerade festgestellt, daß die Loop nicht mehr besteht. Kann 
es mir im Moment nicht erklären. Danke für's Mitdenken erst mal.

: Bearbeitet durch User
von Achim M. (minifloat)


Lesenswert?

Christoph K. schrieb:
> Aber ich habe gerade festgestellt, daß die Loop nicht mehr besteht.

D.h. der 32kHz-Quarz schwingt jetzt schnell an? Die können gerne auch 
Mal ne Sekunde brauchen bis sie los gehen.
Wenn du jetzt über einen Reset huscht und der 32kHz noch nachschwingt, 
wird er auch schneller wieder los gehen.

Es gibt da einen Design Guide von ST:
https://www.st.com/resource/en/application_note/cd00221665-oscillator-design-guide-for-stm8afals-stm32-mcus-and-mpus-stmicroelectronics.pdf

mfg mf

von Bauform B. (bauformb)


Lesenswert?


von Christoph K. (chriskuku)


Lesenswert?

Bauform B. schrieb:
> STM hat auch eine eigene:
> 
https://www.st.com/resource/en/application_note/cd00221665-oscillator-design-guide-for-stm8af-al-s-stm32-mcus-and-mpus-stmicroelectronics.pdf
>
> oder Freescale:
> https://www.nxp.com/docs/en/application-note/AN2606.pdf
>
> und wenn du die alle gelesen hast, baust du nie wieder einen 32kHz-Quarz
> ein ;)

Ach, interessant, daß es da tatsächlich Probleme geben kann. Dann baue 
ich besser den 32KHz aus dem DIYMORE-Board aus. Vielleicht hatte der 
Autor (†) des Codes nicht ohne Grund den LF-Quarz auf dem DISCO-Board 
disabled.
Die Code-Passage in seinem Programm war ja auskonditioniert. Ich dachte, 
ich enable sie einfach mal, weil ich ja den Quarz habe.

von Achim M. (minifloat)


Lesenswert?

Christoph K. schrieb:
> Ach, interessant, daß es da tatsächlich Probleme geben kann. Dann baue
> ich besser den 32KHz aus dem DIYMORE-Board aus

Du kannst ja einen MEMS-Oszillator verwenden, die kommen fertig 
abgeglichen sind recht stabil.

Aber wenn du den so einfach raus kicken kannst, warum war der dann 
überhaupt drin?

mfg mf

von Christoph K. (chriskuku)


Lesenswert?

Achim M. schrieb:
> Christoph K. schrieb:
>> Ach, interessant, daß es da tatsächlich Probleme geben kann. Dann baue
>> ich besser den 32KHz aus dem DIYMORE-Board aus
>
> Du kannst ja einen MEMS-Oszillator verwenden, die kommen fertig
> abgeglichen sind recht stabil.
>
> Aber wenn du den so einfach raus kicken kannst, warum war der dann
> überhaupt drin?
>
> mfg mf

Der ist von Hause aus drin. Der Original-Code wurde für das 
Discovery-Board zugeschnitten. Ich versuche ihn auf dem DIYMORE zum 
Laufen zu bringen.

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.