externer Interrupt STM32F303

Gast #4886113
Lesenswert?

Hallo,

ich möchte sobald ein Impuls auf dem Port C, Pin0 vorhanden ist, eine 
LED je nach Zustand an- bzw. ausgeschaltet wird. Verwendet wird der 
STM32F303.

Das Problem ist, dass bei der Interrupt-Handler-Funktion "void 
EXTI0_IRQn(void)" die Fehlermeldung auftaucht: "'EXTI0_IRQn' redeclared 
as different kind of symbol".
Aber diesen Namen finde ich so in der Library "stm32f30x.h".

Ich bin für jeden Rat und Tipp dankbar!
1
void external_clock_detection_Configuration(void)
2
{
3
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
4
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE);
5
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
6

7
    GPIO_InitTypeDef GPIO_InitStructure;
8
    EXTI_InitTypeDef EXTI_InitStructure;
9

10
    // external Clock should be detected on Port C, Pin0
11
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
12
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
13
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
14
    GPIO_Init(GPIOC, &GPIO_InitStructure);
15

16
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource0);
17

18
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
19
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
20
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
21
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
22
    EXTI_Init(&EXTI_InitStructure);
23
}
24

25
void EXTI0_IRQn(void)
26
{
27
  EXTI_ClearITPendingBit(EXTI_Line0);
28
  // blinking LED:
29
  if(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_8)){
30
    GPIO_WriteBit(GPIOE, GPIO_Pin_8, RESET);
31
  }else
32
  {
33
      GPIO_WriteBit(GPIOE, GPIO_Pin_8, SET);
34
  }
35
}
#4886134
Lesenswert?

har schrieb:
> Das Problem ist, dass bei der Interrupt-Handler-Funktion "void
> EXTI0_IRQn(void)" die Fehlermeldung auftaucht: "'EXTI0_IRQn' redeclared
> as different kind of symbol".
> Aber diesen Namen finde ich so in der Library "stm32f30x.h".

Eben deswegen darfste den ja auch nicht mehr als Funktionsnamen 
einsetzen,
denn der ist schon als Enum definiert.

Der korrekte Name für den Interrupt Handler wäre
1
void EXTI0_IRQHandler(void) {
2

3
}

Siehe z.B: 
https://github.com/espruino/Espruino/blob/master/targetlibs/stm32f3/lib/startup_stm32f30x.s
Gast #4886156
Lesenswert?

Jim M. schrieb:
> Der korrekte Name für den Interrupt Handler wärevoid
> EXTI0_IRQHandler(void) {
>
> }

Danke. Die Fehlermeldung ist nun weg.
Aber ein Interrupt wird trotzdem nicht ausgelöst, sobald ein clock am 
Pin vorhanden ist.
Erkennt jemand im Code einen Fehler oder ist die Konfiguration eventuell 
unvollständig?
Gast #4886177
Lesenswert?

die ganze Show mit Cube MX:
a) stm32f3xx_it.c
void EXTI0_IRQHandler(void)
{
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}

b) stm32f3xx_hal_gpio.c
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  UNUSED(GPIO_Pin);
}

die als __weak deklarierte Funktion kann vom Anwender überschrieben und 
erweitert werden.
Gast #4886296
Lesenswert?

wird automatisch generiert und in der main aufgerufen:
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();

schaue jetzt nicht nach, aber die 3 kommen in Frage ...
Ich verwende die HAL um eben nicht alles selbst machen zu müssen.
#4886352
Lesenswert?

rtfm schrieb:
> wird automatisch generiert

Sicher? Geraten?

Nur mal kurz google angeworfen. Aber für nen Timer benötigt man z.B. 
auch in der stdperiph_lib nen explizites
1
TIM_Cmd(TIM2, ENABLE);
nach der ganzen Init-Geschichte.

Edit: Nochmal google angeworfen und diesen Schnippsel gefunden.
https://github.com/fboris/stm32f103_example/blob/master/EXTI/main.c
1
    /* Configure EXTI line */
2
  EXTI_InitStructure.EXTI_Line = EXTI_Line4;
3
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
4
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
5
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
6
  EXTI_Init(&EXTI_InitStructure);
7
  EXTI_InitStructure.EXTI_Line = EXTI_Line5;
8
  EXTI_Init(&EXTI_InitStructure);
9
  EXTI_InitStructure.EXTI_Line = EXTI_Line10;
10
  EXTI_Init(&EXTI_InitStructure);
11
  EXTI_InitStructure.EXTI_Line = EXTI_Line11;
12
  EXTI_Init(&EXTI_InitStructure);
13
  EXTI_InitStructure.EXTI_Line = EXTI_Line12;
14
  EXTI_Init(&EXTI_InitStructure);
15

16
  /* Enable and set EXTI0 Interrupt to the lowest priority */
17
  NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
18
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
19
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
20
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
21
  NVIC_Init(&NVIC_InitStructure);
22
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
23
  NVIC_Init(&NVIC_InitStructure);
24
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
25
  NVIC_Init(&NVIC_InitStructure);

Also nochmal. Doch nur geraten?
#4886439
Lesenswert?

rtfm schrieb:
>>Doch nur geraten?
> schon gemacht, mit STM32F0

Einer Arbeitet mit igrend einer HAL, einer mit stdperiph_lib, einer mit 
CubeMX.

Irgendwo muss halt der Interrupt eingeschaltet werden. Ob das nun 
ausgerechnet in deiner HAL automatisch geschieht, heißt ja nicht dass 
das überall so ist. NVIC_EnableIRQ(irgendwas) fehlt hier anscheinend. 
Ansonsten würde er ja in den Interrupt springen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren