Forum: Mikrocontroller und Digitale Elektronik STM32F030: Probleme beim wecken aus dem STOP Mode


von Markus S. (acepilot)


Angehängte Dateien:

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

: Bearbeitet durch User
von Jim M. (turboj)


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...

: Bearbeitet durch User
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.