Forum: Mikrocontroller und Digitale Elektronik STM32F4DISCOVERY dely_us() ?


von wigo (Gast)


Lesenswert?

Ich bin gerade dabei ein Projekt auf das Discovery Board zu portieren. 
Nun benoetige ich eine Funktion die eine Anzahl von Mikrosekunden 
wartet. Ich habe bisher nichts fertiges gefunden. Gibt es da was?

Danke fuer eure Hilfe!

von Arne (Gast)


Lesenswert?

Nicht ganz... etwas müsstest Du rechnen.
Es gibt den cycle-counter an Adresse 0xE0001000, 0xE0001004.
Der wird mit jedem ALU Takt inkrementiert.
An 0xE0001000 habe ich Bits 0 und 12 auf '1' geknipst, um ihn zu 
aktivieren.
Und an 0xE000EDFC Bit 24 auf '1'.
Solltest Du alles im CortexM3 Core Manual von ARM nachlesen können.

von Gerhard G. (g_g)


Angehängte Dateien:

Lesenswert?

Hallo,

wigo schrieb:
> Ich habe bisher nichts fertiges gefunden. Gibt es da was?´

Als Anlage findest du die Dateien systick.h und systick.c

starten:

#include "systick.h"

int main(void)
{
  SystemInit();
  systickInit(1000); //1000 ticks per second

 ..........


In der systick.c findest du einen Hinweis!!

// TODO: nasty constant for timing. This value correct for STM32F4 at 
72MHz
#define COUNTS_PER_MICROSECOND 22

Ich kann dir gerade nicht sagen, ob ich das mit 168Mhz oder 72Mhz 
verwendet habe! Eventuell COUNTS_PER_MICROSECOND 22 anpassen.

Bitte testen!

Gruß G.G.

von Verwirrter Anfänger (Gast)


Lesenswert?

Für meine delay_ms() benutz ich den Systick, das kann zwar um 1 ms 
schwanken, aber das reicht mir meistens aus. Für die delay_us() kommt es 
mir meistens nicht auf die exakte Verzögerung an, da benutz einfach nur 
eine kleine Schleife, die runterzählt. Die Schleifendurchläufe hab ich 
mir mit einem Logic Analyzer angenähert, aber die können durchaus um 
25%-50% schwanken

Bei 168 MHz ergibt das bei mir:
1
void time_waitMs(uint32_t delayMs) {
2
  uint32_t end = time_getMS() + delayMs + 1;
3
  while(end > time_getMS()) {
4
  }
5
}
6
7
void time_waitUs(uint16_t delay) {
8
  // determined by trial and error...
9
  uint8_t temp;
10
  while (delay) {
11
    temp = 12;
12
    while(temp) {
13
      temp--;
14
    }
15
    delay--;
16
  }
17
}
18
19
void time_waitNs(uint16_t delay) {
20
  // determined by trial and error...
21
  delay = delay >> 6;
22
  while (delay) {
23
    delay--;
24
  }
25
}

von wigo (Gast)


Lesenswert?

Danke. Ich habe den ersten Vorschlag umgesetzt da bei mir kuerzere 
Toleranzen nach oben weniger Stromverbrauch bedeuten. Details zur 
Implementierung findet ihr hier:

http://forums.arm.com/index.php?/topic/13949-cycle-count-in-cortex-m3/page__view__findpost__p__33194

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.