Stm32f4 delay

Gast #3544558
Lesenswert?

Ich habe folgende Frage:
Wenn ich diese Funktion auflade, wartet das Board zwar eine gewisse 
Zeit(je nach Parameter), aber genau ist sie keineswegs.
1
void Delay(__IO uint32_t nCount) {
2
  while(nCount--) {
3
  }
4
}
Kann mir jemand sagen, wie lange(genau!!) der Controller 'nix' macht, 
wenn ich 1(1000) übergebe?
Gibt es irgendeinen Weg, eine delay() funktion zu schreiben, wie ich sie 
von AVR her kenne? Alle 10 sec(z.B.) in die Systick springen ist also 
KEINE Alternative...
#3544574
Lesenswert?

SysTick ist schon das richtige Stichwort.
Diesen stellst Du z.Bsp. auf 1ms ein und inkrementierst dort einen 
globalen Zaehler.
Deine DelayFunktion könnte dann vielleicht so aussehen:
1
void Delay_1ms( uint32_t delay )
2
{
3
  uint32_t timeout;
4
  timeout = msec_1 + delay;
5

6
  while(1)
7
  {
8
    if (msec_1 > timeout)
9
      return;
10
  }
11
}

Benutze ich bei der Intitialisierung des Boards. Ansonsten gibt es 
effizientere Möglichkeiten, sich die Zeit totzuschlagen :)
Gast #3544660
Lesenswert?

>Ich will aber, dass der Timer(egal welcher) NUR in den Interrupt
>springt, wenn ICH das will, und dass das nicht eine unendliche Tätigkeit
>wird.

Warum nicht? Das kratzt den ARM doch nicht die Bohne.
Ausserdem kann man so einen Timerinterrupt auch gleich
dazu benutzen um Taster abzufragen und noch andere Dinge
zu erledigen. Brauchen tut man den doch sowieso fast immer.
Gast #3544661
Lesenswert?

Entschuldigt die falsche Wortwahl. Nicht Interrupt sondern Delay
Aber wenn ich die Systick(e.g.) auf 1ms einstelle, dann hat er doch alle 
1ms. ein Delay und nicht wie ich will an den Stellen im Programm, an 
denen ich ein Delay haben möchte.

Ein Vergleich:
Bei den Arduino-Skechen: Ich konnte doch an allen Stellen ein delay(ms) 
einfügen. Eine Solche Funktion hätte ich auch gerne.
Gast #3544667
Lesenswert?

>Aber wenn ich die Systick(e.g.) auf 1ms einstelle, dann hat er doch alle
>1ms. ein Delay

Nein, er springt alle 1ms in den Systick. Dort sollst du ja kein
delay machen, sondern deinen Delaycounter runterzählen.
Gast #3544674
Lesenswert?

Ich raffs net:
Also wenn ich den Systick auf 1ms einstelle und dann dort iwas 
runterzähle dann is das doch genausowenig genau, wie wenn ich das ohne 
machen würde. und da die Systick ausgefürt wird(mit delay) wird doch 
trotzdem alle ms gewartet?
Gast #3544697
Lesenswert?

>Ich raffs net:

Kleines Beispiel mal eben so zusammengefummelt.
Im Systick wird nicht gewartet, gewartet wird in
der while(1) der main().
1
/**
2
  ******************************************************************************
3
  * @file    main.c
4
  */ 
5

6
/* Includes ------------------------------------------------------------------*/
7
#include <stdint.h>
8

9
#include "misc.h"
10
#include "stm32f4xx.h"
11
#include "stm32f4xx_gpio.h"
12
#include "stm32f4xx_rcc.h"
13
#include "stm32f4xx_tim.h"
14

15
#include "leds.h"
16

17
void Delay1ms(uint32_t nCount);
18
volatile uint32_t delay1ms;
19

20
/**
21
  * @brief  Main program
22
  */
23
int main(void)
24
{
25
  // Discovery Board LEDs
26
  LEDs_Init();
27
  SysTick_Config(SystemCoreClock/1000);
28

29
  while (1)
30
  {
31
    LED_ORANGE_ON;
32
    Delay1ms(100);
33
    LED_ORANGE_OFF;
34
    Delay1ms(300);
35
  }
36
}
37

38
/**
39
  * @brief  This function handles SysTick Handler.
40
  * @param  None
41
  * @retval None
42
  */
43
void SysTick_Handler(void)
44
{
45
 if(delay1ms) delay1ms--;
46
}
47

48
/**
49
  * @brief  Delay Function.
50
  * @param  nCount:specifies the Delay time length.
51
  * @retval None
52
  */
53
void Delay1ms(uint32_t nCount)
54
{
55
  delay1ms = nCount;
56
  while(delay1ms);
57
}
Gast #3545223
Lesenswert?

12V DC schrieb:

> Gibt es irgendeinen Weg, eine delay() funktion zu schreiben
Der Cortex-M3 und sicher auch der M4 haben einen sog. cycle counter 
drin.
Der wird mit jedem ALU Takt um eins inkrementiert. Ist 32bit breit, kann 
keinen Interrupt auslösen. Um nur mal ein paar µs zu warten (aktiv) kann 
man ihn nehmen.
Gast #3545234
Lesenswert?

Tja, dumm gelaufen. Die meisten Leute nehmen so einen Stm32 für 
Aufgaben, bei denen man sowieso kein delay() benutzen kann.

Wenn dein Programm mehrere Echtzeitaufgaben gleichzeitig bearbeiten 
soll, sind SysTick und Interrupt ideal. Wenn du nur ein einfaches 
delay() brauchst, hast du mit Stm32 mehr Aufwand als mit Arduino.
Gast #3545249
Lesenswert?

Kein Name schrieb:
> Wenn du nur ein einfaches
> delay() brauchst, hast du mit Stm32 mehr Aufwand als mit Arduino.

Das gilt auch für Leute, die nur bis 20 Zählen können. Denn wenn ein IC 
mehr Pins hat, gilt es als schwierig, komplex, zu groß, zu schnell, ...

Aktives Warten ist einem schlechten Design geschuldet. Wenn man 's 
braucht kann man auf der Stelle treten. Das geht bei 4 Bit, 8 Bit, 16 
Bit, 32 Bit, bei Intel, NXP, Atmel, MicroChip, FreeScale, Infineon, 
Texas, Renesas, ...
Gast #3545303
Lesenswert?

>Aktives Warten ist einem schlechten Design geschuldet.

So klar ist das nicht. Wenn dein Programm nur eine einzige Aufgabe 
erledigen muss, ist es das beste Design. Und bei dem Preisverfall der 
Discovery Kits lohnt sich die Einarbeitung in kleine MCs eigentlich 
nicht mehr.

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