STM32 Risparmio energetico: Introduzione e framework Arduino vs STM

Spread the love

Risparmio energetico STM32: introduzione e Arduino vs framework STM
Risparmio energetico STM32: introduzione e Arduino vs framework 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.

Prestazioni12345
Consumo energetico45321
Tempo di risveglio21435
Fonti di risveglio12345
Classificazione ordinale delle modalità di basso consumo STM32L0 in base a vari parametri operativi

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)

stm32f411ce: diagramma a blocchi
stm32f411ce: diagramma a blocchi

Modalità Run

Questa è la modalità standard.

Diagramma a blocchi STM32: modalità RUN
Diagramma a blocchi STM32: modalità RUN
  • 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

Diagramma a blocchi STM32: modalità di funzionamento a basso consumo
Diagramma a blocchi STM32: 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

Diagramma a blocchi STM32: modalità SLEEP
Diagramma a blocchi STM32: 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.

IpsEsecuzione/AttivoSospesoEsecuzione a basso consumoSospeso a basso consumoStopStop W.C.StandbyStandby W.C.
CPUYY  
Memoria FlashOOOO  
RAMYYYYY  
Registri di backupYYYYY Y 
EEPROMOOOO  
Reset per calo di tensione (BOR)OOOOOOOO
DMAOOOO  
Rilevatore di Tensione Programmabile (PVD)OOOOOO 
Reset all’accensione/spegnimento (POR/PDR)YYYYYYYY
Interno ad Alta Velocità (HSI)OO(2)  
Esterno ad Alta Velocità (HSE)OOOO  
Interno a Bassa Velocità (LSI)OOOOO O 
Esterno a Bassa Velocità (LSE)OOOOO O 
Interno Multi-Velocità (MSI)OOYY  
Controller di InterconnessioneYYYYY  
RTCOOOOOOO 
Tamper RTCOOOOOOOO
Auto WakeUp (AWU)OOOOOOOO
LCDOOOOO  
USBOOO 
USARTOOOOO(3)O 
LPUARTOOOOO(3)O 
SPIOOOO  
I2COOO(4)O 
ADCOO  
DACOOOOO  
Sensore di temperaturaOOOOO  
ComparatoriOOOOOO 
Timers 16-bitOOOO  
LPTIMEROOOOOO  
IWDGOOOOOOOO
WWDGOOOO  
Controller di rilevamento del tocco (TSC)OO  
Timer SysTickOOOO   
GPIOsOOOOOO 2 pins
Tempo di risveglio alla modalità Esecuzione0µs0.36µs3µs32µs3.5µs3.5µs50µs50µs

Legenda:

  1. “Y” = Sì (abilitato).
    “O” = Opzionale (può essere abilitato/disabilitato dal software)
    “-” = Non disponibile
  2. 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.
  3. 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.
  4. 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.

STM32: regolatore interno e interruttore VBAT
STM32: regolatore interno e interruttore VBAT

Modalità Sleep a Basso Consumo

Diagramma a blocchi STM32: modalità SLEEP a basso consumo
Diagramma a blocchi STM32: 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

Diagramma a blocchi STM32: modalità STOP
Diagramma a blocchi STM32: 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.

Schema dell'orologio RTC di STM32F103 blue pill
Schema del clock RTC di STM32F103 blue pill

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

Diagramma a blocchi STM32: modalità STOP
Diagramma a blocchi STM32: 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.

Schema dell'orologio RTC di STM32F103 blue pill
Schema del clock RTC di STM32F103 blue pill

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 MCUSerie STM32L0/STM32F1Serie STM32L4
Modalità SleepRegolatore principale o a basso consumo, memoria Flash spenta con sleep a basso consumoRegolatore a basso consumo acceso, regolatore principale configurabile, clock della memoria Flash configurabile
Modalità StopModalità stop singolaModalità Stop0, Stop1 e Stop2
StandbyDisponibileDisponibile e anche modalità di spegnimento speciale implementata.

Comportamento dopo il risveglio

ModalitàDopo il risveglioMotivo
Modalità Idle/SleepContinua a eseguire il programma principaleRegistri di memorizzazione dati come flash e SRAM sono ancora in stato di alimentazione
Deep SleepContinua a eseguire il programma principaleRegistri di memorizzazione dati come flash e SRAM sono ancora in stato di alimentazione
SpegnimentoEsegui il programma principale dall’inizio (reset)Tutti i periferici tranne il registro di backup e il circuito di standby smettono di funzionare

Grazie

  1. STM32F1 Blue Pill: piedinatura, specifiche e configurazione IDE Arduino (STM32duino e STMicroelectronics)
  2. STM32: programmazione (STM32F1) via USB con bootloader STM32duino
  3. STM32: programmazione (STM32F1 STM32F4) tramite USB con bootloader HID
  4. STM32F4 Black Pill: pinout, specifiche e configurazione IDE Arduino
  5. STM32: ethernet w5500 standard (HTTP) e SSL (HTTPS)
  6. STM32: ethernet enc28j60 standard (HTTP) e SSL (HTTPS)
  7. STM32: WiFiNINA con un ESP32 come WiFi Co-Processor
    1. STM32F1 Blue-pill: shield WiFi (WiFiNINA)
    2. STM32F4 Black-pill: shield WiFi (WiFiNINA)
  8. Come utilizzare la scheda SD con l’stm32 e la libreria SdFat
  9. STM32: memoria flash SPI FAT FS
  10. STM32: RTC interno, sistema orario e backup batteria (VBAT)
  11. STM32 LoRa
  1. STM32 Risparmio energetico
    1. STM32F1 Blue-Pill gestione clock e frequenza
    2. STM32F4 Black-Pill gestione clock e frequenza
    3. Introduzione e framework Arduino vs STM
    4. Libreria LowPower, cablaggio e Idle (STM Sleep).
    5. Sleep, deep sleep, shutdown e consumo energetico
    6. Sveglia da allarme RTC e Seriale
    7. Sveglia da sorgente esterna
    8. Introduzione al dominio di backup e conservazione delle variabili durante il RESET
    9. Registro di backup RTC e conservazione della SRAM
  1. STM32 invia email con allegati e SSL (come Gmail): w5500, enc28j60, SD e SPI Flash
  2. Server FTP su STM32 con W5500, ENC28J60, scheda SD e memoria flash SPI
  3. Collegamento dell’EByte E70 ai dispositivi STM32 (black/blue pill) e un semplice sketch di esempio

Spread the love

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *