SysTick - Delay - STM32F4

OP #2794205
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
OP #2794287
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?!
#2794316
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.
OP #2794460
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 :)
#2794478
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
Gast #2795020
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

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