ARM M3 Berechnung einer µs aus CMSIS

Gast #3202175
Lesenswert?

Hallo,

könnte mir mal bitte jemand erklären, wie die Berechnung einer µs aus 
dem SystemCoreClock zu verstehen ist?
1
void emc_WaitUS(volatile uint32_t us)
2
{
3
  us *= (SystemCoreClock / 1000000) / 3;
4
  while(us--);
5
}

Den Code-Ausschnitt habe ich aus der CMSIS lpc18xx_emc.c.

Ich habe das bisher so verstanden, dass der SystemCoreClock, der 
aktuelle Systemtakt ist. Also angenommen ich habe in der Funktion 
CGU_Init(): SetPLL1(6) programmiert. Dann ist PLL1 nach dem Ausführen 
von CGU_Init() die aktuelle Taktquelle und berechnet sich aus 6*12MHz = 
72MHz.
Somit müsste SystemCoreClock jetzt auch 72MHz sein. Weiter in der 
Berechnung erhalte ich 72 / 3 = 24.

aus us*= ... ergibt sich:

1µs = (SystemCoreClock / 1000000) / 3

Wo kommt die drei her?

Ich würde vermuten, dass es so richtig ist:

SystemCoreClock / 1000000 = 72

F_CPU / 72 = 1000000 Hz

1/1000000Hz = 1µs

Wie kann ich die Formel aus der CMSIS verstehen? Oder ist das ein Fehler 
in der CMSIS Programmierung?

Gruß Martin
Gast #3202260
Lesenswert?

Also das ist nun ja nicht schwer. Er berechnet aus dem Systemtakt, 
wieviele Takte eine Mikrosekunde sind. Die werden durch drei geteilt, 
für die while-Schleife. Die läuft dann so viele Takte, wie die 
eingestellte Wartezeit sein sollte. Hierbei sollte man beachten, dass 
jeder Interrupt diese Zeit verfälscht. Hier sollte man einfach eine 
Warteroutine benutzen, die auf einem Systick-Timer beruht.
Gast #3202264
Lesenswert?

wieso -3 ? Wenn er für jeden schleifendurchlauf 3 takte benötigt aber 
nur einen abzieht von us, dann benötigt er 3 mal soviel von den 
vorgegebenen Takte.
Daher (SystemCoreClock / 1000000) / 3

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