Forum: Mikrocontroller und Digitale Elektronik stm32f303 software interrupt wird nicht ausgelöst


von stip (Gast)


Lesenswert?

Liebes Forum,

ich programmiere einen STM32F303 und verwende auch die stm32_library. An 
einer bestimmten Stelle im Code möchte ich einen Software-Interrupt 
auslösen.
Die Initialisierung für den Software-Interrupt, seht ihr unten im Code.
Den Interrupt auslösen habe ich mit folgendem Code versucht:
1
EXTI->SWIER |= (uint32_t)(0x1 << EXTI_Line2);               // generate software interrupt(EXTI_Line2)
2
        *(volatile uint32_t*)(((uint32_t)&(EXTI->SWIER)) + ((EXTI_Line2) >> 5U) * 0x20U)
3
            |= (uint32_t)(1U << (EXTI_Line2& 0x1FU));


Die Initialisierung:
1
#define EXTI2_Line2_Mask           ((uint32_t)(0x1UL << (EXTI_Line2& 0x1FUL)))
2
#define EXTI2_Line2_BaseAddresse   ((uint32_t)(((EXTI_Line2) >> 5U) * 0x20U))
3
4
uint32_t *pEXTI_Line2;
5
6
void Init_EXTI_2(EXTI_InitTypeDef *pEXTI_InitStruct)
7
{
8
    pEXTI_InitStruct->EXTI_Line = EXTI_Line2;
9
    pEXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt;
10
    pEXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Rising;
11
    pEXTI_InitStruct->EXTI_LineCmd = ENABLE;
12
13
    pEXTI_Line2 = (uint32_t*)(((uint32_t)&(EXTI->PR)) + EXTI2_Line2_BaseAddresse);
14
    *pEXTI_Line2 |= EXTI2_Line2_Mask;                                           // clear pending EXTI 2 interrupt
15
16
    EXTI_Init(pEXTI_InitStruct);                                                // enable software interrupt line
17
18
    NVIC_SetPriority(EXTI2_TS_IRQn, 10);
19
    NVIC_EnableIRQ(EXTI2_TS_IRQn);                                                    
20
}
21
22
//------------------------------------------------------------------------------
23
void EXTI2_IRQHandler(void)
24
{
25
    if((*pEXTI_Line2 & EXTI2_Line2_Mask) != 0U)
26
    {
27
        // Code
28
        *pEXTI_Line2 |= EXTI2_Line2_Mask;                                       // clear pending EXTI 2 interrupt
29
        ade791x_calc_values();
30
    }
31
    else
32
    {
33
//        *pEXTI_Line3 |= EXTIx_LineMaskExceptActiv;                              // clear others pending EXTI x interrupts
34
    }
35
}

Der Interrupt wird leider nicht ausgelöst. Ich bin für jeden Tipp 
dankbar!!
LG

von Stefan F. (Gast)


Lesenswert?

stip schrieb:
1
EXTI->SWIER |= (uint32_t)(0x1 << EXTI_Line2);               // generate software interrupt(EXTI_Line2)
2
        *(volatile uint32_t*)(((uint32_t)&(EXTI->SWIER)) + ((EXTI_Line2) >> 5U) * 0x20U)
3
            |= (uint32_t)(1U << (EXTI_Line2& 0x1FU));

Bist du sicher, dass diese Bit-Schieberei und das gecaste richtig ist? 
Die meisten Konstanten in der CMSIS sind Bitmasken, nicht Bit-Nummern.

Ganz ehrlich: Es fällt mir schwer, diese wenigen Zeilen zu lesen. Ich 
kann darin nichts erkennen. Hast du wenigstens einen Plan, was du da 
gemacht hast?

Das muss anders gehen - lesbar. Dann können wir darüber besser 
diskutieren.

von W.S. (Gast)


Lesenswert?

Also mal abgesehen davon daß du hier mit "pEXTI_InitStruct->..." 
herumhantierst, frage ich dich mal, ob du dir überhaupt Gedanken machst 
beim Plazieren von Casts:

stip schrieb:
> EXTI->SWIER |= (uint32_t)(0x1 << EXTI_Line2);

Wenn schon, dann
EXTI->SWIER |= 1UL << EXTI_Line2;

Bedenke mal, was dein (uint32_t) bewirkt.

W.S.

von Pieter (Gast)


Lesenswert?

moin,

um unter Pascal den externen Int einzurichten brauche ich nur ein paar 
Zeilen.

//GPIOPA,Bit8 einrichten
  AFIO_EXTICR3 := 0;      // PAx
  EXTI_IMR.B8  := 1;      // PA8
  EXTI_EMR.B8  := 1;      // Line8
  EXTI_RTSR.B8 := 1       // Rising trigger
  NVIC_IntEnable(IVT_INT_EXTI9_5);    // Enable External interrupt

der Clock für GPIOA wurde vorher schon eingeschaltet.
Ich bevorzuge das direkte Ansprechen der Register/Bits.

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.