Forum: Mikrocontroller und Digitale Elektronik STM32 BlinkLED, Prozessorferquenz STM32F4DISCOVERY


von Helmut S. (helmuts)


Lesenswert?

Hallo,

Ich habe diese Anleitung befolgt und das BlinkLED Beispiel "eingetippt".

http://www.mikrocontroller.net/articles/STM32_CooCox_Installation

In dem beispiel gibt es eine while Schleife die 1000000 mal durchlaufen 
wird. Das Beispiel läuft, aber die Blinkzeit kommt mir relativ relativ 
lang vor für einen Prozessor der angeblich mit 168MHz laufen sollte.

Mit welcher Frequenz läuft der Prozessor da eigentlich?

Ich sehe keinen Funktionsaufruf zum Taktsetzen in main().

Gruß
Helmut




// Demo Blink-LED für STM32F4xx mit einem STM32F4DISCOVERY Board
// (c) 2013, Markus Müller
// Dieser Code darf frei verwendet, modifiziert und kopiert werden.

#include "stm32f4xx.h" // Deklaration der Peripheriefunktionen

void Delay(long i);

// Haupt-Programmschleife
int main(void)
{

  RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // Clock für Port D aktivieren

  GPIOD->MODER = 0x55000000; // Pin 12..15 als Ausgang deklarieren

  while(1) // Endlos SChleife
    {
    GPIOD->BSRRH = 0xF000; // Alle LED's aus
    Delay(1000000);
    GPIOD->BSRRL = 0x1000; // LED 1 ein
    Delay(1000000);
    GPIOD->BSRRL = 0x2000; // LED 2 ein
    Delay(1000000);
    GPIOD->BSRRL = 0x4000; // LED 3 ein
    Delay(1000000);
    GPIOD->BSRRL = 0x8000; // LED 4 ein
    Delay(1000000);
    }
}

// Delay für Verzögerungen
void Delay(long i)
{
  volatile long iZ = i;
  while (iZ--);
}

von public (Gast)


Lesenswert?

Hallo Helmut,

schaue doch mal in deine eingebundene Header-Datei (stm34f0xx.h). Dort 
stehen diverse Taktdefinitionen: HSE_VALUE und HSI_VALUE.

Dann musst du dir noch die system_stm34f0xx.c reinziehen, dort gibt es 
eine SystemInit(). Mit der Funktion wird auch dein Takt erstmalig 
eingestellt.

Beste Grüße
public

von Helmut S. (helmuts)


Lesenswert?

Hallo public,
danke. Ich wedre das heute Abend mal probieren und mich wieder melden.
Gruß
Helmut

von Uwe Bonnes (Gast)


Lesenswert?

Helmut S. schrieb:
> wird. Das Beispiel läuft, aber die Blinkzeit kommt mir relativ relativ
> lang vor für einen Prozessor der angeblich mit 168MHz laufen sollte.

Der Prozessor startet mit dem eingebauten HSI (High Speed Internal) 8 
MHz Oszillator. Die Frequenz setzt Du über das RCC Modul, meist indem 
man den externen Quarz einschaltet, auswählt und die Quarzfrequenz 
passend vorteilt und dann vervielfacht.

Da Du nur "stm32f4xx.h" inkludierst, musst Du das von Hand machen. IDEs 
und RTose mache das meist fuer Dich und verstecken vor Dir.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Nein, das Demo initialisiert keine Clock's, somit läuft die CPU mit 
16MHz mit dem internen RC-Oszilator (= HSI).

Um die 168MHz zu erreichen muss man noch diese Funktion aufrufen:

SystemInit();

Das ist eine Funktion aus der ST-Lib und die macht dann alles.
- HSE aktivieen
- PLL aktivieren
- usw.

In der Datei "system_stm32f4xx.c" muss dazu noch die Variable "PLL_M" 
entsprechend auf die Quarzfrequenz angepasst werden, dann sollte das 
schon tun. (25 für 25MHz Quarz ist voreingestellt)

@Uwe, der STM32F4xx hat einen 16MHz HSI.

: Bearbeitet durch User
von Helmut S. (helmuts)


Lesenswert?

Hallo und danke an alle Helfer,

"Lola rennt". :-)

Ich habe jetzt PLL_M auf 8 gesetzt (8MHz Quarz) und SystemInit() 
aufgerufen. Die 1000000 Leerschleifen mit "while (iZ--);" dauern jetzt 
noch ca. 1/10 der Zeit (41ms). Das ergibt jetzt ca. 41ns pro Durchlauf. 
Damit wäre die erste Hürde genommen.

Gruß
Helmut

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ich habe das nun hier mit aufgenommen:
http://www.mikrocontroller.net/articles/STM32_CooCox_Installation#Clock_auf_168MHz_einstellen

Vielleicht kannst Du ja hier weiter schreiben, was und wie Du als 
nächstes lernst?

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.