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
In den Int Dateien findest du die Handler. Wenn du diesen deaktivierst, wie soll dann die Variable dekrementiert werden? Darfst ihn nicht deaktivieren! Ingo
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?!
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.
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 :)
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
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
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;
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.