rtc-reveil.c

Famille STM32 Nucleo-64 F4 — modelo insignia: Nucleo-F401RE · Archivo : rtc-reveil.c · Lenguaje : C · Uso : Réveil périodique avec la RTC et mode veille bas courant

La RTC mantiene la hora aunque se corte la alimentación (pila de botón o supercondensador de la placa): este programa imprime el reloj continuamente y lanza un despertador cada 10 s, base de las estaciones de despertador periódico de bajo consumo.

Hardware

Una Nucleo F4 (STM32F401RE/F411RE, Cortex-M4) programada via ST-LINK (USB), pines de 3,3 V. Opcional: pila de botón o supercondensador para mantener el reloj sin alimentación.

Cableado

Sin cableado. Activa la RTC en CubeMX (fuente LSE de 32,768 kHz si hay cristal, si no LSI) y ajusta fecha/hora iniciales.

Funcionamiento

HAL_RTC_GetTime/GetDate leen los contadores; el orden GetTime y luego GetDate lo exige el bloqueo interno de la HAL. El despertador también puede usar el WakeUp timer para salir de Stop.

Ejecución

Crea un proyecto STM32CubeIDE (elige Nucleo-F401RE o F411RE), pega el codigo en main.c, configura los perifericos en el .ioc y pulsa Run. El terminal serie del ST-LINK muestra los printf a 115200.

Variantes

Pasa a modo Stop con despertador WakeUp timer (corriente dividida por ~100), o sincroniza la hora por UART (protocolo tipo NMEA).

rtc-reveil.c

// RTC : affichage de l'heure + reveveil toutes les 10 s.
#include "main.h"
#include <stdio.h>

extern RTC_HandleTypeDef hrtc;
extern UART_HandleTypeDef huart2;

int __io_putchar(int ch) {
  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
  return ch;
}

RTC_TimeTypeDef t;
RTC_DateTypeDef d;
uint32_t dernierReveil = 0;

int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_RTC_Init();   // horloge LSE/Lsi + date/heure initiales dans CubeMX

  for (;;) {
    HAL_RTC_GetTime(&hrtc, &t, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&hrtc, &d, RTC_FORMAT_BIN);
    // NB: GetDate apres GetTime (obligation HAL pour le lock).

    printf("%02u:%02u:%02u  %02u/%02u/%02u\r\n",
           t.Hours, t.Minutes, t.Seconds, d.Date, d.Month, d.Year);

    // reveveil logiciel simple (ou RTC_Alarm / WakeUp timer)
    if (HAL_GetTick() - dernierReveil >= 10000) {
      dernierReveil = HAL_GetTick();
      printf("--- REVEIL ---\r\n");
      HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    }
    HAL_Delay(1000);
  }
}

← Volver a la ficha