rtc-reveil.c

STM32 Nucleo-64 famille F4 — phare : Nucleo-F401RE · Fichier : rtc-reveil.c · Langage : C · Usage : Réveil périodique avec la RTC et mode veille bas courant

La RTC tient l'heure même alimentation coupée (veilleuse ou condensateur de la carte) : ce programme affiche l'horloge en continu et déclenche un réveil toutes les 10 s, base des stations à réveil périodique basse consommation.

Matériel requis

Une Nucleo F4 (STM32F401RE/F411RE, Cortex-M4) programmee via ST-LINK (USB), broches 3,3 V. Optionnel : pile bouton ou supercondensateur pour maintenir l'horloge hors tension.

Câblage

Aucun câblage. Activer la RTC dans CubeMX (source LSE 32,768 kHz si quartz, sinon LSI) et régler la date/heure de départ.

Fonctionnement

HAL_RTC_GetTime/GetDate lisent les compteurs ; l'ordre GetTime puis GetDate est requis par le verrouillage interne de la HAL. Le réveil peut aussi utiliser le WakeUp timer pour sortir de Stop.

Exécution

Creer un projet STM32CubeIDE (selection Nucleo-F401RE ou F411RE), coller le code dans main.c, configurer les peripheriques dans le .ioc, puis Executer > Run. Le terminal serie du ST-LINK affiche les printf a 115200.

Variantes

Passer en mode Stop avec réveil par WakeUp timer (courant divisé par ~100), ou synchroniser l'heure via UART (protocole type 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);
  }
}

← Retour à la fiche