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);
}
//--------------------