hal::power

Power Management - Ultra Low Power Modes

~420 satır ~20 fonksiyon STM32/GD32

Genel Bakış

Power modülü, embedded sistemlerde enerji verimliliği için kritik önem taşır. Sleep, Stop ve Standby modları ile güç tüketimini mikroamperlere düşürür. Bataryalı IoT cihazları, wearable'lar ve uzun ömürlü sensör ağları için vazgeçilmezdir.

Temel Özellikler

Hızlı Başlangıç

içe_aktar hal::power, hal::rcc

// Sleep Mode (WFI - Wait For Interrupt)
power.enter_sleep_mode(yap
    mode: power.SLEEP_ON_EXIT
son)

// Stop Mode (ultra low power)
power.enter_stop_mode(yap
    regulator: power.REGULATOR_LOW_POWER,
    wakeup_source: power.WAKEUP_RTC
son)

// Restore clocks after wakeup from Stop
rcc.sysclk_restore()

// Standby Mode (lowest power)
power.enter_standby_mode(yap
    wakeup_pin: power.WAKEUP_PIN1,
    rtc_alarm: doğru
son)

Tipler ve Enum'lar

// Power Modes
enum PowerMode {
    RUN,       // Normal operation
    SLEEP,     // CPU stopped, peripherals active
    STOP,      // All clocks stopped, SRAM retained
    STANDBY    // Only backup domain active
}

// Regulator Modes
enum Regulator {
    REGULATOR_MAIN,       // Main regulator (faster wakeup)
    REGULATOR_LOW_POWER   // Low-power regulator (lower current)
}

// Wakeup Sources
enum WakeupSource {
    WAKEUP_PIN1,  // PA0
    WAKEUP_PIN2,  // PC13
    WAKEUP_RTC,   // RTC alarm
    WAKEUP_TAMPER,
    WAKEUP_RESET
}

// Voltage Scaling
enum VoltageScale {
    SCALE_1,  // 1.8V (high performance, 168 MHz)
    SCALE_2,  // 1.5V (medium, 144 MHz)
    SCALE_3   // 1.2V (low power, 120 MHz)
}

yapı PowerConfig yap
    mode: PowerMode,
    regulator: Regulator,
    wakeup_source: WakeupSource,
    flash_power_down: mantık = doğru,
    low_power_deepsleep: mantık = doğru
son

Örnek 1: Sleep Mode - Periodic Sensor Reading

Problem: 1 saniyede bir sensör okuyup enerji tasarrufu yapmak

içe_aktar hal::power, hal::rtc, hal::adc, hal::gpio

fonksiyon sensor_sistemi_init() yap
    // RTC wakeup timer (1 Hz)
    rtc.init(yap
        clock_source: rtc.LSI,
        async_prescaler: 127,
        sync_prescaler: 249  // 32 kHz / 128 / 250 = 1 Hz
    son)
    
    rtc.set_wakeup_timer(yap
        period: 1,  // 1 second
        callback: sensor_oku_handler
    son)
    
    // ADC for temperature sensor
    adc.init(adc.ADC1, yap
        resolution: adc.RES_12BIT,
        channel: adc.CH_TEMP
    son)
son

değişken sensor_veri: Dizi = []

fonksiyon sensor_oku_handler() yap
    // Woke up from sleep!
    
    // Read temperature
    değişken temp = adc.read_single(adc.ADC1, adc.CH_TEMP)
    değişken celsius = (temp * 3.3 / 4096.0 - 0.76) / 0.0025 + 25.0
    
    sensor_veri.ekle(celsius)
    
    // Log every 10 readings
    eğer (sensor_veri.uzunluk >= 10) yap
        değişken ortalama = sensor_veri.topla() / sensor_veri.uzunluk kayıt kesir
        io.yazdir_satır("Avg temp: " + ortalama.metne() + " C")
        sensor_veri.temizle()
    son
son

fonksiyon ana() yap
    sensor_sistemi_init()
    
    io.yazdir_satır("Entering sleep mode with RTC wakeup...")
    
    döngü yap
        // Enter sleep mode (CPU stops, RTC continues)
        power.enter_sleep_mode(yap
            mode: power.SLEEP_WFI
        son)
        
        // Wakes up here on RTC interrupt
        // sensor_oku_handler() already executed
    son
son

Güç Tüketimi: Sleep mode ~1-2 mA (peripherals active), Run mode ~20 mA. Ortalama ~2 mA (90% sleep, 10% active).

Örnek 2: Stop Mode - Button Wakeup (Ultra Low Power)

Problem: Buton basılana kadar minimum güç tüketimi

içe_aktar hal::power, hal::exti, hal::gpio, hal::rcc

fonksiyon dusuk_guc_init() yap
    // PA0 -> Wakeup button (external interrupt)
    gpio.pin_init(gpio.PORT_A, 0, yap
        mode: gpio.MODE_INPUT,
        pull: gpio.PULL_DOWN
    son)
    
    exti.init(0, yap
        trigger: exti.TRIGGER_RISING,
        mode: exti.MODE_EVENT  // Event mode for wakeup
    son)
    
    // Disable unnecessary peripherals
    rcc.periph_clock_disable(rcc.PERIPH_TIM2)
    rcc.periph_clock_disable(rcc.PERIPH_TIM3)
    rcc.periph_clock_disable(rcc.PERIPH_USART2)
son

fonksiyon ana() yap
    dusuk_guc_init()
    
    io.yazdir_satır("System initialized")
    io.yazdir_satır("Entering Stop Mode (press button to wake up)...")
    
    // Flash power down for extra savings
    power.flash_power_down_enable()
    
    // Enter Stop Mode
    power.enter_stop_mode(yap
        regulator: power.REGULATOR_LOW_POWER,
        entry: power.ENTRY_WFE  // Wait For Event
    son)
    
    // *** WOKE UP HERE ***
    
    // Restore system clock (Stop mode uses HSI/8)
    rcc.sysclk_restore()
    
    // Re-enable flash
    power.flash_power_down_disable()
    
    io.yazdir_satır("Woke up from Stop Mode!")
    
    // Do work
    led_blink(5)
    
    // Go back to sleep
    io.yazdir_satır("Entering Stop Mode again...")
    // (loop or jump to stop entry)
son

Güç Tüketimi: Stop mode <1 μA (STM32L4), ~10 μA (STM32F4). Wakeup time ~5-10 μs.

Örnek 3: Standby Mode - RTC Alarm Wakeup (Deepest Sleep)

Problem: 1 saat uyuyup uyanma, SRAM kaybedilir ama backup domain korunur

içe_aktar hal::power, hal::rtc, hal::backup

sabit MAGIC_NUMBER: sayı = 0xDEADBEEF

fonksiyon standby_sistemi_init() yap
    // Enable backup domain access
    power.backup_access_enable()
    
    // RTC configuration (LSE for accuracy)
    rtc.init(yap
        clock_source: rtc.LSE,  // External 32.768 kHz crystal
        hour_format: rtc.FORMAT_24H
    son)
    
    // Check if woke up from standby
    eğer power.get_flag(power.FLAG_STANDBY) yap
        io.yazdir_satır("Woke up from Standby!")
        power.clear_flag(power.FLAG_STANDBY)
        
        // Check backup register
        değişken magic = backup.read_register(0)
        eğer (magic == MAGIC_NUMBER) yap
            değişken wake_count = backup.read_register(1)
            wake_count = wake_count + 1
            backup.write_register(1, wake_count)
            
            io.yazdir_satır("Wakeup count: " + wake_count.metne())
        son
    yoksa yap
        io.yazdir_satır("Fresh boot, initializing...")
        backup.write_register(0, MAGIC_NUMBER)
        backup.write_register(1, 0)
    son
son

fonksiyon standby_ile_uyku(saat: sayı) yap
    // Set RTC alarm (wake up after N hours)
    değişken simdiki_zaman = rtc.get_time()
    değişken alarm_zaman = rtc.Time yap
        hour: (simdiki_zaman.hour + saat) % 24,
        minute: simdiki_zaman.minute,
        second: simdiki_zaman.second
    son
    
    rtc.set_alarm(rtc.ALARM_A, alarm_zaman)
    
    // Enable wakeup pin as backup
    power.wakeup_pin_enable(power.WAKEUP_PIN1)
    
    io.yazdir_satır("Entering Standby for " + saat.metne() + " hours...")
    io.yazdir_satır("(All RAM will be lost, only backup registers preserved)")
    
    // Enter Standby Mode
    power.enter_standby_mode()
    
    // *** NEVER RETURNS - FULL SYSTEM RESET ON WAKEUP ***
son

fonksiyon ana() yap
    standby_sistemi_init()
    
    // Do some work
    io.yazdir_satır("Doing important work...")
    led_blink(3)
    
    // Sleep for 1 hour
    standby_ile_uyku(1)
son

Güç Tüketimi: Standby mode ~0.3-2 μA. 1 saat uyku = 0.0003 mAh. 1000 mAh batarya ile 380+ yıl!

Örnek 4: Voltage Scaling for Dynamic Performance

Problem: Yüksek performans gerektiğinde Scale 1, düşük güçte Scale 3 kullanmak

içe_aktar hal::power, hal::rcc

enum PerformanceMode {
    HIGH_PERF,   // 168 MHz
    NORMAL,      // 120 MHz
    LOW_POWER    // 80 MHz
}

fonksiyon set_performance_mode(mode: PerformanceMode) yap
    eşleştir mode yap
        PerformanceMode.HIGH_PERF => yap
            // Voltage Scale 1 (1.8V)
            power.set_voltage_scaling(power.SCALE_1)
            
            // PLL config for 168 MHz (HSE 8 MHz)
            rcc.pll_config(yap
                source: rcc.PLL_HSE,
                pllm: 8,
                plln: 336,
                pllp: 2,
                pllq: 7
            son)
            
            rcc.sysclk_set(rcc.SYSCLK_PLL, 168_000_000)
            
            io.yazdir_satır("High Performance: 168 MHz, ~100 mA")
        son,
        
        PerformanceMode.NORMAL => yap
            // Voltage Scale 2 (1.5V)
            power.set_voltage_scaling(power.SCALE_2)
            
            rcc.pll_config(yap
                source: rcc.PLL_HSE,
                pllm: 8,
                plln: 240,
                pllp: 2,
                pllq: 5
            son)
            
            rcc.sysclk_set(rcc.SYSCLK_PLL, 120_000_000)
            
            io.yazdir_satır("Normal: 120 MHz, ~60 mA")
        son,
        
        PerformanceMode.LOW_POWER => yap
            // Voltage Scale 3 (1.2V)
            power.set_voltage_scaling(power.SCALE_3)
            
            rcc.sysclk_set(rcc.SYSCLK_HSI, 16_000_000)
            
            io.yazdir_satır("Low Power: 16 MHz, ~10 mA")
        son
    son
son

fonksiyon ana() yap
    // Start in low power
    set_performance_mode(PerformanceMode.LOW_POWER)
    
    döngü yap
        // Idle state
        power.enter_sleep_mode(yap mode: power.SLEEP_WFI son)
        
        // Check if high-performance task needed
        eğer heavy_computation_requested() yap
            set_performance_mode(PerformanceMode.HIGH_PERF)
            perform_fft_analysis()
            set_performance_mode(PerformanceMode.LOW_POWER)
        son
    son
son

Sonuç: Dynamic scaling ile ortalama güç tüketimi %40-60 azalır.

API Referansı

Power Modes

// Sleep mode entry
fonksiyon enter_sleep_mode(mode: SleepMode)

// Stop mode entry
fonksiyon enter_stop_mode(config: StopConfig)

// Standby mode entry
fonksiyon enter_standby_mode()

// Wakeup configuration
fonksiyon wakeup_pin_enable(pin: WakeupPin)
fonksiyon wakeup_pin_disable(pin: WakeupPin)

// Voltage scaling
fonksiyon set_voltage_scaling(scale: VoltageScale)
fonksiyon get_voltage_scaling() -> VoltageScale

// PVD (Programmable Voltage Detector)
fonksiyon pvd_enable(level: PVDLevel)
fonksiyon pvd_disable()

// Backup domain
fonksiyon backup_access_enable()
fonksiyon backup_access_disable()

// Flags
fonksiyon get_flag(flag: PowerFlag) -> mantık
fonksiyon clear_flag(flag: PowerFlag)

// Flash power control
fonksiyon flash_power_down_enable()
fonksiyon flash_power_down_disable()
Önemli Notlar:
  • Stop Mode Wakeup: Clock kaynağı HSI/8'e döner, sysclk_restore() gerekli
  • Standby Wakeup: Full system reset, tüm SRAM kaybolur (backup domain hariç)
  • Debug Limitations: Stop/Standby modunda debugger bağlantısı kesilir
  • Peripheral State: Stop modunda peripheral state korunur, Standby'de kaybolur

Platform Desteği

Platform Sleep Current Stop Current Standby Current
STM32F1 1.5 mA 22 μA 2 μA
STM32F4 2.1 mA 11 μA 1.8 μA
STM32L4 0.9 mA 0.6 μA 0.3 μA
STM32H7 4 mA 50 μA 6 μA

Best Practices

İlgili Modüller

HAL Modülleri | English