Forum: Mikrocontroller und Digitale Elektronik STM32 L4 Sleepmode mit RTOS und LoRa Stack


von Qbex_12b (Gast)


Lesenswert?

Hallo liebe Leute

Leider hänge ich gerade beim Problem das mein Prozessor nicht in den 
Sleep-Mode gehen will. Ich habe folgenden Aufbau:

STM32L476rg (Nucleo Board)
SX1272DAS (LoRa Modul)

Auf dem Prozessor läuft ein RTOS mit 4 Tasks. Dazu habe ich aber noch 
ein LoRa-Stack (I-CUBE-LRWAN) von ST am Laufen. Funktionell macht das 
Ding was es soll aber sobald ich den Proz. in einen Stromsparmodus (am 
Liebsten STOP1) versetzen will, klappt dies einfach nicht. Der Task der 
den Sleep-Mode aufrufen soll ist wie folgt aufgebaut:
1
/* SleepTask function */
2
void SleepTask(void const * argument)
3
{
4
5
  /* USER CODE BEGIN 5 */
6
  /* Infinite loop */
7
  for(;;)
8
  {
9
    uTaskFlags = xEventGroupWaitBits(xTaskOrderFlags, Sleep_Task, pdTRUE, pdTRUE, portMAX_DELAY);
10
      if((uTaskFlags & Sleep_Task) == Sleep_Task){
11
12
        /* Go to stop mode with rtc*/
13
        while(ReadyToSleep == 0);
14
        ReadyToSleep = 0;
15
        PRINTF("Start Sleeping\n\r");
16
17
        /* suspend scheduler*/
18
        vTaskSuspendAll();
19
20
        //HAL_NVIC_DisableIRQ(RTC_Alarm_IRQn);
21
        //HAL_NVIC_DisableIRQ(RTC_WKUP_IRQn);
22
23
        //HAL_NVIC_ClearPendingIRQ(RTC_Alarm_IRQn);
24
        //HAL_NVIC_ClearPendingIRQ(RTC_WKUP_IRQn);
25
26
        /* disables Interrupt requests, interrupts will still be able to wake up the system*/
27
        __disable_irq();
28
29
        __HAL_RCC_PWR_CLK_DISABLE();
30
        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
31
32
        HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
33
34
        /* System sleeps here*/
35
36
        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
37
        /* on wake up, restore system clock*/
38
        HAL_RCC_DeInit();
39
        SystemClock_Config();
40
41
        /* check interrupts now*/
42
        __enable_irq();
43
44
        /*resume scheduler*/
45
        PRINTF("stop sleeping\n\r");
46
        xTaskResumeAll();
47
48
        xEventGroupSetBits(xTaskOrderFlags, Sensor_Task);
49
        //uTaskFlags = xEventGroupClearBits(xTaskOrderFlags, Sensor_Task | Battery_Task | LoRa_Task | Sleep_Task);
50
51
      }
52
    vTaskDelay(100);
53
  }
54
  /*step to next Task*/

Wie ihr sehen könnt habe ich schon diverses versucht mit Interrupts auf 
dem NVIC ausschalten usw. jedoch bleibt der Stromverbrauch bei etwa 5mA, 
dieser sollte beim STOP2 auf einige uA fallen. Ausserdem habe ich 
bemerkt dass der LoRa-Stack die RTC in mässigem Umfang benutzt. 
villeicht den mal auschalten?

von schlaflos (Gast)


Lesenswert?

Qbex_12b schrieb:
> aber sobald ich den Proz. in einen Stromsparmodus (am
> Liebsten STOP1) versetzen will, klappt dies einfach nicht.

Was genau klappt nicht?

>  jedoch bleibt der Stromverbrauch bei etwa 5mA,

Stromverbrauch von dem µC oder der Schaltung.

Keine Leckströme über Portpins etc.?

von Qbex_12b (Gast)


Lesenswert?

Gemäss Datenblatt sollte der uC im STOP-Modus wenige uA verbrauchen.
Steppe ich mit dem Debugger durch den Code wird zwar die STOP Funktion 
aufgerüfen und der Code bleibt in einem WFI (Wait for Interrupt) hängen. 
Jedoch wird der Stromverbrauch nicht kleiner, dieser bleibt bei etwa 
4mA. Zusätzliche Peripherie wurde Ausgemessen, der Rest der Schaltung 
braucht etwa 200uA somit geht noch ziemlich viel Strom durch den uC.

Andere Frage, wenn man auf dem Nucleo-Board ein ADC braucht, muss man 
den selbst ausschalten oder schaltet der automatisch ab wenn die STOP 
funktion aufgerufen wird?

Beste Grüsse

von Jim M. (turboj)


Lesenswert?

> Steppe ich mit dem Debugger durch den Code

Der Debugger funktioniert bei ARM-basierten µC nur bei aktiver Clock - 
der kann also nicht besonders tief schlafen.

Stromverbrauch im Tiefschlaf kann man vernünftig nur ohne angesteckten 
Debugger messen.

von Qbex_12b (Gast)


Lesenswert?

Jim M. schrieb:
> Der Debugger funktioniert bei ARM-basierten µC nur bei aktiver Clock -
> der kann also nicht besonders tief schlafen.
>
> Stromverbrauch im Tiefschlaf kann man vernünftig nur ohne angesteckten
> Debugger messen.



Ah Okay, das erklärt so einiges...

Aber Reicht es wenn das USB-Kabel vom PC getrennt wird,oder müssen die 
Jumper vom Debugger auch noch entfernt werden?

Der uC wird separat über 3.3V gespiesen.

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.