Forum: Mikrocontroller und Digitale Elektronik Stm32f4 delay


von 12V DC (Gast)


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...

von Mehmet K. (mkmk)


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 :)

von Jan B. (berge)


Lesenswert?

Hi,
ja gibt es. Timer sind eine Möglichkeit, es gibt aber in den STMs auch 
eigene Hardware für Systicks. Beispiele wie du das machen kannst, inkl. 
einer Library für Pause in ms gibt es z.B. hier: 
http://mikrocontroller.bplaced.net/wordpress/?page_id=575

Liebe Grüße,
Jan

von Systick (Gast)


Lesenswert?

Schau in den Exempels von der spl unter systick. Da wird eine Delay 
Funktion mithilfe der systick realisiert,,,

von 12V DC (Gast)


Lesenswert?

Kann sein, dass ich es falsch verstnaden habe, aber wenn ich die Systick 
einstelle springt er doch ALLE ms in den Interrupt, und genau dass will 
ich ja nicht.

von holger (Gast)


Lesenswert?

>aber wenn ich die Systick
>einstelle springt er doch ALLE ms in den Interrupt, und genau dass will
>ich ja nicht.

Dann nimm einen anderen Timer und springe alle ms in
DESSEN Interrupt;)

von 12V DC (Gast)


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.

von holger (Gast)


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.

von 12V DC (Gast)


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.

von holger (Gast)


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.

von 12V DC (Gast)


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?

von holger (Gast)


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
}

von Systick (Gast)


Lesenswert?

Schau einfach in die scheiß examples von stm da steht es schön 
ausführlich dokumentiert drinne...

Beschäftige doch lieber mit Arduino/Avr...

von Jan B. (berge)


Lesenswert?

@12V DC: Schau dir bitte den Link an, den ich oben gepostet habe. Dort 
wird GENAU das gemacht, was du haben willst. Du hast eine Funktion, die 
eine definierte Zeit wartet.

von Arne (Gast)


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.

von Kein Name (Gast)


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.

von Schnauze voll (Gast)


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, ...

von Kein Name (Gast)


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.

von 12V DC (Gast)


Lesenswert?

Ich möchte aber trotzdem wissen, wie ich eine Delay-Funktion schreiben 
kann(braucht man halt ab und zu).

@holger:
ah jetzt versteh ich. Vielen Dank.

von 12V DC (Gast)


Lesenswert?

Und für PWM Aufgaben wird einfach in einem Interrupt hin und her 
geschaltet?

von Pete K. (pete77)


Lesenswert?

12V DC schrieb:
> Und für PWM Aufgaben wird einfach in einem Interrupt hin und her
> geschaltet?

Also ich glaube, Du solltest Dich noch etwas mit Lesen von 
Datenblättern, Application Notes und Beispielen beschäftigen.

Mir scheint es, dass Du die Funktionsweise eines Cortex µC noch nicht 
begreifst.

von Gerhard G. (g_g)


Lesenswert?

Hallo,

hier findest du das was du suchst:

Beitrag "STM32F4Discovery mit CooCox :: GPIO,SDIO,Timer,SoftTimer,USART,printf"

Suche nach sTimer.h/sTimer.c

Stm32F407_blink_06.zip\Stm32F407_blink\Driver\source\sTimer.c
Stm32F407_blink_06.zip\Stm32F407_blink\Driver\include\sTimer.h

in der main()

InitStimer();

dann hast du delay_ms/delay_us


Gruß G.G.

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.