Forum: Mikrocontroller und Digitale Elektronik ARM M3 Berechnung einer µs aus CMSIS


von Martin (Gast)


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

von Christian (Gast)


Lesenswert?

Bin mir nicht sicher, aber kann es sein, dass er 3-takte für die 
while-schleife benötigt?

von Martin (Gast)


Lesenswert?

dann wäre es eher ((SystemCoreClock/1000000)-3).

von Syliosha (Gast)


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.

von Christian (Gast)


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

von Martin (Gast)


Lesenswert?

Ok danke, das leuchtet ein :-)

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.