Interrupt beim STM34F4

Gast #3519724
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.
Gast #3519727
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.
Gast #3519735
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?!
Gast #3519772
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).
Gast #3519786
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????
Gast #3519800
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.
Gast #3519806
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);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren