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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.