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
voidDelay(__IOuint32_tnCount){
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...
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
voidDelay_1ms(uint32_tdelay)
2
{
3
uint32_ttimeout;
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 :)
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
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.
>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;)
>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.
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.
>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.
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?
@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.
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.
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.
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, ...
>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.
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.
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.