rtc-reveil.c

STM32H7 Nucleo-144 (porte-drapeau : NUCLEO-H743ZI) · 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 H7 (STM32H743ZI, Cortex-M7 @ 480 MHz) 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

Projet STM32CubeIDE base sur la Nucleo-H743ZI : le code se glisse dans main.c, les peripheriques se declarent dans le .ioc, puis Run via l'interface ST-LINK. Le moniteur 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(GPIOB, GPIO_PIN_0);
    }
    HAL_Delay(1000);
  }
}

← Retour à la fiche