STM32 Risparmio energetico: Introduzione e framework Arduino vs STM
In un dispositivo remoto, una caratteristica importante può essere il consumo energetico e, come altri dispositivi, gli STM32 consentono una serie di stati a basso consumo.
Nel framework di Arduino, questi stati sono semplificati per permettere una gestione più semplice, ma analizzeremo lo stato originale di STM32 per comprendere meglio i risultati dei test.
Modalità di basso consumo nel framework Arduino
La libreria STM32LowPower che andremo a utilizzare identifica quattro tipi di modalità di basso consumo:
- Modalità inattiva (Idle mode): bassa latenza di risveglio (ordine dei µs) (ad es. ARM WFI). Risparmio energetico principalmente sul core. Memorie e alimentazioni sono mantenute.
- Modalità sleep: bassa latenza di risveglio (ordine dei µs) (ad es. ARM WFI), Memorie e alimentazioni sono mantenute. Risparmio energetico principalmente sul core, ma superiore alla modalità inattiva.
- Modalità deep sleep: latenza media (ordine dei ms), gli orologi sono disattivati. Memorie e alimentazioni sono mantenute. Se supportato, è possibile il risveglio da periferiche (UART, I2C …).
- Modalità spegnimento (Shutdown mode): alta latenza di risveglio (possibilmente centinaia di ms o ordine dei secondi), le alimentazioni sono interrotte tranne nel dominio sempre attivo, il contenuto della memoria viene perso e il sistema si riavvia.
Modalità di basso consumo nel framework STM
I dispositivi STM32 implementano cinque modalità di basso consumo: Modalità di funzionamento a basso consumo, Modalità sleep, Modalità sleep a basso consumo, Modalità stop e Modalità standby. Le differenze tra queste modalità possono essere descritte in termini di consumo energetico, prestazioni, tempo di risveglio e fonti di risveglio. Se si mettono in ordine le modalità per ciascuno di questi parametri, dal migliore (1) al peggiore (5), diventa chiaro quale sia il compromesso. In generale, man mano che il consumo energetico diminuisce, le prestazioni diminuiscono, il tempo di risveglio aumenta e il numero di fonti di risveglio diminuisce. La Tabella 1 riassume la classificazione delle modalità di basso consumo. Ad esempio, considerando la Modalità di funzionamento a basso consumo, ha le migliori prestazioni, le fonti di risveglio più numerose, il secondo tempo di risveglio più veloce e il quarto consumo di corrente più basso.
Prestazioni | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
Consumo energetico | 4 | 5 | 3 | 2 | 1 |
Tempo di risveglio | 2 | 1 | 4 | 3 | 5 |
Fonti di risveglio | 1 | 2 | 3 | 4 | 5 |
In questa sezione, diventerà chiaro come sono stati derivati questi ranking. Tuttavia, è importante rendersi conto che sono validi solo in senso generale. Ad esempio, è del tutto possibile che la modalità Stop consumi più corrente della modalità sleep a basso consumo, a seconda delle loro configurazioni e delle periferiche attivate/disattivate. Ma in generale, questo non sarà il caso perché la modalità Stop limita le capacità del dispositivo molto più della modalità sleep a basso consumo per conservare più energia. (dal forum DigiKey)
Modalità Run
Questa è la modalità standard.
- Tutto può essere ACCESO
- Qualsiasi clock periferico può essere inibito (* esempi)
- Dopo il reset, gli orologi periferici sono disabilitati
- Il codice può ESSERE ESEGUITO dalla RAM e la FLASH può essere SPENTA
Modalità di Funzionamento a Basso Consumo
- Tutto può essere ACCESO
- Qualsiasi clock periferico può essere inibito (* esempi)
- Dopo il reset, il clock periferico è disabilitato
- Il regolatore di potenza passa alla modalità di bassa potenza
Questa modalità si ottiene con l’oscillatore RC interno multispeed (MSI) impostato su clock a bassa velocità, l’esecuzione dalla memoria SRAM o Flash, e il regolatore interno in modalità a basso consumo per minimizzare la corrente di funzionamento del regolatore. In modalità di funzionamento a basso consumo, la frequenza del clock e il numero di periferiche abilitate sono entrambi limitati.
Ma ridurre la velocità del clock di qualsiasi microcontrollore al range dei kilohertz ridurrà notevolmente il consumo di corrente al punto da essere competitivo con la modalità di sleep medio. Questo non viene solitamente fatto, perché la riduzione delle prestazioni e il consumo di corrente statico (che non dipende dalla frequenza del clock) possono utilizzare più energia a lungo termine. A seconda dell’applicazione, cioè quale modalità di sleep viene utilizzata o quanto spesso il dispositivo si sveglia, potrebbe essere più efficiente consumare più corrente per un periodo più breve piuttosto che consumare meno corrente per un periodo più lungo. ST può classificarlo come una modalità a basso consumo perché forniscono la capacità di mettere il regolatore di tensione interno in uno stato a basso consumo.
Modalità Sleep
- Il Core è fermato
- Le periferiche sono in funzione
La modalità di sospensione consente di utilizzare tutti i periferici e presenta il tempo di risveglio più veloce.
In queste modalità, la CPU è fermata, e ogni clock periferico può essere configurato dal software per essere attivato o disattivato durante le modalità di sospensione e di sospensione a bassa potenza. Queste modalità sono attivate eseguendo l’istruzione assembler Attesa di Interruzione o Attesa di Evento. Tuttavia, il tempo di risveglio è quasi dieci volte più veloce rispetto alla modalità a bassa potenza più competitiva. Puoi controllare l’ultima riga di questa tabella per confrontare il tempo di risveglio.
Ips | Esecuzione/Attivo | Sospeso | Esecuzione a basso consumo | Sospeso a basso consumo | Stop | Stop W.C. | Standby | Standby W.C. |
---|---|---|---|---|---|---|---|---|
CPU | Y | — | Y | — | — | — | ||
Memoria Flash | O | O | O | O | — | — | ||
RAM | Y | Y | Y | Y | Y | — | ||
Registri di backup | Y | Y | Y | Y | Y | Y | ||
EEPROM | O | O | O | O | — | — | ||
Reset per calo di tensione (BOR) | O | O | O | O | O | O | O | O |
DMA | O | O | O | O | — | — | ||
Rilevatore di Tensione Programmabile (PVD) | O | O | O | O | O | O | – | |
Reset all’accensione/spegnimento (POR/PDR) | Y | Y | Y | Y | Y | Y | Y | Y |
Interno ad Alta Velocità (HSI) | O | O | — | — | (2) | — | ||
Esterno ad Alta Velocità (HSE) | O | O | O | O | — | — | ||
Interno a Bassa Velocità (LSI) | O | O | O | O | O | O | ||
Esterno a Bassa Velocità (LSE) | O | O | O | O | O | O | ||
Interno Multi-Velocità (MSI) | O | O | Y | Y | — | — | ||
Controller di Interconnessione | Y | Y | Y | Y | Y | — | ||
RTC | O | O | O | O | O | O | O | |
Tamper RTC | O | O | O | O | O | O | O | O |
Auto WakeUp (AWU) | O | O | O | O | O | O | O | O |
LCD | O | O | O | O | O | — | ||
USB | O | O | — | — | — | O | — | |
USART | O | O | O | O | O(3) | O | — | |
LPUART | O | O | O | O | O(3) | O | — | |
SPI | O | O | O | O | — | — | ||
I2C | O | O | — | — | O(4) | O | — | |
ADC | O | O | — | — | — | — | ||
DAC | O | O | O | O | O | — | ||
Sensore di temperatura | O | O | O | O | O | — | ||
Comparatori | O | O | O | O | O | O | — | |
Timers 16-bit | O | O | O | O | — | — | ||
LPTIMER | O | O | O | O | O | O | ||
IWDG | O | O | O | O | O | O | O | O |
WWDG | O | O | O | O | — | — | ||
Controller di rilevamento del tocco (TSC) | O | O | — | — | — | — | ||
Timer SysTick | O | O | O | O | — | |||
GPIOs | O | O | O | O | O | O | 2 pins | |
Tempo di risveglio alla modalità Esecuzione | 0µs | 0.36µs | 3µs | 32µs | 3.5µs | 3.5µs | 50µs | 50µs |
Legenda:
- “Y” = Sì (abilitato).
“O” = Opzionale (può essere abilitato/disabilitato dal software)
“-” = Non disponibile - Alcune periferiche con la capacità di risveglio dallo stato di Stop possono richiedere che l’HSI sia abilitato. In questo caso, l’HSI viene attivato dal periferico e alimenta solo il periferico che lo ha richiesto. L’HSI viene automaticamente disattivato quando il periferico non ne ha più bisogno.
- La ricezione UART e LPUART è funzionale in modalità Stop. Genera un’interruzione di risveglio all’avvio. Per generare un risveglio in caso di corrispondenza di indirizzo o evento di frame ricevuto, l’LPUART può funzionare sul clock LSE mentre l’UART deve svegliarsi o continuare a far funzionare il clock HSI.
- Il rilevamento degli indirizzi I2C è funzionale in modalità Stop. Genera un’interruzione di risveglio in caso di corrispondenza di indirizzo. Risveglierà l’HSI durante la ricezione.
La modalità Sleep è integrata con la modalità Idle nella libreria STM32LowPower
Questo rende praticamente senza sforzo entrare in modalità Sleep perché la frequenza del sistema non deve essere ridotta, e tutte le periferiche del dispositivo sono disponibili per l’uso. Inoltre, è molto semplice uscire dalla modalità Sleep poiché qualsiasi interruzione o evento disponibile in modalità Run può risvegliare il dispositivo e essere gestito con latenza molto bassa.
Modalità Idle per il framework Arduino
La libreria per il framework Arduino STM32LowPowerMode chiama questa modalità idle. E come puoi vedere nel codice,
/**
* @brief Enable the idle low power mode (STM32 sleep). Exit this mode on
* interrupt or in n milliseconds.
* @param ms: optional delay before leave the idle mode (default: 0).
* @retval None
*/
void STM32LowPower::idle(uint32_t ms)
{
if ((ms != 0) || _rtc_wakeup) {
programRtcWakeUp(ms, IDLE_MODE);
}
LowPower_sleep(PWR_MAINREGULATOR_ON);
}
lo stato è raggiunto da un LowPower_sleep con il flag PWR_MAINREGULATOR_ON che attiva il regolatore di tensione primario.
Modalità Sleep a Basso Consumo
• Il Core è fermato
• Le periferiche sono in funzione
• Il regolatore di potenza è in modalità a basso consumo
• La FLASH può essere in modalità Power Down
• VREFINT può essere SPENTO
La modalità sleep a basso consumo è essenzialmente una combinazione di modalità run a basso consumo e modalità Sleep. Non solo il core Cortex-M0+ è fermato, ma il regolatore è messo in modalità a basso consumo, il che significa che devono essere soddisfatte le stesse condizioni di quelle della modalità run a basso consumo.
La modalità Sleep a basso consumo è integrata con la modalità Sleep nella libreria STM32LowPower.
Modalità Sleep nel framework Arduino
Nel framework Arduino, questo stato viene rinominato in modalità sleep, e il codice
/**
* @brief Enable the sleep low power mode (STM32 sleep). Exit this mode on
* interrupt or in n milliseconds.
* @param ms: optional delay before leave the sleep mode (default: 0).
* @retval None
*/
void STM32LowPower::sleep(uint32_t ms)
{
if ((ms != 0) || _rtc_wakeup) {
programRtcWakeUp(ms, SLEEP_MODE);
}
LowPower_sleep(PWR_LOWPOWERREGULATOR_ON);
}
è lo stesso di idle, ma con il regolatore a bassa potenza attivo.
Modalità Stop
- Il Core è fermato
- Gli orologi HSE, MSI sono SPENTI
- Il contenuto della SRAM e dei registri è conservato
- Le periferiche con opzione di clock HSI, LSI, LSE possono essere ACCESSE
- Le GPIO mantengono la loro configurazione
Il clock in tempo reale è alimentato dalla sorgente del clock LSI (low speed internal) in modalità stop. Gli orologi HIS (High speed internal) e HSE (External) sono spenti. L’HSI può fornire funzionalità limitate alle periferiche in grado di funzionare in modalità Stop. L’HSI alimenterà solo la periferica che lo ha richiesto e verrà disattivato automaticamente quando non sarà più necessario. Ad esempio, USART e I2C possono ancora ricevere dati in modalità Stop risvegliando l’HSI quando necessario.
La modalità Stop può raggiungere un consumo di corrente dell’ordine dei nanoampere mantenendo il contenuto della SRAM e dei registri.
La modalità Stop è integrata con la modalità DeepSleep nella libreria STM32LowPower
Il regolatore di potenza è in modalità a basso consumo.
Il regolatore in modalità a basso consumo significa che anche la flash è in modalità power-down. Tutti gli orologi sono fermi in modalità stop tranne quello collegato all’RTC. Uscire dalla modalità stop è possibile con l’interruzione del clock in tempo reale o con qualsiasi altra interruzione globale.
Molte delle opzioni di risparmio energetico possono essere ignorate per ottenere una latenza paragonabile a quella della modalità run a basso consumo. Ulteriori complicazioni derivano dal numero limitato di fonti di risveglio disponibili.
DeepSleep nel framework Arduino
Il deep sleep utilizza la modalità Stop e consente di impostare solo un HardwareSerial come fonte di risveglio.
/**
* @brief Enable the deepsleep low power mode (STM32 stop). Exit this mode on
* interrupt or in n milliseconds.
* @param ms: optional delay before leave the deepSleep mode (default: 0).
* @retval None
*/
void STM32LowPower::deepSleep(uint32_t ms)
{
if ((ms != 0) || _rtc_wakeup) {
programRtcWakeUp(ms, DEEP_SLEEP_MODE);
}
LowPower_stop(_serial);
}
è lo stesso di idle, ma con il regolatore a bassa potenza attivo.
Modalità Stop
- Il Core è fermato
- Gli orologi HSE, MSI sono SPENTI
- Il contenuto della SRAM e dei registri è conservato
- Le periferiche con opzione di clock HSI, LSI, LSE possono essere ACCESSE
- Le GPIO mantengono la loro configurazione
Il clock in tempo reale è alimentato dalla sorgente del clock LSI (low speed internal) in modalità stop. Gli orologi HIS (High speed internal) e HSE (External) sono spenti. L’HSI può fornire funzionalità limitate alle periferiche in grado di funzionare in modalità Stop. L’HSI alimenterà solo la periferica che lo ha richiesto e verrà disattivato automaticamente quando non sarà più necessario. Ad esempio, USART e I2C possono ancora ricevere dati in modalità Stop risvegliando l’HSI quando necessario.
La modalità Stop può raggiungere un consumo di corrente dell’ordine dei nanoampere mantenendo il contenuto della SRAM e dei registri.
La modalità Stop è integrata con la modalità DeepSleep nella libreria STM32LowPower
Il regolatore di potenza è in modalità a basso consumo.
Il regolatore in modalità a basso consumo significa che anche la flash è in modalità power-down. Tutti gli orologi sono fermi in modalità stop tranne quello collegato all’RTC. Uscire dalla modalità stop è possibile con l’interruzione del clock in tempo reale o con qualsiasi altra interruzione globale.
Molte delle opzioni di risparmio energetico possono essere ignorate per ottenere una latenza paragonabile a quella della modalità run a basso consumo. Ulteriori complicazioni derivano dal numero limitato di fonti di risveglio disponibili.
DeepSleep nel framework Arduino
Il deep sleep utilizza la modalità Stop e consente di impostare solo un HardwareSerial come fonte di risveglio.
/**
* @brief Enable the shutdown mode.The board reset when leaves this mode.
* If shutdown mode not available, use standby mode instead.
* @param None
* @retval None
*/
void LowPower_shutdown()
{
__disable_irq();
#if defined(PWR_CR1_LPMS)
/* LSE must be on to use shutdown mode */
if (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == SET) {
HAL_PWREx_EnterSHUTDOWNMode();
} else
#endif
{
LowPower_standby();
}
}
Confronto breve sulla modalità a basso consumo STM32L0, STM32F1 e STM32F4
Ora stiamo per iniziare alcuni test, ma vorrei aggiungere questo breve avviso. Il mondo degli STM32 è vasto e ci sono molte differenze da un microcontrollore all’altro, quindi nel test potremmo trovare alcuni risultati poco comprensibili.
Per comprendere meglio, aggiungo una tabella che spiega la principale differenza tra il tipo principale di microcontrollore.
Serie MCU | Serie STM32L0/STM32F1 | Serie STM32L4 |
---|---|---|
Modalità Sleep | Regolatore principale o a basso consumo, memoria Flash spenta con sleep a basso consumo | Regolatore a basso consumo acceso, regolatore principale configurabile, clock della memoria Flash configurabile |
Modalità Stop | Modalità stop singola | Modalità Stop0, Stop1 e Stop2 |
Standby | Disponibile | Disponibile e anche modalità di spegnimento speciale implementata. |
Comportamento dopo il risveglio
Modalità | Dopo il risveglio | Motivo |
---|---|---|
Modalità Idle/Sleep | Continua a eseguire il programma principale | Registri di memorizzazione dati come flash e SRAM sono ancora in stato di alimentazione |
Deep Sleep | Continua a eseguire il programma principale | Registri di memorizzazione dati come flash e SRAM sono ancora in stato di alimentazione |
Spegnimento | Esegui il programma principale dall’inizio (reset) | Tutti i periferici tranne il registro di backup e il circuito di standby smettono di funzionare |
Grazie
- STM32F1 Blue Pill: piedinatura, specifiche e configurazione IDE Arduino (STM32duino e STMicroelectronics)
- STM32: programmazione (STM32F1) via USB con bootloader STM32duino
- STM32: programmazione (STM32F1 STM32F4) tramite USB con bootloader HID
- STM32F4 Black Pill: pinout, specifiche e configurazione IDE Arduino
- STM32: ethernet w5500 standard (HTTP) e SSL (HTTPS)
- STM32: ethernet enc28j60 standard (HTTP) e SSL (HTTPS)
- STM32: WiFiNINA con un ESP32 come WiFi Co-Processor
- Come utilizzare la scheda SD con l’stm32 e la libreria SdFat
- STM32: memoria flash SPI FAT FS
- STM32: RTC interno, sistema orario e backup batteria (VBAT)
- STM32 LoRa
- STM32 Risparmio energetico
- STM32F1 Blue-Pill gestione clock e frequenza
- STM32F4 Black-Pill gestione clock e frequenza
- Introduzione e framework Arduino vs STM
- Libreria LowPower, cablaggio e Idle (STM Sleep).
- Sleep, deep sleep, shutdown e consumo energetico
- Sveglia da allarme RTC e Seriale
- Sveglia da sorgente esterna
- Introduzione al dominio di backup e conservazione delle variabili durante il RESET
- Registro di backup RTC e conservazione della SRAM
- STM32 invia email con allegati e SSL (come Gmail): w5500, enc28j60, SD e SPI Flash
- Server FTP su STM32 con W5500, ENC28J60, scheda SD e memoria flash SPI
- Collegamento dell’EByte E70 ai dispositivi STM32 (black/blue pill) e un semplice sketch di esempio