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
- Sleep Mode: CPU durdurulur, periferaller çalışır (run mode -> sleep ~1-2ms)
- Stop Mode: Tüm clocklar durdurulur, SRAM korunur (<1 μA typical)
- Standby Mode: Backup domain hariç her şey kapalı (~0.3 μA)
- Voltage Scaling: 1.8V - 3.6V arası dinamik voltaj ayarı
- PVD (Programmable Voltage Detector): Düşük voltaj uyarısı
- Backup Domain: RTC + 4KB backup SRAM (Standby'de korunur)
- Wakeup Sources: RTC alarm, EXTI, USART, USB, tamper
- Regulator Modes: Main/Low-power regulator seçimi
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
- Peripheral kapatma: Stop öncesi kullanılmayan peripheral'ları disable et
- GPIO low power: Floating pinleri input+pull yapılandır
- Backup domain kullan: Standby'de kalıcı veri için backup register
- RTC calibration: LSI toleransı 5%, LSE kullan (accurate timing)
- Debug etme: Stop/Standby modunda debugger çalışmaz
- SRAM güvenme: Standby'de SRAM kaybolur, kritik veriyi backup domain'e yaz