Forum: Mikrocontroller und Digitale Elektronik SysTick - Delay - STM32F4


von Florian A. (florian_a)


Lesenswert?

Liebe Elektronik-Experten,

ich bin am einstieg zum STM32F4 und benötige eine Delay Funktion.
In den Standard Libraries ist sowas ja enthalten:

RCC_ClocksTypeDef RCC_Clocks;
/* SysTick end of count event each 10ms */
RCC_GetClocksFreq(&RCC_Clocks);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 100);

void Delay(__IO uint32_t nTime)
{
  TimingDelay = nTime;

  while(TimingDelay != 0);
}

/**
  * @brief  Decrements the TimingDelay variable.
  * @param  None
  * @retval None
  */
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}

void SysTick_Handler(void)
{
  TimingDelay_Decrement();
}

Nun gibt es dazu folgende Information:
The SysTick_Config() function is a CMSIS function which configure:
       - The SysTick Reload register with value passed as function 
parameter.
       - Configure the SysTick IRQ priority to the lowest value (0x0F).
       - Reset the SysTick Counter register.
       - Configure the SysTick Counter clock source to be Core Clock 
Source (HCLK).
       - Enable the SysTick Interrupt.
       - Start the SysTick Counter.


Meine Frage: Nachdem das Delay "erledigt" ist, springt er trotzdem alle 
10 ms in die zugehöre ISR?
Wenn ja, wie kann ich den Interrupt ausschalten?
SysTick_IRQn  15 Cortex-M4 System Tick Interrupt
Muss ich diesen disablen?

Vielen Dank,
Florian

von Ingo (Gast)


Lesenswert?

In den Int Dateien findest du die Handler. Wenn du diesen deaktivierst, 
wie soll dann die Variable dekrementiert werden? Darfst ihn nicht 
deaktivieren!

Ingo

von Florian A. (florian_a)


Lesenswert?

Ich habe das so angedacht:

void delay(__IO uint32_t nTime)
{
  NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  TimingDelay = nTime;

  while(TimingDelay != 0);
  NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  NVIC_Init(&NVIC_InitStructure);
}

Das sollte doch okay sein oder?!

von Matthias K. (matthiask)


Lesenswert?

Warum willst Du den Systick ausschalten? Ist eigentlich dafür gedacht, 
dass er immer läuft. Das System ist so schnell, das sein laufen keine 
Rolle spielt. Eventuell kannst Du in main ein Flag setzen und im 
sytick-Interrupthandler auswerten und ggf. dort zeitweise nichts tun.

Ansonsten nimm einen der reichlich vorhandenen Timer.

Nochwas: volatile bei gemeinsam genutzen Variablen nicht vergessen.

von Florian A. (florian_a)


Lesenswert?

Jo, da hast du wohl Recht. Sicherlich ist das zu vernachlässigen und er 
Springt wohl immer in die ISR und tut aber nichts.
Aber ich dachte ich mach es etwas perfekt und lasse den Systick zwar 
laufen aber nicht in die ISR springen. Muss dann mal probieren ob das so 
klappt wie ich oben geschrieben habe :)

von Oliver J. (skriptkiddy)


Lesenswert?

Florian A. schrieb:
> Aber ich dachte ich mach es etwas perfekt und lasse den Systick zwar
> laufen aber nicht in die ISR springen.

Ich habe in der Systick-ISR das Inkrementieren einer 64-Bit 
Integervariable. Diese repräsentiert die Systemzeit in 10µs-Inkrementen.
Das kostet 5% CPU Zeit bei 72 MHz.

Bei dir kostet das geschätzt 1000 mal weniger CPU-Zeit.

Also ist es doch wirklich egal ob der Controller alle 10ms in die ISR 
springt oder nicht.

Gruß Oliver

von DerDan (Gast)


Lesenswert?

Mit jedem implementierten

"wenn, dann"

wird deine Software komplexer. Und umso komplexer eine SW ist umso mehr 
Fehler enthält sie.

Perfekter wird sie also eher dadurch, dass du solche "wenn, dann" 
vermeiden kannst


mfg

DerDan

von Matthias K. (matthiask)


Lesenswert?

Code in dieser Schreibweise sollte man vermeiden, oder wenigstens 
ordentlich kommentieren. Stell Dir vor, Du bekommst so etwas vorgesetzt, 
um Dich in ein fremdes Projekt einzuarbeiten;

von Matthias K. (matthiask)


Lesenswert?

> Beitrag #2795542 wurde vom Autor gelöscht.
nu iser weg..

von Florian A. (florian_a)


Lesenswert?

Ja, das stimmt schon.
Deswegen habe ich ihn rausgelöscht, sorry!

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.