🛠 Sommeil profond Stop et réveil par RTC

GD32F103 (GigaDevice) — puce + cartes compatibles Blue Pill · avance · Schéma : IMG-gd32f103-avance-3-stop-rtc-reveil.svg — GD32F103C8 en mode Stop, horloges coupées, RTC sur IRC40K réveillant le CPU toutes les 2 secondes, LED PC13 pulsée à chaque réveil

Objectifs

Diviser la consommation par mille : plonger le GD32F103 en mode Stop (cœur et horloges APB arrêtés, SRAM conservée) et le réveiller périodiquement avec la RTC. Ordre de grandeur donné par la datasheet : environ 5,6 à 5,8 µA en standby RTC active, et un réveil en quelques microsecondes depuis le sleep. Vous apprendrez la hiérarchie Sleep/Stop/Standby, le rôle de VBAT et d'IRC40K (ou LXTAL 32,768 kHz), et le piège du retour à IRC8M après réveil.

Matériel

Code complet

/* stop_rtc.c — GD32F103C8, SPL V2.2.x : Stop + réveil RTC chaque seconde. */
#include "gd32f10x.h"

static bool led_on = false;

void RTC_IRQHandler(void)
{
    if (rtc_flag_get(RTC_FLAG_SECOND) == SET) {
        rtc_flag_clear(RTC_FLAG_SECOND);
        led_on = !led_on;   /* la LED ne clignote qu'aux reveils */
        gpio_bit_write(GPIOC, GPIO_PIN_13, led_on ? RESET : SET);
    }
}

static void rtc_source_irc40k(void)
{
    /* 1) source RTC = IRC40K interne (pas de quartz externe requis) */
    rcu_osci_on(RCU_IRC40K);
    rcu_osci_stab_wait(RCU_IRC40K);
    rcu_rtc_clock_config(RCU_RTCSRC_IRC40K);

    /* 2) horloge de la RTC et de la interface backup */
    rcu_periph_clock_enable(RCU_PMU);
    rcu_periph_clock_enable(RCU_BKPI);
    pmu_backup_write_enable;

    /* 3) RTC : prescaler 32768 -> 1 Hz, interruption « seconde » */
    rtc_init;
    rtc_interrupt_enable(RTC_INT_SECOND);
    rtc_enable;
    while (rtc_flag_get(RTC_FLAG_INITS) != SET) { }  /* sync. registres */

    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
    nvic_irq_enable(RTC_IRQn, 1, 0);
}

int main(void)
{
    rcu_periph_clock_enable(RCU_GPIOC);
    gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);

    rtc_source_irc40k;

    while (1) {
        /* Entree en Stop : WFI, le réveil se fait par l'IRQ RTC.
           En Stop, le système repart sur IRC8M (8 MHz) au réveil :
           reconfigurer le PLL 108 MHz si le code en a besoin. */
        pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD, STOP_MODE_ENTRY);
        /* ... ici, on revient a chaque seconde ... */
    }
}

Vérification attendue

La LED PC13 pulse une fois par seconde (chaque réveil RTC), et le microampèremètre chute fortement pendant les phases de Stop par rapport au mode run (à l'échelle de la centaine de µA contre 34-45 mA en run à 108 MHz d'après la datasheet ; le plancher standby est d'environ 5,6-5,8 µA RTC active). En mode débogage SWD, la connexion peut tomber pendant le Stop : c'est normal, reprenez la main juste après un réveil.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels