Hallo miteinander
Ich bin gerade wieder dabei herauszufinden, warum mein clock mit
externem 8MHz Quarz anders ist als mein interner Clock.
Ich teste dies mit einem Systick Interrupt, der 1ms aufgerufen wird.
transmitCounter wird dort inkrementiert
transmitCounterLimit = 200
Mit dem internen Clock komme ich in die if nach 200ms wie eingestellt,
mit dem Quarz aber schon nach 100ms.
Mein Buzzer beept auch nicht wirklich 2sec. mit der Quarzeinstellung.
1
// sends every 200ms a message
2
if(transmitCounter>=transmitCounterLimit)
3
{
4
}
Ich habe die Konfiguration unten mit dem CubeMx zur Sicherheit auch
eingestellt, sodass ich meine eigenen Fehler ausschliesse. Aber
irgendwie, obwohl ich alles mit der PLL auf 48MHz einstelle, verhält
sich das Programm nicht gleich.
Was mache ich nur nicht richtig?
Ich wäre euch für Ratschläge sehr dankbar.
Hallo pegel
Ich habe gerade noch eine Vermutung was es sein könnte.
Das werde ich am Montag dann überprüfen und falls es das nicht ist,
nochmals darauf zurück kommen und die files, wie von dir gewünscht, hier
posten.
Vielen Dank nochmals bis dahin
Hallo
Ich habe versuchshalber mit meinem stm32L476 die clocks eingestellt.
(Ebenfalls mit dem CUBEMX)
Um den Clock zu testen, habe ich den Timer6 benutzt und mit dem 80MHz
clock einen Interrupt eingestellt, der alle 1us aufgerufen wird.
1/80MHz mit prescaler 0 ergibt 12.5ns
Mit einer Periode von 80 ergibt das also 1us
counterLimit = 1 000 000
Also sollte mir die LED eigentlich im Sekundentakt blinken. Tut sie aber
nicht. Ich weiss nicht, warum ich auf einmal solche Probleme mit den
Clockeinstellungen habe.
Was mache ich nur falsch?
Daten sind im Anhang
Zeig mal deine CubeMX-Datei! (.ioc)
Die ist viel interessanter.
Bei dem F072 ist der max. HCLK bei dem internen Osc.45 MHz und bei einem
ext.Quarz 48MHz.
Harry L. schrieb:> Zeig mal deine CubeMX-Datei! (.ioc)>> Die ist viel interessanter.>> Bei dem F072 ist der max. HCLK bei dem internen Osc.45 MHz und bei einem> ext.Quarz 48MHz.
Hallo
Hier ist sie.
Harry L. schrieb:> Bei dem F072 ist der max. HCLK bei dem internen Osc.45 MHz und bei einem> ext.Quarz 48MHz.
Ich habe jetzt im Datenblatt und im Reference Manual danach gesucht,
dass der interne Clock max. 45MHz hat konnte ich nirgends finden.
Fragender schrieb:> Harry L. schrieb:>> Bei dem F072 ist der max. HCLK bei dem internen Osc.45 MHz und bei einem>> ext.Quarz 48MHz.>> Ich habe jetzt im Datenblatt und im Reference Manual danach gesucht,> dass der interne Clock max. 45MHz hat konnte ich nirgends finden.
Das wäre auch sehr verwunderlich, bewirbt doch ST die F0-Serie mit
"crystal-less USB".
Christopher J. schrieb:> Fragender schrieb:>> Harry L. schrieb:>>> Bei dem F072 ist der max. HCLK bei dem internen Osc.45 MHz und bei einem>>> ext.Quarz 48MHz.>>>> Ich habe jetzt im Datenblatt und im Reference Manual danach gesucht,>> dass der interne Clock max. 45MHz hat konnte ich nirgends finden.>> Das wäre auch sehr verwunderlich, bewirbt doch ST die F0-Serie mit> "crystal-less USB".
1. Auf die 3MHz kommt es ja auch nicht mehr so drauf an. Da frage ich
mich wieso das so sein sollte und ST auf die Idee kommt die clock intern
extern auf 3MHz unterschiedlich zu machen.
2. lese ich beim stm32f0 und stm32L4 einen maximalen Clock von f_HCLK =
48 und 80 MHz für L4.
Im Moment frage ich mich auch, warum der Clock auch nicht stimmt, wenn
ich auf dem Nucleo stm32L4 Board den externen Quarz verwende mit den
gleichen Einstellungen vom Timer. Dann warte ich im Gegensatz zum
internen eine Ewigkeit bis der counter mal auf 1000000 ist. Beim
internen sind es gefühlte 5 sec statt 1 sec. Beim externen 40sec.
Ich verstehe das einfach nicht.
Ich messe das mal mit dem Oszi, was ich da mit dem Timer wirklich
erreiche.
Fragender schrieb:> Ich bin also halb so schnell.> Im Interrupt habe ich nur noch den Befehl GPIOA->ODR ^= GPIO_PIN_5;>> Woran liegt es?
Was soll das Bild jetzt zeigen? Das der Interrupt nur alle 2us feuert?
Woran hängt denn dein Timer? AHB, APB1, APB2? Wie sind da die Prescaler?
Nicht alle Timer laufen mit HCLK!
Christopher J. schrieb:> Fragender schrieb:>> Ich bin also halb so schnell.>> Im Interrupt habe ich nur noch den Befehl GPIOA->ODR ^= GPIO_PIN_5;>>>> Woran liegt es?>> Was soll das Bild jetzt zeigen? Das der Interrupt nur alle 2us feuert?
Ja
> Woran hängt denn dein Timer? AHB, APB1, APB2? Wie sind da die Prescaler?> Nicht alle Timer laufen mit HCLK!
Timer 6 hängt an HCLK (APB1), letztendlich am PCLK1
Prescalers sind auf 1, auch AHB (siehe Bilder)
Den Timer Prescaler habe ich auf 0, laut der Rechnung oben.
Ich komme mir nun langsam schon echt doof vor.
Jetzt verstehe ich gar nichts mehr.
Die Bilder vom Oszi deuten auf halbe Geschw., nämlich 40 statt 80 MHz.
Aber das Auslesen des PCLK1 sagt mir 4 MHz
So nun habe ich in der CUBE MX Datei lediglich nur vom HSI auf den
externen Quarz 8MHz eingestellt mit den genau gleichen Einstellungen.
Nun lasse ich das Programm laufen und der PCLK1 wird mir ebenfalls mit 4
000 000 MHz angezeigt in der Software aber das Oszibild zeigt mir nun
statt 2us, 20us an. Also gerade nochmals 10x langsamer.
Das soll nun noch jemand verstehen...
Mit meinem Nucleo habe ich schon öfters gearbeitet.
Die Probleme mit dem Clock hatte ich bisher noch nicht. Ich glaube
langsam, dass die da mit der CubeMx Software etwas verbockt haben.
Was kann ich denn nun machen, ohne das es ein Gebastel ist?
Fragender schrieb:> Nun lasse ich das Programm laufen und der PCLK1 wird mir ebenfalls mit 4> 000 000 MHz angezeigt in der Software aber das Oszibild zeigt mir nun> statt 2us, 20us an.
Nein falsch: Ich lese 40us ab. Falsch geschaut.
1/4MHz * Periode 80 = 20us, raus kommen aber 40us
1/4MHz * Periode 4 sollte denmach genau 1us ergeben, raus kommt aber ca.
32.8us
Oh mann...
Ich dreh langsam durch.
So meine Signale habe uch in der Zwischenzeit zusammen.
Jetzt benötige ich nur noch den heissen Tipp von euch.
Die Clocks von Hand für jede einzelne Peripherie einzustellen würde ich
mir gerne ersparen.
Warum nutzt du nicht einfach den MCO?
Dann stellt sich heraus ob es ein CubeMX Problem ist.
Inzwischen gibt es die neue Version 5.1.0, sollte es daran liegen.
Wenn ich nicht irre, werden Prescaler wie auch Periode Werte -1
angegeben.
Für PWM ein Beispiel von 72MHz auf 1KHz PWM.
Lässt sich auch so in CubeMX eintragen.
Fragender schrieb:> Ich komme mir nun langsam schon echt doof vor.>> Jetzt verstehe ich gar nichts mehr.> Die Bilder vom Oszi deuten auf halbe Geschw., nämlich 40 statt 80 MHz.> Aber das Auslesen des PCLK1 sagt mir 4 MHz
Der Breakpoint in deinem Screenshot ist ja auch vor der
SystemClock_Config(), also bevor die PLL konfiguriert wird. So lange
rennt die Kiste mit dem 4MHz MSI.
Fragender schrieb:> So meine Signale habe uch in der Zwischenzeit zusammen.>> Jetzt benötige ich nur noch den heissen Tipp von euch.> Die Clocks von Hand für jede einzelne Peripherie einzustellen würde ich> mir gerne ersparen.
Helau! Hast du vielleicht den Timer auf Up-Down konfiguriert? Generell
vermisse ich bei allem was du hier veröffentlicht hast die eigentliche
Timer-Konfiguration.
Edit: Irrsinn gelöscht
Christopher J. schrieb:> Fragender schrieb:>> Ich komme mir nun langsam schon echt doof vor.>>>> Jetzt verstehe ich gar nichts mehr.>> Die Bilder vom Oszi deuten auf halbe Geschw., nämlich 40 statt 80 MHz.>> Aber das Auslesen des PCLK1 sagt mir 4 MHz>> Der Breakpoint in deinem Screenshot ist ja auch vor der> SystemClock_Config(), also bevor die PLL konfiguriert wird. So lange> rennt die Kiste mit dem 4MHz MSI.
auch nach dem systemclockinit 4MHz
>> Fragender schrieb:> Helau! Hast du vielleicht den Timer auf Up-Down konfiguriert? Generell> vermisse ich bei allem was du hier veröffentlicht hast die eigentliche> Timer-Konfiguration.>> Edit: Irrsinn gelöscht
Ich habe alles als file oben angehängt, aber hier nochmals die main.c
Fragender schrieb:> MCO?
Schau mal in der Clock Configuration in den unteren linken Teil den du
in deinen Bildern immer abgeschnitten hast.
Wird unter RCC aktiviert. PA8 gibt den gewählten Takt aus.
Fragender schrieb:> htim6.Init.Prescaler = 1;
Da liegt der Hund begraben. Ein Prescaler-Wert von 1 bedeutet effektiv
einen Teiler von 2!
Was du brauchst ist ein PSC-Wert von 0, der teilt nämlich nicht durch
0 (das wäre ja auch übel), sondern durch 1 ;)
Es hilft übrigens ungemein sich (gerade bei den Timern) mal die Register
im Refman anzuschauen. Hier kommen jeden Tag Leute mit ewig viel
generiertem Code und sehen den Wald vor lauter Bäumen nicht.
PS: Das gleiche was für PSC gilt, gilt auch für ARR (in HAL-Sprech
"period"). Ein Wert von 4 bedeutet 0..4, also 5 Takte für eine Periode.
Fragender schrieb:> RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK> |RCC_CLOCKTYPE_PCLK1;> RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;> RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;> RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;> if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) !=> HAL_OK)>> /**Initializes the CPU, AHB and APB busses clocks> */> RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK> |RCC_CLOCKTYPE_PCLK1;
Längere Namen sind dir nicht eingefallen?
In meiner Funktion als Prozessor Dokter Schmunz würde ich sagen: DAS IST
DAS PROBLEM! Dein Programm (oder ist es ein Sketch? ;) ) sieht aus, als
wäre ein Huhn drüber gelaufen. Das kann keiner mehr lesen und so
entstehen Fehler.
Prozessor Dokter Schmunz schrieb:> Längere Namen sind dir nicht eingefallen?
Ich in meiner Rolle als Doktor SchlagInDenNacken würde Dir intravenös
eintrichtern, dass diese Namen vom Framework vorgegeben sind.
Christopher J. schrieb:> Fragender schrieb:> htim6.Init.Prescaler = 1;>> Da liegt der Hund begraben. Ein Prescaler-Wert von 1 bedeutet effektiv> einen Teiler von 2! Was du brauchst ist ein PSC-Wert von 0, der teilt> nämlich nicht durch 0 (das wäre ja auch übel), sondern durch 1 ;)>> Es hilft übrigens ungemein sich (gerade bei den Timern) mal die Register> im Refman anzuschauen. Hier kommen jeden Tag Leute mit ewig viel> generiertem Code und sehen den Wald vor lauter Bäumen nicht.>> PS: Das gleiche was für PSC gilt, gilt auch für ARR (in HAL-Sprech> "period"). Ein Wert von 4 bedeutet 0..4, also 5 Takte für eine Periode.
ob 4 oder 5
prescaler 0 oder 1
alles tut nicht
Ich liege immer mindestens 2 fach daneben
Ich denke schon das es einen Unterschied macht, ob man 80MHz durch 2
teilt oder nicht.
Hast du auch neu kompiliert und neu übertragen danach?
MCO probiert um die internen Takte zu prüfen?
Christopher J. schrieb:> Fragender schrieb:> Ich liege immer mindestens 2 fach daneben>> Ist dabei auch schon einkalkuliert, dass du nur toggelst?
Ja der interrupt kommt und ich schalte ein
beim nächsten interr wieder aus
da muss ich jetzt 1us messen zwischen einer steigenden und einer
fallenden Flanke. messe aber 2us, beim HSI
mit dem HSE dann aber 40 statt 20us
mit gleichen Einstellungen ?
Guten Morgen
Die Diskussion würde sich glaube ich erledigen, wenn jemand einfach mal
mit irgend einem STM den TIM6 mal auf 1us einstellt.
Ich weiss nicht, warum 1us nicht funktioniert beim TIM6.
1sec. funktioniert.
1sec. =
prescaler = 48000-1
CounteMode = UP
Periode = 1000-1
1us =
prescaler = 12-1
CountermOde = up
periode = 4-1
Dann hätten wir das Problem mit dem Prescaler 0 oder 1 einmal beseitigt.
Ich bekomme das nicht hin mit 1us. Ich messe etwas über 3.5us
Schafft es jemand von euch?
Die STMs sind ja meistens gleich.
Ich bekomme es mit dem STM32L4 und STM32F0 nicht hin.
Braucht der Interrupt so lange in die Funktion zu gelangen oder was ist
das Problem?
Mangels TIM6 habe ich es auf dem Bluepill mit TIM4 getestet.
Und ja, es dauert seine Zeit bis alle Befehle ausgeführt sind.
Darum geht es einfach nicht schneller.
Ich habe den OC1 Ausgang und die LED (getoggelt durch die Callback
Funktion des Timers) auf dem Oszi beobachtet. Da sieht man sehr schön
wie sich die Signale bei zunehmender Frequenz gegenseitig beeinflussen.
Dann funkt auch noch der Systick dazwischen und die Waitstates des Flash
darf man auch nicht vergessen.
Die eigentliche Frage war ja, ob es einen Unterschied macht, ob HSE oder
HSI verwendet wird. Das probiere ich noch mit 48MHz.
Du kannst ja nachsehen, ob z.B. die Waitstates oder eine andere
Einstellung unterschiedlich je nach Taktquelle sind.
Hallo Freunde
Bei mir stimmen die Clocks irgendwie immer noch nicht und ich begreife
nicht warum.
Ich arbeite derzeit mit dem STM32L476RG Nucleo Board.
Mit dem Timer 6 möchte ich eigentlich einen 1us Interrupt generieren.
Das funktioniert ja soweit festgestellt ja nicht.
Das ist ein Beitrag aus dem Arduino Forum:
Apr 11, 2018, 05:40 pm Last Edit: Apr 11, 2018, 05:41 pm by Doc_Arduino
Hallo,
auch wenn es vielleicht nicht mehr benötigt wird wegen dem Problem mit
dem Multiplexing, möchte ich dennoch zeigen wie man das mit einem Timer
erschlagen kann. Es ist beliebig erweiterbar. Im Grunde basiert es auf
einem Servo Sketch. Der benötigt aber keine künstliche Totzeit zwischen
den Pulsen. Die maximale Zeit für irgendwelche Pulsformung oder Totzeit
ergibt sich aus dem maximalen Timercount von 65535 und dem aktuellen
Prescaler 8. Ein Timercount entspricht 1 / 16MHz * 8 = 0,5µs. Das wäre
gleichzeitig die Auflösung. Daraus ergibt sich 0,5µs * 65535 = 32,767ms
was maximal einstellbar wäre mit Prescaler 8.
Meine Frage ist an diesem Punkt: Was ist, wenn ich einen Interrupt alle
1us haben möchte? Warum bekommt das ein AVR hin und ein STM32 nicht?
Wie stelle ich einen 1us Interrupt mit dem STM32 ein?
Ich lese beim Timer einen Wert von 80MHz für PLCK1 aus. Das ist der Clk
für die Timer. Daher dividiere ich bei der TIM6 Configuration durch 80
(80-1) und stelle die Periode auf 5 (5-1). Dann stelle ich den Limit im
Interrupt auf 250 und sollte nun eine Pulslänge von 5x250us = 1250us
bekommen, wenn ich einen Eingang ein und beim nächsten Mal wieder
ausschalte.
Ich bekomme aber immer das Doppelte, also 2500us.
Warum? Ich wäre nun wirklich dankbar, wenn mir jemand aus diesem
Schlamassel helfen würde.
Das ist meine Timer und SystemClock Initialisierung:
Gebe mal deine ganzen Prescaler und Multiplikatoren, sowie die Frequenz
des Quarzes in CubeMX ein. Dann schaust du in dem hübschen Diagramm
nach, welche Taktfrequenz am Timer ankommt.
Zeige mal einen Screenshot von dieser Ansicht. Das hilft sicher bei der
Klärung.
Stefanus F. schrieb:> Gebe mal deine ganzen Prescaler und Multiplikatoren, sowie die> Frequenz> des Quarzes in CubeMX ein. Dann schaust du in dem hübschen Diagramm> nach, welche Taktfrequenz am Timer ankommt.>> Zeige mal einen Screenshot von dieser Ansicht. Das hilft sicher bei der> Klärung.
Morgen Stefan
Das habe ich schon mindestens 100000 mal gemacht, aber meinetwegen machs
ich nochmals, damit es für jeden nachvollziehbar ist.
bis dann
Ich würde meinen Vorschlag von oben probieren.
Beginne mit grossen Teiler Einstellungen die eine niedrige Frequenz
erzeugen, rechne diese nach und vergleiche. Am Besten mit Oszi.
Dann verkleinere die Teiler Einstellungen, miss die Frequenz und du
wirst sehen das du an einen Punkt kommst, an dem sich die Frequenz durch
die Zeit, die die Abarbeitung der Befehle benötigt nicht mehr verändert.
Das lässt sich prima durch "unsaubere" Signale am Oszi beobachten.
pegel schrieb:> Ich würde meinen Vorschlag von oben probieren.> Beginne mit grossen Teiler Einstellungen die eine niedrige Frequenz> erzeugen, rechne diese nach und vergleiche. Am Besten mit Oszi.>> Dann verkleinere die Teiler Einstellungen, miss die Frequenz und du> wirst sehen das du an einen Punkt kommst, an dem sich die Frequenz durch> die Zeit, die die Abarbeitung der Befehle benötigt nicht mehr verändert.>> Das lässt sich prima durch "unsaubere" Signale am Oszi beobachten.
Hallo Pegel
Das habe ich versucht.
Ich komme, wenn Timer 3 und der Interrupt selbst so konfiguriert ist auf
4.15us. Das ist das Minimum, was ich heraus bekomme.
Ich habe den HAL_TIM_IRQHandler(&htim3); im Interrupt weggelassen
Jetzt komme ich auch auf das was ich einstelle.
Zumindest ein Problem gelöst.
Nun habe ich das Problem mit dem Quarz noch.
Fragender schrieb:>> Das habe ich versucht.> Ich komme, wenn Timer 3 und der Interrupt selbst so konfiguriert ist auf> 4.15us. Das ist das Minimum, was ich heraus bekomme.> Ich habe den HAL_TIM_IRQHandler(&htim3); im Interrupt weggelassen>> Jetzt komme ich auch auf das was ich einstelle.>> Zumindest ein Problem gelöst.> Nun habe ich das Problem mit dem Quarz noch.
Habe die Konfigurationen vergessen:
Jetzt muss ich nochmals nachfragen.
Ich stelle ein neues CUBEMX file her mit externem Quarz 8MHz und bekomme
dann einen Takt von 48 MHz.
In meinem Programm aber nicht. Die Timerkonfiguration ist aber exakt
gleich.
Woran liegt das?
Fragender schrieb:> Ich stelle ein neues CUBEMX file her mit externem Quarz 8MHz und bekomme> dann einen Takt von 48 MHz.>> In meinem Programm aber nicht. Die Timerkonfiguration ist aber exakt> gleich.>> Woran liegt das?
Wenn du das *.ioc File oder wenigstens den versprochenen Screenshot
zeugen würdest, könnten wir uns die vernünftig Sache anschauen.
Stefanus F. schrieb:> Fragender schrieb:> Ich stelle ein neues CUBEMX file her mit externem Quarz 8MHz und bekomme> dann einen Takt von 48 MHz.> In meinem Programm aber nicht. Die Timerkonfiguration ist aber exakt> gleich.>> Woran liegt das?>> Wenn du das *.ioc File oder wenigstens den versprochenen Screenshot> zeugen würdest, könnten wir uns die vernünftig Sache anschauen.
Hallo Stefan
Ich stelle gerade fest, dass mein Ioc file nicht mehr aktuell ist, da
ich dann später alles weitere von Hand geschrieben habe. Wenn ich doch
versuche alles was nachtraeglich hinzugekommen nachzustellen und den
Code erneut generiere. Kommen bei mir irgendwelche multiplied defined
Fehler in Bibliotheken, die ich gar nicht erstellt habe.
Was nun? Ich nehme nicht an, dass du das ioc vom neuen cubemx file
willst, weil das ja nichts aussagt über das Problem.
pegel schrieb:> Fragender schrieb:> htim3.Init.Period = 24000;>> Bei 48MHz müsste die Led dann 2kHz toggeln, also mit 1kHz blinken.> Tut sie das?
Das werde ich morgen testen.
Aber was mir ja gerade einfällt so nebenbei bevor ich das teste morgen.
Ich habe ja 500us eingestellt und das mit Prescaler 0 und Periode 24000
augerechnet ausgehend von 48MHz.
Also stimmt das ja, wenn ich das mit dem Oszi messe.
Dann frage ich mich aber warum die HAL_GetHCLKFreq etc bei mir 24MHz
liefert und beim neuen file 48MHz. Den Beep Ton führt das Programm mit
dem ext Quarz auch schneller aus mit angeblichen 24 MHz als der interne
CLK mit 48MHz.
Der Beep Ton mit gleich eingestellter PWM 2.4kHz klingt aber gleich und
bleibt unverändert.
Ich kapiers nicht...
Fragender schrieb:> Ich nehme nicht an, dass du das ioc vom neuen cubemx file> willst, weil das ja nichts aussagt über das Problem.
Probiere das neue File aus. Ich wollte das funktionierende CubeMX
Projekt mit dem nicht funktionierenden (ohne CubeMX) vergleichen.
Fragender schrieb im Beitrag #57 *.ioc File oder wenigstens den
versprochenen Screenshot
> zeugen würdest, könnten wir uns die vernünftig Sache anschauen.>> Hallo Stefan>> Ich stelle gerade fest, dass mein Ioc file nicht mehr aktuell ist, da> ich dann später alles weitere von Hand geschrieben habe. Wenn ich doch> versuche alles was nachtraeglich hinzugekommen nachzustellen und den> Code erneut generiere. Kommen bei mir irgendwelche multiplied defined> Fehler in Bibliotheken, die ich gar nicht erstellt habe.>> Was nun? Ich nehme nicht an, dass du das ioc vom neuen cubemx file
?
>> Das werde ich morgen testen.> Aber was mir ja gerade einfällt so nebenbei bevor ich das teste morgen.> Ich habe ja 500us eingestellt und das mit Prescaler 0 und Periode 24000> augerechnet ausgehend von 48MHz.> Also stimmt das ja, wenn ich das mit dem Oszi messe.> Dann frage ich mich aber warum die HAL_GetHCLKFreq etc bei mir 24MHz> liefert und beim neuen file 48MHz. Den Beep Ton führt das Programm mit> dem ext Quarz auch schneller aus mit angeblichen 24 MHz als der interne> CLK mit 48MHz.> Der Beep Ton mit gleich eingestellter PWM 2.4kHz klingt aber gleich und> bleibt unverändert.>> Ich kapiers nicht...
Ich muss irgendwie herausfinden was der SysClk nun wirlich für einen
Wert hat. In den HAL_GetHCLKFreg Funktionen werden ja nur irgendwie bits
geschoben.
Gibt es nicht irgend ein Register wo das ausgelesen werden kann oder
eine Möglichkeit das zu messen?
Stefanus F. schrieb:> Fragender schrieb:> Ich nehme nicht an, dass du das ioc vom neuen cubemx file> willst, weil das ja nichts aussagt über das Problem.>> Probiere das neue File aus. Ich wollte das funktionierende CubeMX> Projekt mit dem nicht funktionierenden (ohne CubeMX) vergleichen.
Ok ich lasse es dir morgen zukommen.
Fragender schrieb:> Gibt es nicht irgend ein Register wo das ausgelesen werden kann
Nein. Die CMSIS definiert eine globale 64bit Integer Variable namens
SystemCoreClock, welche zu jeder Zeit die richtige Frequenz in Hz
angeben sollte. Aber letztendlich wird sie von der Software
aktualisiert, kann also auch falsch sein.
> oder eine Möglichkeit das zu messen?
Sicher
a) Lass Dir den Takt auf den MCO Pin ausgeben und messe mit einem
externen Gerät.
b) Rufe folgende Funktion als delay(1000) auf, das sollte bei 48MHz
genau 1 Sekunde dauern.
1
voiddelay(uint32_tmsec)
2
{
3
for(uint32_tj=0;j<9000UL*msec;j++)
4
{
5
__NOP();
6
}
7
}
Der Optimizer muss dabei aktiviert sein (-O2, -O3, -Os oder -Og).
Ich habe es raus.
Ich hatte bei meinem Programm zuerst 4MHz Quarz drin und hatte den Code
auch so generiert und danach nicht mehr geändert.
Der Prozessor taktet mit 48MHz, die Software zeigt es aber falsch an,
weil
in der stm32f0xx_hal_conf.h Datei 4MHz steht statt 8MHz
1
#if !defined (HSE_VALUE)
2
#define HSE_VALUE ((uint32_t)4000000) /*!< Value of the External oscillator in Hz */
3
#endif /* HSE_VALUE */
Ich habe es jetzt auf 8000000 geändert und wird nun richtig angezeigt.