Forum: Mikrocontroller und Digitale Elektronik stm32 Pin im laufenden Programm aktivieren/deaktivieren


von STM (Gast)


Lesenswert?

Hallo, ich möchte im laufenden Programm einen Pin 
deaktivieren/akitivieren um mir für bestimmte Zustände keine Interrupts 
einzufangen. Die Deaktivierung des Interrupts ist so nicht möglich, da 
ich nur im Hauptprogramm das IT-Flag abfrage und das ja immer gesetzt 
wird. Gibt es also eine Möglichkeit dein Eingang tot zu schalten oder 
muss man den als Ausgang mit PU oder PD schalten? Das Locken scheint ja 
nur zu nützen wenn man ihn als Ausgang nutzt.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Mit den Befehlen:
1
asm volatile ("cpsid i"); // oder __disable_irq()
2
  : : :
3
asm volatile ("cpsie i"); // oder __enable_irq()
Wird jeder Interrupt deaktiviert und wieder aktiviert.

von STM (Gast)


Lesenswert?

Wie würde das für Timer4_CC3 aussehen?

__disable_irq(Tim4, TIM_IT_CC3) ???


Und sind damit auch die Flags deaktiviert? Oder nur der Sprung in die 
jeweilige ISR?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Alle Interrupts können auch so einzeln deaktiviert werden:
1
  NVIC->ICER[0] = 0xFFFFFFFF;
2
  NVIC->ICER[1] = 0xFFFFFFFF;
3
  NVIC->ICER[2] = 0xFFFFFFFF;
4
  NVIC->ICER[3] = 0xFFFFFFFF;
5
  NVIC->ICER[4] = 0xFFFFFFFF;
6
  NVIC->ICER[5] = 0xFFFFFFFF;
7
  NVIC->ICER[6] = 0xFFFFFFFF;
8
  NVIC->ICER[7] = 0xFFFFFFFF;

Jedes einzelne Bit ist ein Interrupt, der Cortex-M3 hat bis zu 256 
Interrupts, daher sind es 8*32 Bit.

Wie Du den vorigen Zustand sicherst und den Interrupt wieder aktivierst 
bekommst Du sicher raus. Auch welches Bit welcher Interrupt ist.
Steht irgendwo in der Doku.

PS: Diese 8 Zeile deaktivieren natürlich alle Interrupts.

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.