Forum: Mikrocontroller und Digitale Elektronik externer Interrupt STM32F303


von har (Gast)


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
}

von rtfm (Gast)


Lesenswert?

n ist ein Platzhalter

von Jim M. (turboj)


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

von har (Gast)


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?

von rtfm (Gast)


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.

von Nico W. (nico_w)


Lesenswert?

Ich bin jetzt nicht so der HALer, aber muss man dort nicht auch über nen 
NVIC den Interrupt mal anschalten?

von rtfm (Gast)


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.

von Nico W. (nico_w)


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?

von rtfm (Gast)


Lesenswert?

>Doch nur geraten?
schon gemacht, mit STM32F0

von Nico W. (nico_w)


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.

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.