STM32 BlinkLED, Prozessorferquenz STM32F4DISCOVERY

OP #3491887
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--);
}
Gast #3491932
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
Gast #3492038
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.
(Firma: EleLa - www.elela.de) #3492045
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.
OP #3493023
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren