Auf einem STM32F7 mit 160 MHz habe ich einen externen Interrupt mit
Handler geschrieben, der innerhalb von 700 ns ein bestimmtes Signal
ausgeben soll. Dazu habe ich alle verwendeten Funktionen ins ITCM-RAM
gelegt und verzichte auf den HAL.
1 | void EXTI3_IRQHandler(void) __attribute__((section(".itcm_text")));
|
2 | void signalFunktion(void) __attribute__((section(".itcm_text")));
|
3 |
|
4 | void EXTI3_IRQHandler(void)
|
5 | {
|
6 | __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
|
7 | __disable_irq();
|
8 | signalFunktion();
|
9 | __enable_irq();
|
10 | }
|
Innerhalb von 3 Sekunden wird der Interrupt ca. 100.000 Mal ausgelöst
und funktioniert auch so wie gewünscht.
Aber in 20 Fällen wird die Interrupt-Auslösung um ca. 350 ns verzögert,
sodass das Zeitlimit gerissen wird.
Ich nehme an, die Verzögerung liegt an den anderen Aufgaben, die der
STM32 zu erledigen hat. Allerdings verwende ich bisher keine Peripherie
außer GPIO und SDMMC1, wobei letztere inaktiv ist.
Wie kann ich diese Verzögerungen verhindern? Kann ich weitere Teile des
STM32, insb. bestimmte Interrupts (SysTick?) abschalten?