rtc-reveil.c
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 STM32F407G-DISC1 (Discovery F4, Cortex-M4 @ 168 MHz) avec ST-LINK integre, 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 « STM32F407G-DISC1 » : coller le code dans main.c, configurer le .ioc, Run. La carte dispose de 4 LED (PD12-PD15) et du bouton USER sur PA0.
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(GPIOD, GPIO_PIN_12);
}
HAL_Delay(1000);
}
}