Forum: Mikrocontroller und Digitale Elektronik STM32 __enable_irq


von Uli N. (uln)


Lesenswert?

Von früheren Projekten für den STM32F405 ist mir bekannt, dass
die Funktion MX_NVIC_Init() als letzte Anweisung immer ein __enable_irq 
enthiehlt (damals erstellt mit dem Atollic TrueStudio).

Mir ist nun aufgefallen, dass ein vor einigen Monaten mit der STMcubeIDE 
für den STM32G$/$ erstelltes Programm, welches den Timer4-Interrupt 
verwendet funktioniert hat, obwohl ich in den Sourcen nirgends ein 
__enable_irq oder etwas ähnliches finden konnte.

Gleiches, wenn ich mir Sourcen aus dem Internet, z.B.
https://github.com/VojislavM/STM32_UART_IRQ
anschaue - nie finde ich die Stelle, an der der Interrupteingang der CPU 
aktiviert wird. Übersehe ich den, oder ist bei den ARMs dieser Eingang 
per defaul aktiviert und das __enable_irq in den alten Sourcen 
überflüssig?

von inkontinent (Gast)


Lesenswert?

Uli N. schrieb:
> Gleiches, wenn ich mir Sourcen aus dem Internet, z.B.
> https://github.com/VojislavM/STM32_UART_IRQ
> anschaue - nie finde ich die Stelle, an der der Interrupteingang der CPU
> aktiviert wird.

So so, alle "Sourcen aus dem Internet", stellvertretend dafür die
obige Quelle? Ganz sicherlich nicht.

Verwende CubeMX, erstelle ein Projekt mit Verwendung des NVIC,
dann wirst du ganz einfach sehen wie dort Interrupts aktiviert
werden. Wenn du dazu zu faul bist suchst du dir eben ein
geeignetes Projekt wo du nachlesen kannst, aber nicht das
oben genannte.

Und nein, es ist nicht ein einzelnes globales "__enable_irq"
sondern ein differenziertes Vorgehen da es viele Interrupt-
Quellen und viele Interrupt-Levels gibt.

von Uli N. (uln)


Lesenswert?

inkontinent schrieb:
> So so, alle "Sourcen aus dem Internet", ..

Mir ist schleierhaft, wie Du auf "alle" kommst!

> Verwende CubeMX, ...

Natürlich habe ich auch CubeMX verwendet (u.a. wurde das erwähnte 
Projekt für den STM32G474 - nicht "STM32G$/$" - damit erstellt) um der 
Sache nachzugehen - und eben mit dem Ergebnis, dass CubeMX kein 
__enable_irq einfügt!

> Und nein, es ist nicht ein einzelnes globales "__enable_irq"
> sondern ein differenziertes Vorgehen da es viele Interrupt-
> Quellen und viele Interrupt-Levels gibt.

Natürlich ist mir nicht entgangen, dass für jede Interrupt-Quelle erst 
einmal der NVIC configuriert werden muss - aber darauf bezog sich meine 
Frage nicht!

Es geht allein um jenes Bit, welches mittels der Funktionen
1
/**
2
  \brief   Enable IRQ Interrupts
3
  \details Enables IRQ interrupts by clearing the I-bit in the CPSR.
4
           Can only be executed in Privileged modes.
5
 */
6
__STATIC_FORCEINLINE void __enable_irq(void)
7
{
8
  __ASM volatile ("cpsie i" : : : "memory");
9
}
10
11
12
/**
13
  \brief   Disable IRQ Interrupts
14
  \details Disables IRQ interrupts by setting the I-bit in the CPSR.
15
           Can only be executed in Privileged modes.
16
 */
17
__STATIC_FORCEINLINE void __disable_irq(void)
18
{
19
  __ASM volatile ("cpsid i" : : : "memory");
20
}
in cmsis_gcc.h manipuliert werden kann!

???Nichts besseres zu tun, als mich hier anzustänkern, wenn Du offenbar 
keinen Bock hast zu helfen???

In der Sache bin ich weitergekommen.

Im Programming Manual hab' ich die Spalte "Reset value" in "Table 3." 
unter "2.1.3 Core registers" übersehen (vermutlich weil ich auf eine 
Registerbeschreibung a la Referece Manual eingestellt war).
Aus der geht hervor, dass PRIMASK tatsächlich den Reset Value 0x00000000 
hat und damit zu meiner Überraschung der "globale" Interrupt-Eingang der 
CPU nach dem Reseet aktiv ist, mithin damals das abschließende 
__enable_irq in MX_NVIC_Init() überflüssig war.

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.