Ich benutze das Nucleo L073RZ Board mit der Arduino IDE und lasse eine
LED blinken:
1
voidsetup(){
2
pinMode(PA5,OUTPUT);
3
}
4
5
voidloop(){
6
digitalWrite(PA5,LOW);
7
delay(500);
8
9
digitalWrite(PA5,HIGH);
10
delay(500);
11
}
Funktioniert bis dahin. Die Blink-Frequenz der LED bestätigt, dass das
Setup korrekt funktioniert.
Dann habe ich mir den Quelltext der Taktkonfiguration angeschaut und
gesehen, dass der Systemtakt vom internen Oszillator HSI (= 16 MHz)
bezogen wird. Das möchte ich auf HSE (= 8 MHz vom ST-Link) umstellen.
Aber egal wie ich es versuche, die CPU läuft immer nur halb so schnell
wie sie soll.
Versuch 1:
Zuerst habe ich den Code von STM32duino kopiert und modifiziert. Ich
habe HSI durch HSE ersetzt und die PLL verdoppelt. Das sollte wieder 32
MHz ergeben, läuft aber nur halb so schnell.
1
voidSystemClock_Config(void)
2
{
3
4
RCC_OscInitTypeDefRCC_OscInitStruct={};
5
RCC_ClkInitTypeDefRCC_ClkInitStruct={};
6
RCC_PeriphCLKInitTypeDefPeriphClkInit={};
7
8
/* Configure the main internal regulator output voltage */
Hans W. schrieb:> Was übersehe ich?
Zunächst übersiehst du mal dass dir bei jedem Beitrag, den du
schreibst, gesagt wird dass:
"Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang"
Länger bedeuted in diesem Zusammenhang "mehr als eine Bildschirmseite".
Das ist ein Gebot der Freundlichkeit und der Netiquette.
Siehe dazu speziell auch "Äußere Form".
Hallo,
Hans W. schrieb:> Was übersehe ich?
Du hast die Hardwarekonfiguration geändert, nur das Programm selbst weiß
noch nichts davon. Funktionen wie delay() beruhen auf der Definition vom
CPU Takt.
Du müsstest noch #define F_CPU anpassen. Heißt bei AVR so, ob der Name
bei STM gleich lautet weiß ich nicht, nehme ich aber stark an.
Edit:
Wenn bei STM 'SystemCoreClock' dem AVR 'F_CPU' entspricht und du das
geändert hast, dann weiß ich es nicht.
Veit D. schrieb:> Du hast die Hardwarekonfiguration geändert, nur das Programm selbst weiß> noch nichts davon. Funktionen wie delay() beruhen auf der Definition vom> CPU Takt.
Daran liegt es nicht. Diese Zeilen erledigen das:
> SystemCoreClock=72000000;> SysTick_Config(SystemCoreClock/1000);
Habe ich mit anderen Frequenzen auf Basis des HSI gegen getestet.
> Du müsstest noch #define F_CPU anpassen. Heißt bei AVR so, ob der Name> bei STM gleich lautet weiß ich nicht, nehme ich aber stark an.
F_CPU ist als Alias für SystemCoreClock definiert.
Ich habe das Problem auch unabhängig von allen Frameworks mit einem
minimalen Projekt in der Cube IDE. Auch dieses Programm läuft nur halb
so schnell, wie es sollte.
Das ist aber echt schräg, dass durch diesen Fehler exakt die halbe
Taktfrequenz entsteht. Ich habe dieses HSEBYP Bit noch nie zuvor
benutzen müssen. Werde mich jetzt dazu einlesen.
Alexander schrieb:> Was übersehe ich?> SET_BIT(RCC->CR, RCC_CR_HSEBYP);
Haha, echt witzig. Als wäre ich nicht kurz vorher selbst drauf gekommen.
Bonusfrage extra für dich:
Warum ist die Taktfrequenz ohne dieses bit exakt halb so hoch?