STM32F411CEU: LowPower

Odpovědět
AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

STM32F411CEU: LowPower

Příspěvek od AstroMiK » 28 říj 2023, 17:56

Nemáte někdo zkušenost s uspáváním desky BlackPill s procesorem STM32F411CEU?
Tahle verze: https://stm32-base.org/boards/STM32F411 ... -Pill-V2.0

Už se s tím trápím dost dlouho a nemohu to nějak rozběhat.

Začal jsem tím, že jsem zkusil ten nejjednodušší ukázkový příklad (TimedWakeup) z knihovny:
https://github.com/stm32duino/STM32LowPower


Musel jsem tam doplnit definici LED_BUILTIN pinu a sériové linky, protože přes USB konektor se mi deska v PC nehlásí jako COM port.

I přes tyto dodělávky ukázkového příkladu jsem zjistil, že funkce "LowPower.deepSleep(1000);" sice procesor dokonale uspí,
ale už není žádná šance, jak by se po nastaveném čase probudil.

Zkusil jsem pak místo "LowPower.deepSleep(1000);" zadat jen "LowPower.sleep(1000);"
I tento příkaz způsobil uspání procesoru, ale vzbuzení muselo být provedeno "ručně" - odesláním nějakého znaku do sériové linky.

V knihovně jsem našel ještě funkci "LowPower.idle()", ale zdá se mi, že funguje stejně jako sleep().
Neměřil jsem tedy přesný odběr, takže možná vypíná jiné periférie, ale na venek se chová stejně jako sleep.
Zastaví procesor a čeká na znak ze sériové linky.

Po různých testech jsem náhodou objevil, že když se těsně před příkaz "LowPower.sleep(1000);" zadá nějaký sériový print, tak se ten sleep nevykoná.
Úplně se ignoruje - jako by tam nebyl.


Níže přikládám upravený ukázkový příklad a moje nastavení Arduino IDE pro desku BlackPill.

Zkusil jsem i ten ukázkový příklad s vnitřním RTC, ale taky nefunguje. Jak se provede "deepSleep()", procesor usne a už ho nevzbudí nic než reset.

K desce nemám připojeno vůbec nic dalšího, akorát na pinech PA9 a PA10 mám převodníček USB/TTL, na kterém na PC odposlouchávám Serial.printy.

Tak prosím poraďte, jak dál?

Kód: Vybrat vše

// Příklad LowPower doplněný o sériovou linku
//        a definici pinu LED_BUILTIN
//------------------------------------------------

#include "STM32LowPower.h"

#define LED_BUILTIN   PC13                    // modrá LED přímo na desce

HardwareSerial Serial1(PA10, PA9);            // přes USB žádná komunikce nejede (USB se nehlásí v PC jako sériový port), tak je odposlech na pinech PA10, PA9

//--------------------
void setup()
  {  
    LowPower.begin();  
    pinMode(LED_BUILTIN, OUTPUT);
    Serial1.begin(9600);
  }
//--------------------

//--------------------
// v případě, že by fungovaly LowPower funkce podle očekávání, měla by LED blikat periodou 300 + 2000 + 700 [ms] = 3 sekundy
void loop()
  {
    Serial1.print("Start loopu: millis() = ");
    Serial1.println(millis());
    
    digitalWrite(LED_BUILTIN, HIGH);          // HIGH modrou LED zhasíná
    delay(300);

//    Serial.println('X');                      // po doplnění tohoto Serial printu se následující "LowPower.sleep" nebo "LowPower.iddle" ignoruje = LED bliká s periodou 1 sekunda
                                              //   na "LowPower.deepSleep" nemá vliv - DeepSleep se prostě zastaví a KONEC

//--------------
// tady bych očekával něco jako "delay(2000)", ale s úsporou energie
    LowPower.sleep(2000);                     // správně se uspí, odběr proudu klesne, ale probouzí se až příjmem znaku na sériové lince
//    LowPower.idle(2000);                    // zdá se to úplně stejné jako "LowPower.sleep()" o řádku výše
//    LowPower.deepSleep(2000);               // úplně chcípne = až do resetu už se nevzbudí, na sériovou linku nereaguje
//--------------


    Serial1.print("Po probuzeni: millis() = ");
    Serial1.println(millis());

    digitalWrite(LED_BUILTIN, LOW);           // LOW modrou LED rozsvěcuje
    delay(700);
  }
//--------------------


nastaveni-desky.gif

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: STM32F411CEU: LowPower

Příspěvek od peterple » 28 říj 2023, 22:12

Nuž asi to tak priamočiaro nepôjde. Vyzerá to tak že zobudiť ťa vie prerušenie ale z nejakého dôvodu časovať nepočíta a prerušenie od neho teda neprichádza.

Tiež nečakaj že uspíš CPU a zároveň ti bude počítať čas pre millis(). Tieto dve veci sa prirodzene vylučujú.

Začať treba šúdiom aké módy konkrétny MCU má v DS a potom asi aj tým ako to tie arduino knižnice používajú.
https://www.st.com/resource/en/datashee ... df#page=26

ALebo si rovno napísať svoje vlastné podľa potreby.


AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: STM32F411CEU: LowPower

Příspěvek od AstroMiK » 29 říj 2023, 15:56

Díky za reakce.

Začal jsem studovat ty registry a vypadá to, že se tam někde špatně nastavuje registr pro "RTC alarm", protože RTC nevyvolává přerušení, které by sleep režim ukončilo.

Pročetl jsem si i tu diskusi, na kterou odkazuje Caster, a jak je tam ten příklad s instrukcí "wfi", tak funguje docela pěkně.
Sice nečasuje úplně přesně, ale v mém programu mi to vůbec nevadí.
Proud samotného procesoru se tím sníží z asi 20mA na krásných 7mA. To by mi pro začátek stačilo.

Časem ještě zkusím dotáhnout ty registry u RTC, ale zatím mi to takhle stačí.


P.S.
"peterple" - Je mi jasné, že se ta funkce millis() ve spánku zastaví.
Měl jsem to tam jen jako potvrzení toho, že když jsou časy před uspáním a po probuzení stejné, tak byl ten sleep režim opravdu aktivovaný.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 23 hostů