STM32F030: Probleme beim wecken aus dem STOP Mode

OP #4853065
Lesenswert?
• ▲
▼
Hallo zusammen,

Ich rätsel seid geraumer Zeit mit den STOP Mode einer Applikation rum. 
Verwendung findet ein STM32F030F4P6 Controller. Innerhalb meiner 
Hauptschleifer schicke ich ihn mittels folgender Befehle schlafen:
1
      // Check if System has to be powered down
2
      if ((disablePowerDown != 1) & ((idleCount >= idlePowerDown) || (noChangeCount >= noChangePowerDown)))
3
      {
4
        PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);
5
      }

Das aufwecken will allerdings nicht wirklich klappen. Die Eingänge für 
den Wakeup sind folgendermaßen konfiguriert.
1
void initInputs(void)
2
{
3
  GPIO_InitTypeDef io;
4

5
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOF, ENABLE);
6

7
  io.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
8
  io.GPIO_OType = GPIO_OType_PP;
9
  io.GPIO_PuPd = GPIO_PuPd_DOWN;
10
  io.GPIO_Mode = GPIO_Mode_IN;
11
  io.GPIO_Speed = GPIO_Speed_2MHz;
12
  GPIO_Init(GPIOA,&io);
13

14
  io.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
15
  io.GPIO_OType = GPIO_OType_PP;
16
  io.GPIO_PuPd = GPIO_PuPd_DOWN;
17
  io.GPIO_Mode = GPIO_Mode_IN;
18
  io.GPIO_Speed = GPIO_Speed_2MHz;
19
  GPIO_Init(GPIOF,&io);
20
}
21

22
void initEXIT(void)
23
{
24
    EXTI_InitTypeDef   EXTI_InitStructure;
25
    NVIC_InitTypeDef   NVIC_InitStructure;
26

27
    /* Enable SYSCFG clock */
28
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
29

30
    /* Connect EXTI0 Line to PA0 pin */
31
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
32
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);
33
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource2);
34

35
    /* Configure EXTI0 line */
36
    EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1 | EXTI_Line2;
37
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
38
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
39
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
40
    EXTI_Init(&EXTI_InitStructure);
41

42
    /* Connect EXTI0 Line to PA0 pin */
43
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource0);
44
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource1);
45

46
    /* Configure EXTI0 line */
47
    EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;
48
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
49
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
50
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
51
    EXTI_Init(&EXTI_InitStructure);
52

53
      /* Enable and set Button EXTI Interrupt to the lowest priority */
54
      NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
55
      NVIC_InitStructure.NVIC_IRQChannelPriority = 0x03;
56
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
57

58
      NVIC_Init(&NVIC_InitStructure);
59

60
      NVIC_InitStructure.NVIC_IRQChannel = EXTI2_3_IRQn;
61
      NVIC_InitStructure.NVIC_IRQChannelPriority = 0x03;
62
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
63

64
      NVIC_Init(&NVIC_InitStructure);
65

66
}
67

68
void EXTI0_1_IRQHandler(void)
69
{
70
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
71
  {
72
    /* Clear the USER Button EXTI line pending bit */
73
    EXTI_ClearITPendingBit(EXTI_Line0);
74
  }
75
  if(EXTI_GetITStatus(EXTI_Line1) != RESET)
76
  {
77
    /* Clear the USER Button EXTI line pending bit */
78
    EXTI_ClearITPendingBit(EXTI_Line1);
79
  }
80
}
81

82
void EXTI2_3_IRQHandler(void)
83
{
84
    if(EXTI_GetITStatus(EXTI_Line2) != RESET)
85
    {
86
      /* Clear the USER Button EXTI line pending bit */
87
      EXTI_ClearITPendingBit(EXTI_Line2);
88
    }
89
    if(EXTI_GetITStatus(EXTI_Line3) != RESET)
90
    {
91
      /* Clear the USER Button EXTI line pending bit */
92
      EXTI_ClearITPendingBit(EXTI_Line3);
93
    }
94
}

Damit man das ganze, wenn benötigt, im gesamten Kontext betrachten kann, 
habe ich das komplette Source File auch angehängt.

Innerhalb der Systickroutine erzeuge ich mir einen 1 Sekundentakt der 
mir in der Variable State ein Bit toggelt. Sobald der Controller in Stop 
geht ist damit Schluss, ist verständlich. Leider weckt der Controller 
bei einer positiven Flanke nicht auf.

Zuvor habe ich es versucht den Controller über den Mode 
PWR_STOPEntry_WFE zu stoppen. Dann natürlich die EXTI Konfig auf Event 
gestellt und ohne NVIC. Leider das selbe Problem.

Ich habe das Gefühl, das ich irgendwo im RM etwas wichtiges überlesen 
habe. Finde aber gerade den Wald vor lauter Bäumen nicht. Es wäre super 
wenn jemand von Euch einen Wink in die richtige Richtung geben könnte.

Gruß,
Markus
Angehängte Dateien:
#4853177
Lesenswert?
• ▲
▼
Schau mal im RM nach ob Edge Trigger überhaupt ohne Takt funktionieren. 
Meistens funktionieren dann nur Level Trigger.

Übrigens funktioniert der Debugger ohne Takt auch nicht mehr, und sehe 
in geposteten Code keine andere Möglichkeit zu erkenne ob der Interrupt 
auftrat oder nicht.

Edit: nein, Zipfile hab ich mir nicht angeschaut...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.