Forum: Mikrocontroller und Digitale Elektronik STM32F407 mit CMOS anstatt Crystal OSC - Programmanpassung


von GB (Gast)


Lesenswert?

Hallo zusammen,
ich habe da ein Problem bei dem ich etwas Hilfe benötige.
Und zwar habe ich eine Steuerungsplatine für eine Kamera die als uC 
einen STM32F407 verwendet. Als Referenztimer ist dort ein 
"konventioneller" Quarz  mit 8Mhz verbaut (Angeschlossen an OSC In und 
Out, sprich als HSE) mit entsprechendem Programmcode für den uC.
Nun gibt es eine neuere Version der Platine bei der anstatt eines 
Crystals OSC ein CMOS OSC (CO2520-8.000-33-50-X, ebenfalls 8Mhz als HSE) 
verwendet wird. Angenommen Hardwareseitig ist alles richtig, wovon ich 
momentan ausgehe. Was muss am Programm angepasst werden dass der uC mit 
dem CMOS läuft? Die Frequenz bleibt dabei identisch.

Im Inet finde ich leider nichts mehr was mir weiter hilft. Auch mit dem 
Handbuch und im Referenz-Manual des uC komme ich nicht weiter.

Über einen Hinweis würde ich mich sehr freuen!
Ich danke euch vielmals!

Gruß GB

von Dr. Sommer (Gast)


Lesenswert?

GB schrieb:
> Auch mit dem
> Handbuch und im Referenz-Manual des uC komme ich nicht weiter.

Auch nicht wenn du Kapitel "7.2.1 External source (HSE bypass)", S. 218, 
im Reference Manual liest?

von m.n. (Gast)


Lesenswert?

Laß das Programm so, wie es ist, und lege den ext. Takt an PH0.

von Dr. Sommer (Gast)


Lesenswert?

m.n. schrieb:
> Laß das Programm so, wie es ist, und lege den ext. Takt an PH0.
Das ist aber falsch, es muss das Bypass-Bit gesetzt werden. Ich könnte 
mir vorstellen dass da sonst die im STM32 integrierte 
Oszillatorschaltung Schaden nehmen könnte (zu hohe Spannung).

von m.n. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Das ist aber falsch, es muss das Bypass-Bit gesetzt werden.

Ich sehe, Du bist "Softwerker" ;-)
Das ist nicht falsch, sondern ein gangbarer Weg, wenn man die paar µA 
Stromaufnahme für den aktiven Inverter verkraften kann.

von Dr. Sommer (Gast)


Lesenswert?

m.n. schrieb:
> Das ist nicht falsch, sondern ein gangbarer Weg,

Nun gut, wenn man den Chip unbedingt außerhalb der Spezifikation 
betreiben will, wenn es doch so einfach wäre es richtig zu machen - 1 
Bit mehr zu setzen in einem Register, welches man sowieso beschreiben 
muss.

m.n. schrieb:
> Ich sehe, Du bist "Softwerker" ;-)
Tja, "Wieso, funktioniert doch" ist für mich kein Argument!

von m.n. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Nun gut, wenn man den Chip unbedingt außerhalb der Spezifikation
> betreiben will,

Geht's noch?

von Dr. Sommer (Gast)


Lesenswert?

Ich verstehe einfach diese Haltung nicht, "Abkürzungen" zu nehmen, wenn 
es doch so einfach wäre, es richtig zu machen. Im Reference Manual heißt 
es, man soll den Bypass Mode nutzen. Der existiert ja auch nicht nur zum 
Spaß. Ohne genau zu wissen, wie der IC von innen aussieht, kann man 
nicht sagen wie er sich im nicht vom Hersteller vorgegebenen Betrieb 
verhält. Man kann bestimmt auch einige Abblockkondensatoren weglassen 
ohne dass der IC sofort ausfällt - aber ob das eine gute Idee ist?

von pegel (Gast)


Lesenswert?

GB schrieb:
> mit entsprechendem Programmcode

bin, hex oder sogar Quellcode?

von GB (Gast)


Lesenswert?

Hallo,
danke für eure Beiträge!

Dr. Sommer schrieb:
> Auch nicht wenn du Kapitel "7.2.1 External source (HSE bypass)", S. 218,
> im Reference Manual liest?

Die Seiten bin ich schon durch gegangen, allerdings weiß ich nicht was 
ich  da einstellen sollte. Bin nicht vom Fach und habe nicht ein so tief 
gehendes Wissen was uC, bzw. was das anpassen von Registern angeht.


pegel schrieb:
> bin, hex oder sogar Quellcode?

Es ist der Quellcode geschrieben in C.

Danke Gruß

von Dr. Sommer (Gast)


Lesenswert?

GB schrieb:
> Die Seiten bin ich schon durch gegangen, allerdings weiß ich nicht was
> ich  da einstellen sollte.

Steht doch genau da:

"You select this mode by setting the HSEBYP and HSEON bits in the RCC 
clock control register (RCC_CR)."

Finde die Stelle wo du "RCC->CR" setzt und passe sie entsprechend an.

von m.n. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Im Reference Manual heißt
> es, man soll den Bypass Mode nutzen. Der existiert ja auch nicht nur zum
> Spaß.

Anders herum wird ein Schuh daraus: sobald man den Bypass-Modus 
einschaltet, muß man einen ext. Takt anlegen. Das steht im Datenblatt!
Der Hauptgrund, diesen Modus überhaupt zu verwenden, dürfte sein, PH1 
frei nutzen zu können.

@TO
Brauchst Du PH1 als freien IO-Pin? Wenn nein, dann lasse Dein Programm 
so wie es ist. Damit hast Du die Möglichkeit, einen Quarz oder einen 
externen XCO anzuschließen. Bei Bedarf kannst Du auch einen XCO mit 
gekappter, sinusförmiger Ausgangsspannung von ca. 1 Vss anschließen: 
kapazitiv über 1 nF einkoppeln.
Sich selber Knüppel zwischen die Beine zu werfen und für jeden 
Fliegenschiss ein separates Programm verwenden zu müssen, ist mehr als 
ungeschickt.
Und wenn man diese einfache Lösung wählt, geht weder der µC kaputt noch 
kommt man dafür in die Hölle.

Noch etwas: ich bin dazu übergegangen, im Startup-Code die ext. 
Quarzfrequenz im 1 MHz Raster zu messen und die PLL entsprechend zu 
konfigurieren. Dadurch gibt es nur ein einziges Programm, egal, ob nun 
gerade 8, 12, 16 MHz Quarze oder 10 bzw. 20 MHz XCOs bestückt werden.

von pegel (Gast)


Lesenswert?

GB schrieb:
> Es ist der Quellcode geschrieben in C.

Na dann kannst du jetzt entscheiden ob du alles so lassen willst, oder 
neu compilieren möchtest.
Im zweiten Fall, liste die Dateien auf, damit wir wissen welcher 
Compiler benötigt wird und welche Änderungen gemacht werden müssen.

von GB (Gast)


Lesenswert?

Hallo zusammen,
sorry für meine längere Abwesenheit hatte viel um die Ohren und kam 
nicht dazu. Danke schon mal für eure Hilfe!

Ich habe nun die Stelle gefunden, weiß allerdings nicht wie ich das 
entsprechend anpassen muss damit HSEBYP und HSEON "aktiviert" sind. Hier 
mal der Ausschnitt des Codes:

 /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

Ich danke euch!

Grüße

von Jim M. (turboj)


Lesenswert?

GB schrieb:
> Hier
> mal der Ausschnitt des Codes:

Da hat sich jemand die Verwendung der #defines aus dem Header gespart, 
und nun hat man richtig Arbeit das nur korrekt zu lesen und zu ändern. 
Betrachte es als Strafarbeit.

Oder ist das automatisch generierter Code aus einem Tool? Die verwenden 
aber normalerweise trotzdem "sprechende" Bit #define.

von Nico W. (nico_w)


Lesenswert?

Sieht für mich wie der Teil aus bei dem der Controller resetet wird. Die 
Register werden auf die Standardwerte gesetzt. Da guck man am besten in 
RefMan. Wilde Benennungen halte ich in dem Falle nicht für nötig.


Der betreffende Code steht sicher woanders.

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.