Forum: Mikrocontroller und Digitale Elektronik Interrupt beim STM34F4


von Fragender (Gast)


Lesenswert?

Howdie,

ich programmiere mit einem STM32F407 Mikrocontroller und möchte gerne 
wissen ob mir jemand sagen kann wie ich für kurze Zeit einen Interupt 
disablen und anschließen wieder enablen kann?
Kann mir jemand einen Befehl dazu nennen?
Vielen dank schonmal!!

von STM32 Gast (Gast)


Lesenswert?

es müsste so funktionieren:
NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;

allerdings musst du dazu deine initstruktur wieder aufrufen.

Mein Tipp wäre du suchst das passende Bit im Register und löschst es 
selbst ohne die Struktur.

von Matthias (Gast)


Lesenswert?

Fragender schrieb:
> Howdie,
>
> ich programmiere mit einem STM32F407 Mikrocontroller und möchte gerne
> wissen ob mir jemand sagen kann wie ich für kurze Zeit einen Interupt
> disablen und anschließen wieder enablen kann?
> Kann mir jemand einen Befehl dazu nennen?
> Vielen dank schonmal!!

Was genau möchtest du denn machen? Oft ist es nicht erforderlich 
und/oder empfehlenswert in das laufende Interruptsystem einzugreifen.

von Fragender (Gast)


Lesenswert?

ich messe Frequenzen mit dem Input Capture Mode
dazu wird ein Interrupt aufgerufen, mein Problem:

Die Frequenzen werden gemessen, alles Supi:
ABER für eine kurze zeit bricht ab und zu die gemessene Frequenz ein und 
ich dachte dass liegt vllt daran, dass ein andere Interrupt die 
frequenzmessung stört?!

von Marco (Gast)


Lesenswert?

Fragender schrieb:
> Die Frequenzen werden gemessen, alles Supi:
> ABER für eine kurze zeit bricht ab und zu die gemessene Frequenz ein und
> ich dachte dass liegt vllt daran, dass ein andere Interrupt die
> frequenzmessung stört?!

Oder der Timer läuft über?

von Matthias (Gast)


Lesenswert?

Fragender schrieb:
> ich messe Frequenzen mit dem Input Capture Mode
> dazu wird ein Interrupt aufgerufen, mein Problem:
>
> Die Frequenzen werden gemessen, alles Supi:
> ABER für eine kurze zeit bricht ab und zu die gemessene Frequenz ein und
> ich dachte dass liegt vllt daran, dass ein andere Interrupt die
> frequenzmessung stört?!

Wie ich mir dachte. Grundsätzlich ist der Interrupt-Controller des 
Cortex-M sehr clever und bestens fuer diesen Fall gerüstet. 
Ideallerweise hat dein Capture-Interrupt die höchste Priorität im NVIC.
http://www.keil.com/pack/doc/cmsis/core/html/group___n_v_i_c__gr.html#ga5bb7f43ad92937c039dee3d36c3c2798
Damit ist sichergestellt dass er nach der höchsten Latenz (16 cycles) 
bedient wird und alle möglichen aktiven Interrupts verdrängt.
Je nach Frequenz ist es wichtig dass dieser Interrupt zwischen 2 
Interrupt-triggerenden Flanken fertig wird. Im Zweifel musst du dafür 
unwichtige Dinge aus der ISR auslagern.
Andere Interrupts zu deaktivieren führt hingegen bestenfalls zu 
verpassten Interrupts auf die du im Zweifel gerne reagiert hättest (nur 
eben später).

von Fragender (Gast)


Lesenswert?

@ Matthias, danke schonmal,

also genau ich messe 2 Frequenzen und während dessen empfange und sende 
ich Daten via USART, wenn ich USART ausschalte klappt das mit der 
Frequenzmessung wunderbar, sobald ich USART aber einschalte kommt diese 
Schwankung. Jetzt muss ich ja irgendwie für die IRQ des Input-Capture 
versuchen die USART-Kommunikation auszuschalten, oder wie versteh ich 
das????

von Jan B. (berge)


Lesenswert?

Nein, du musst die Priorität des Input-Capture IRQs höher als die des 
USART IRQs setzen, den Rest regelt der IRQ Controller.

LG Jan

von unleashed (Gast)


Lesenswert?

Du musst/solltest im NVIC deinem Timer eine höhere Priorität geben, als 
deinem USART. Du brauchst den Interrupt nicht zu deaktivieren.

Ist dein Programm dann in der USART_ISR, kann diese unterbrochen werden 
um deine TIMER_ISR auszuführen.
Ist die TIMER_ISR fertig, wird wieder in der USART_ISR weiter 
gearbeitet.

von Fragender (Gast)


Lesenswert?

0 ist die höchste Priorität!

also in entwa so?

InputCapture:

NVIC_InitTypeDef NVIC_InitStructure;

// NVIC init
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

USART:

NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStruct;

// NVIC init
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; 
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure);

von Fragender (Gast)


Lesenswert?

:-*

LÄUFT!!

von Matthias (Gast)


Lesenswert?

Genau so :)

von Fragender (Gast)


Lesenswert?

Danke!

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.