STM32: RTC interno, sistema orario e backup batteria (VBAT)

Spread the love

Benvenuti al nostro approfondito articolo sull’orologio in tempo reale (RTC) interno dello STM32, il sistema orario associato e il backup batteria (VBAT). Nel frenetico mondo di oggi, un’accurata misurazione del tempo e un’efficace gestione dell’energia sono elementi essenziali dei moderni sistemi embedded. La famiglia di microcontrollori STM32, con le sue ricche funzionalità, offre un’eccellente soluzione per affrontare queste esigenze.

STM32: RTC interno, sistema orario e backup batteria (VBAT)
STM32: RTC interno, sistema orario e backup batteria (VBAT)

Un orologio in tempo reale (RTC) è un orologio di un computer che tiene traccia dell’ora corrente. I microcontrollori che supportano l’RTC possono essere utilizzati per cronometri, sveglie, orologi, piccole agende elettroniche e molti altri dispositivi.

Nello STM32, l’orologio in tempo reale (RTC) è un timer/contatore BCD indipendente. Registri dedicati contengono il secondo, il minuto, l’ora (in formato 12/24 ore), il giorno della settimana, la data, il mese e l’anno in formato BCD (decimali codificati in binario). La correzione per 28, 29 (anno bisestile), 30 e 31 giorni del mese viene eseguita automaticamente. L’RTC dispone di un rilevamento dell’orologio di riferimento, un orologio di secondo sorgente più preciso (50 o 60 Hz) può essere utilizzato per migliorare la precisione del calendario. L’RTC offre un allarme programmabile e interruzioni periodiche programmabili con risveglio dalle modalità Stop e Standby.

L’operazione VBAT viene attivata quando VDD non è presente. Un elemento simbiotico è il pin VBAT, che consente di alimentare il dominio VBAT del dispositivo da una batteria esterna, un supercondensatore esterno o da VDD quando non è presente una batteria esterna e un supercondensatore esterno. Il pin VBAT alimenta l’RTC e i registri di backup.

Dettagli

Questo RTC può essere utilizzato con tre sorgenti di clock:

  • HSE è un orologio esterno ad alta velocità, che può essere collegato a un risonatore al quarzo/ceramico o a una sorgente di clock esterna. La sua gamma di frequenza va da 4 MHz a 16 MHz.
    L’oscillatore esterno ad alta velocità fornisce un orologio di sistema sicuro al quarzo. Un sistema di sicurezza dell’orologio consente il rilevamento automatico del guasto di HSE. In questo caso, viene generata un’interruzione non mascherabile e un input interrotto può essere inviato ai timer per mettere in uno stato sicuro le applicazioni critiche come il controllo del motore. Quando viene rilevato un guasto di HSE, l’oscillatore HSE viene disabilitato automaticamente. Se HSE viene selezionato direttamente o indirettamente (PLLRCLK selezionato per SYSCLK e HSE selezionato come input PLL) come orologio di sistema e viene rilevato un guasto dell’orologio HSE, l’orologio di sistema passa automaticamente a HSISYS, in modo che il software dell’applicazione non si blocchi in caso di guasto dell’oscillatore a cristallo. Il pin OSC_OUT può essere utilizzato come GPIO o può essere configurato come funzione alternativa OSC_EN per fornire un segnale che consente l’arresto del sintetizzatore di orologio esterno quando il dispositivo entra nelle modalità a basso consumo.
  • LSI è un oscillatore RC a bassa velocità con una frequenza di 40 kHz, che fornisce un orologio a basso consumo. I dispositivi STM32 integrano un oscillatore RC a bassissimo consumo, disponibile in tutte le modalità eccetto Spegnimento e VBAT. L’LSI può essere utilizzato per l’orologio RTC, i timer a basso consumo e il watchdog indipendente. Il consumo tipico di LSI è di 110 nA.
  • LSE è un orologio esterno a bassa velocità collegato a un cristallo di quarzo a 32.768 kHz. L’oscillatore esterno a bassa velocità può essere utilizzato con quarzo esterno o risonatore, o con una sorgente di orologio esterna in modalità Bypass. La capacità di pilotaggio dell’oscillatore è programmabile. Sono disponibili quattro modalità, da una modalità a bassissimo consumo con un consumo di soli 250 nanoamperes a una modalità ad alta guida. Un sistema di sicurezza dell’orologio controlla il guasto dell’oscillatore LSE. Se LSE viene utilizzato come orologio di sistema e viene rilevato un guasto dell’orologio LSE, l’orologio di sistema passa automaticamente a LSI. Il CSS è funzionale in tutte le modalità eccetto Spegnimento e VBAT. È funzionale anche sotto reset. L’LSE può essere utilizzato per l’orologio RTC, il CEC, le periferiche USART o UART a basso consumo e i timer a basso consumo.

Non menzioniamo HSI o altri oscillatori perché non vengono utilizzati con RTC.

Per il test utilizzeremo una generica STM32F103 blue pill (la STM32F4 black pill è abbastanza simile, cambia solo la frequenza della CPU) e potete vedere nello schema condiviso sul dispositivo specificato che ha un oscillatore a cristallo da 4 a 16 MHz collegato internamente a PD0 e PD1 per gestire HSE.

STM32F1 blue pill: 4-to-16 MHz crystal oscillator internally connected
STM32F1 blue pill: 4-to-16 MHz crystal oscillator internally connected

E un oscillatore a 32 kHz per RTC con calibrazione collegata a PC14 e PC15 viene utilizzato per LSE.

STM32F1 blue pill: oscillatore a 32 kHz per RTC su PC14 e PC15
STM32F1 blue pill: oscillatore a 32 kHz per RTC su PC14 e PC15

Quindi lo schema completo diventa.

Schema dell'orologio RTC di STM32F103 blue pill
Schema dell’orologio RTC di STM32F103 blue pill

Puoi vedere anche un HSI RC, ma dobbiamo prestare attenzione solo alla parte dello schema relativa all’RTC.

Selezione della sorgente dell'orologio RTC
Selezione della sorgente dell’orologio RTC

Alimentazione di riserva della batteria

Come puoi vedere nel diagramma dei pin, c’è un pin VBAT.

Pinout STM32 STM32F1 STM32F103 STM32F103C8 bassa risoluzione
Pinout STM32 STM32F1 STM32F103 STM32F103C8 bassa risoluzione

Batteria normale

Il metodo più semplice per conservare lo stato dell’RTC è collegarlo direttamente a una batteria cr2032.

Presta attenzione al fatto che la cr2032 ha 3,6 V, quindi se stai pensando di utilizzare una LIR2032, ricorda che ha 4,2 V al massimo della carica, e non è una buona idea.

Scegli cr2032 5.5V Super Capacitor - ML2032 - cr2032 - Rechargeable AA and AAA

Schema della batteria STM32 RTC VBAT
Schema della batteria STM32 RTC VBAT

Puoi anche utilizzare 2 batterie AA o simili, e la gamma accettata è da 1,55 V a 3,6 V.

Batteria ricaricabile

Un’altra buona soluzione è utilizzare una batteria ricaricabile (NiMH, NiCd, Li-ion o celle Lipo), puoi anche fornire un sistema di ricarica come lo schema fornito da ST.

La batteria AA NiMH può essere una soluzione.

Pannello sperimentale di batterie ricaricabili 2xAA STM32 RTC
Pannello sperimentale di batterie ricaricabili 2xAA STM32 RTC

Ma penso che le AA siano abbastanza grandi, quindi puoi utilizzare una ML2032, una batteria ricaricabile a 3 V che funziona da 3,2 V a 2,6 V.

STM32 RTC VBAT: batteria ricaricabile ml2032 su breadboard
STM32 RTC VBAT: batteria ricaricabile ml2032 su breadboard

Come puoi capire, le dimensioni e l’amperaggio della batteria dipendono dalle tue esigenze, come durata e dimensioni del contenitore.

Schema batteria ricaricabile STM32 RTC
Schema batteria ricaricabile STM32 RTC

Seleziona ml2032 e ricaricabile AA e AAA 5.5V Super Capacitor - ML2032 - cr2032 - Rechargeable AA and AAA

Super-condensatore

Un’altra buona soluzione è il classico super-condensatore.

STM32 RTC VBAT: super-condensatore su breadboard
STM32 RTC VBAT: super-condensatore su breadboard

ST consiglia un condensatore da 0,22 F a 1 F.

Schema super-condensatore STM32 RTC VBVAT
Schema super-condensatore STM32 RTC VBVAT

Seleziona il super-condensatore 5.5V Super Capacitor - ML2032 - cr2032 - Rechargeable AA and AAA

Libreria

Per interfacciare l’orologio interno possiamo utilizzare la libreria STM32RTC, che offre una buona quantità di funzioni.

E puoi scaricarla dal gestore delle librerie di Arduino.

Gestore delle librerie Arduino: STM32 RTC
Gestore delle librerie Arduino: STM32 RTC

Sketch di base

STM32: VBAT pin utilizzato con cr2032 per il backup dell'RTC
STM32: VBAT pin utilizzato con cr2032 per il backup dell’RTC

Utilizziamo il predefinito LSI senza approfondire le altre modalità, ma prestando attenzione allo schema, diventa molto importante nella gestione del risparmio energetico.

/**
 * Simple example of RTC Clock for STM32
 * You can use Serial to pass an epoch time that 
 * synchronize the clock
 * 
 * To generate epoch you can use browser console and input
 * Math.round(new Date().getTime()/1000)
 * 
 * @author  Renzo Mischianti (www.mischianti.org)
 * @brief 
 * @version 0.1
 * @date 2022-04-06
 * 
 */
#include <Arduino.h>
#include <STM32RTC.h>

/* Get the rtc object */
STM32RTC& rtc = STM32RTC::getInstance();

/* Change these values to set the current initial time */
const byte seconds = 0;
const byte minutes = 0;
const byte hours = 16;

/* Change these values to set the current initial date */
/* Monday 15th June 2015 */
const byte weekDay = 1;
const byte day = 15;
const byte month = 6;
const byte year = 15;

void setup()
{
  Serial.begin(115200);

  // Select RTC clock source: LSI_CLOCK, LSE_CLOCK or HSE_CLOCK.
  // By default the LSI is selected as source.
  //rtc.setClockSource(STM32RTC::LSE_CLOCK);

  rtc.begin(); // initialize RTC 24H format

  // // Set the time
  // rtc.setHours(hours);
  // rtc.setMinutes(minutes);
  // rtc.setSeconds(seconds);

  // // Set the date
  // rtc.setWeekDay(weekDay);
  // rtc.setDay(day);
  // rtc.setMonth(month);
  // rtc.setYear(year);

  // // you can use also
  // //rtc.setTime(hours, minutes, seconds);
  // //rtc.setDate(weekDay, day, month, year);
}

long startTime = millis();
long interval = 5000;

void loop()
{
  if (startTime+interval<millis()){
    // Print date...
    Serial.printf("%02d/%02d/%02d ", rtc.getDay(), rtc.getMonth(), rtc.getYear());

    // ...and time
    Serial.printf("%02d:%02d:%02d.%03d\n", rtc.getHours(), rtc.getMinutes(), rtc.getSeconds(), rtc.getSubSeconds());
    startTime = millis();
  }
  if (Serial.available()){
    long epoch =  String(Serial.readString()).toInt();
    rtc.setEpoch(epoch);
    Serial.println(epoch);
  }
}

Ecco l’output seriale.

01/01/00 00:00:42.000
01/01/00 00:00:47.000
01/01/00 00:00:52.000
01/01/00 00:00:57.000
01/01/00 00:01:02.000
01/01/00 00:01:07.000

>>Send to COM35: "1649312899"<<
1649312899
07/04/22 06:28:19.000
07/04/22 06:28:24.000
07/04/22 06:28:29.000
07/04/22 06:28:34.000
07/04/22 06:28:39.000

Se si scollega il cavo del programmatore e l’USB senza scollegare la batteria di backup, e poi ricollega il tutto ed esamina l’uscita; puoi verificare che l’ora sia stata preservata.

Sketch: gestione dell’allarme

STM32 VBAT pin used with 2xAA batteries for RTC backup
STM32 VBAT pin used with 2xAA batteries for RTC backup

L’STM32 fornisce un insieme di registri per memorizzare gli allarmi e gestire gli interrupt, esamineremo un semplice allarme.

/**
 * A simple sketch that set the time to 
 * 2022-04-20 at 16:00:00
 * and an alarm at
 * 16:00:10
 * the result is the interrupt after 10 secs
 * 
 * @author Renzo Mischianti <www.mischianti.org>
 * @version 0.1
 * @date 2022-04-07
 * 
 * @copyright Copyright (c) 2022
 * 
 */

#include <STM32RTC.h>

/* Get the rtc object */
STM32RTC& rtc = STM32RTC::getInstance();

/* Change these values to set the current initial time */
const byte seconds = 0;
const byte minutes = 0;
const byte hours = 16;

/* Change these values to set the current initial date */
const byte day = 20;
const byte month = 4;
const byte year = 22;

void alarmMatch(void *data);

void setup()
{
  Serial.begin(115200);

  // Select RTC clock source: LSI_CLOCK, LSE_CLOCK or HSE_CLOCK.
  // By default the LSI is selected as source.
  //rtc.setClockSource(STM32RTC::LSE_CLOCK);

  rtc.begin(); // initialize RTC 24H format

  // we set the time at 2022-04-20 at 16:00:00
  rtc.setTime(hours, minutes, seconds);
  rtc.setDate(day, month, year);

  rtc.attachInterrupt(alarmMatch);
  rtc.setAlarmDay(day);

  // Now we set an alert at 16:00:10 
  // pratically 10 secs after the start 
  // (check the initialization of clock)
  rtc.setAlarmTime(16, 0, 10, 0);
  rtc.enableAlarm(rtc.MATCH_DHHMMSS);
}

void loop()
{
  // Print date...
  Serial.printf("%02d/%02d/%02d ", rtc.getDay(), rtc.getMonth(), rtc.getYear());

  // ...and time
  Serial.printf("%02d:%02d:%02d.%03d\n", rtc.getHours(), rtc.getMinutes(), rtc.getSeconds(), rtc.getSubSeconds());
  delay(1000);
}

void alarmMatch(void *data)
{
  UNUSED(data);
  Serial.println("Alarm Match!");
}

Ed ecco l’output seriale.

20/04/22 16:00:05.000
20/04/22 16:00:06.000
20/04/22 16:00:07.000
20/04/22 16:00:08.000
20/04/22 16:00:09.000
20/04/22 16:00:10.000
Alarm Match!
20/04/22 16:00:11.000
20/04/22 16:00:12.000
20/04/22 16:00:13.000
20/04/22 16:00:14.000
20/04/22 16:00:15.000
20/04/22 16:00:16.000
20/04/22 16:00:17.000

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
  2. STM32 invia email con allegati e SSL (come Gmail): w5500, enc28j60, SD e SPI Flash

Spread the love

Lascia un commento

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