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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Qbex_12b (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.