Forum: Mikrocontroller und Digitale Elektronik STM32F3 Externen Interrupt Programmieren


von S. A. (homee)


Lesenswert?

Hallo,

ich versuche grad an meinem STM32F3 (STM32F303VC) den USER-Button als 
Interrupt einzustellen. Es soll eine LED leuchten falls der Interrupt 
detektiert wird. Im Prinzip ein Simples Programm.

Das Problem ist ich kann den Interrupt nicht auffangen das Programm 
Springt immer zum Default-Handler.
(Default_Handler(void) in der Datei vectors_stm32f30x.c)

Hier Der Code
//------------------------------------------
#include<stm32f30x_conf.h>

int main(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    SystemInit();


    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOE, 
ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);


    //lighting LED
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_WriteBit(GPIOE, GPIO_Pin_0, Bit_SET);

    //button interrupt
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

    //Configure Button EXTI line
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);


    //set priotity
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


    NVIC_Init(&NVIC_InitStructure);


    while(1)
    {
    }

}

void EXTI0_IRQHandler(void){
  EXTI_ClearITPendingBit(EXTI_Line0);
  if(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_15)){
    GPIO_WriteBit(GPIOE, GPIO_Pin_15, Bit_RESET);
  }else{
    GPIO_WriteBit(GPIOE, GPIO_Pin_15, Bit_SET);
  }
}

//----SPRNGT nach INT hier REIN-------
//Datei:vectors_stm32f30x.c
void _attribute_ ((section(".after_vectors")))
Default_Handler(void)
{
#if defined(DEBUG)
  __DEBUG_BKPT();
#endif
  while (1)
    {
    }
}
//------------------------------------------


Ich hoffe jemand kann mir dabei weiterhelfen.

von W.S. (Gast)


Lesenswert?

Shaker A. schrieb:
> Hier Der Code...

Oh nein.
Erwarte lieber nicht, daß die Leute sich da drauf stürzen. Lerne lieber, 
wie man einen ordentlichen Startupcode in Assembler selber schreibt 
und wie man ohne die leigige ST-Lib zu Potte kommt. Dann hat sich dein 
Problem bereits in Luft aufgelöst.

W.S.

von RP6conrad (Gast)


Lesenswert?

Es scheint mir das die Benennung von der ISR nicht richtig ist. Damit 
endet das in hardfault handler. (ich gehe davon aus das das Problem beim 
drucken auf die User Button auftreht). Welche IDE verwendet du ?

von tim (Gast)


Lesenswert?

W.S. schrieb:
> Oh nein.
> Erwarte lieber nicht, daß die Leute sich da drauf stürzen. Lerne lieber,
> wie man einen ordentlichen Startupcode in Assembler selber schreibt

Hier ist er ja nun wirklich nicht mehr im Startupcode!
Und der Rest ist auch CMSIS.
Kopfschüttel!

von RP6conrad (Gast)


Lesenswert?

Versuchen sie mal die Handler in startup_stm32f30x.s zuruck zu finden ! 
Hier aus ein Beispiel von STM Lib :
1
/******************************************************************************/
2
/*                 STM32F30x Peripherals Interrupt Handlers                   */
3
/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
4
/*  available peripheral interrupt handler's name please refer to the startup */
5
/*  file (startup_stm32f30x.s).                                               */
6
/******************************************************************************/
7
/**
8
  * @brief  This function handles External lines 5 to 9 interrupt request.
9
  * @param  None
10
  * @retval None
11
  */
12
void EXTI9_5_IRQHandler(void)
13
{ 
14
  if((EXTI_GetITStatus(EXTI_Line6) != RESET))
15
  {
16
    /* Toggle LD1 */
17
    STM_EVAL_LEDToggle(LED1);
18
    
19
    /* Clear the EXTI line 6 pending bit */
20
    EXTI_ClearITPendingBit(EXTI_Line6);
21
  }
22
  else if((EXTI_GetITStatus(EXTI_Line5) != RESET))
23
  {
24
    /* Toggle LD3 */
25
    STM_EVAL_LEDToggle(LED3);
26
    
27
    /* Clear the EXTI line 5 pending bit */
28
    EXTI_ClearITPendingBit(EXTI_Line5);
29
  }  
30
}
31
32
/**
33
  * @brief  This function handles External lines 10 to 15 interrupt request.
34
  * @param  None
35
  * @retval None
36
  */
37
void EXTI15_10_IRQHandler(void)
38
{
39
  if(EXTI_GetITStatus(EXTI_Line13) != RESET)
40
  {
41
    /* Toggle LD2 */
42
    STM_EVAL_LEDToggle(LED2);
43
    
44
    /* Clear the EXTI line 13 pending bit */
45
    EXTI_ClearITPendingBit(EXTI_Line13);
46
  }
47
}

von S. A. (homee)


Lesenswert?

Ich Benutze Eclipse(CDT) (+ Arm-Plugin + ST-Flash + OpenOCD)

Ein Start-up Code hab ich nicht.
Assembler wäre auch Neugebiet für mich.

RP6conrad ich habe die zwei Interrupt-Handler eingefügt die  du/Sie 
gepostet hast, die haben den Interrupt Leider aber auch nicht auffangen 
können.

von Jim M. (turboj)


Lesenswert?

Shaker A. schrieb:
> Ein Start-up Code hab ich nicht.

Doch, den hast Du sogar schon teilweise gepostet: 
Datei:vectors_stm32f30x.c

Dort müssten IMO auch die restlichen Namen der Interrupt Handler stehen.
Es kommt auf die korrekte Schreibweise an.

von S. A. (homee)


Lesenswert?

Es geht jetzt mein Interrupt Handler wird jetzt angenommen.

Es musste vor dem Handler noch ein ,,extern "C"´´.

Bsp:
1
extern "C" void EXTI0_IRQHandler(void)
2
{
3
    /* Make sure that interrupt flag is set */
4
    if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
5
        /* Toggle LED on PE15 */
6
      if(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_15)){
7
      GPIO_WriteBit(GPIOE, GPIO_Pin_15, Bit_RESET);
8
      }else{
9
      GPIO_WriteBit(GPIOE, GPIO_Pin_15, Bit_SET);
10
      }
11
        /* Clear interrupt flag */
12
        EXTI_ClearITPendingBit(EXTI_Line12);
13
    }
14
15
}

Vielen Dank für Euer Engagment.

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.