🧠 hal::core
System Core - Clock, Reset, Power Management
367 satır
~15 fonksiyon
RCC
📖 Genel Bakış
Core modülü, sistem başlatma, clock konfigürasyonu, reset ve güç yönetimi fonksiyonları sağlar.
🔑 Temel Özellikler
- System initialization
- Clock configuration (up to 168MHz)
- Delay functions (ms/us)
- System reset
- Power modes (sleep/stop/standby)
- Uptime counter
🚀 Hızlı Başlangıç
içe_aktar hal::core
fonksiyon ana() yap
// System initialization
core.system_init()
// Configure system clock to 72MHz
core.clock_config(72_000_000)
// Delays
core.delay_ms(1000) // 1 second
core.delay_us(500) // 500 microseconds
// Get uptime
değişken uptime = core.uptime_ms()
io.println("Uptime: {}ms", uptime)
// System reset
core.system_reset()
son
⚙️ Clock Configuration
// Common frequencies
core.clock_config(8_000_000) // 8MHz (HSI)
core.clock_config(72_000_000) // 72MHz (STM32F1)
core.clock_config(84_000_000) // 84MHz (STM32F4)
core.clock_config(168_000_000) // 168MHz (STM32F4)
💤 Power Modes
// Sleep mode (CPU stopped, peripherals running)
core.sleep()
// Stop mode (all clocks stopped, RAM retained)
core.stop()
// Standby mode (lowest power, only wakeup pins active)
core.standby()
💡 Örnek: System Clock Configuration (STM32F4 168MHz)
içe_aktar hal::core
fonksiyon configure_168mhz() yap
// Configure PLL for 168MHz from 8MHz HSE
core.pll_config(yap
source: core.PLL_HSE, // External crystal
pllm: 8, // VCO input: 8MHz / 8 = 1MHz
plln: 336, // VCO output: 1MHz * 336 = 336MHz
pllp: core.PLLP_DIV2, // System clock: 336MHz / 2 = 168MHz
pllq: 7 // USB clock: 336MHz / 7 = 48MHz
son)
// Configure bus clocks
core.bus_config(yap
ahb_prescaler: core.AHB_DIV1, // AHB = 168MHz
apb1_prescaler: core.APB_DIV4, // APB1 = 42MHz (max 42MHz)
apb2_prescaler: core.APB_DIV2 // APB2 = 84MHz (max 84MHz)
son)
// Flash latency for 168MHz @ 3.3V
core.flash_latency(5) // 5 wait states
// Switch to PLL
core.system_clock_source(core.SYSCLK_PLL)
// Wait for PLL ready
döngü core.get_clock_source() != core.SYSCLK_PLL değilse yap
// Wait
son
io.println("System clock: {}MHz", core.get_sysclk_freq() / 1_000_000)
son
fonksiyon ana() yap
configure_168mhz()
// Verify clocks
io.println("SYSCLK: {}MHz", core.get_sysclk_freq() / 1_000_000)
io.println("AHB: {}MHz", core.get_hclk_freq() / 1_000_000)
io.println("APB1: {}MHz", core.get_pclk1_freq() / 1_000_000)
io.println("APB2: {}MHz", core.get_pclk2_freq() / 1_000_000)
son
💡 Örnek: Low-Power Sleep Mode
içe_aktar hal::core, hal::int, hal::gpio
değişken wakeup_flag = yanlış
fonksiyon button_interrupt() yap
wakeup_flag = doğru
son
fonksiyon sleep_until_button() yap
// Configure button interrupt (PA0)
gpio.clock_enable(gpio.PORT_A)
gpio.pin_init(gpio.PORT_A, 0, yap
mode: gpio.MODE_INPUT,
pull: gpio.PULL_DOWN,
interrupt: gpio.INT_RISING
son)
gpio.set_callback(gpio.PORT_A, 0, button_interrupt)
io.println("Going to sleep... (press button to wake)")
core.delay_ms(100) // Flush UART
// Enter sleep mode
core.sleep()
// Wakeup on any interrupt
io.println("Woke up from sleep!")
son
fonksiyon ana() yap
döngü yap
sleep_until_button()
core.delay_ms(1000)
son
son
💡 Örnek: Watchdog Timer (IWDG)
içe_aktar hal::core
fonksiyon watchdog_test() yap
// Initialize Independent Watchdog (4 second timeout)
core.iwdg_init(yap
prescaler: core.IWDG_PRESCALER_64, // LSI/64
reload: 2000 // (32kHz/64) * 2000 = 4 seconds
son)
io.println("Watchdog started (4s timeout)")
// Normal operation: feed watchdog regularly
her i içinde 0..10 için yap
io.println("Working... {}", i)
core.delay_ms(500)
core.iwdg_refresh() // "Feed" watchdog
son
// Simulate hang (don't feed watchdog)
io.println("Simulating hang...")
döngü yap
core.delay_ms(1000)
// Watchdog will reset system after 4s
son
son
fonksiyon ana() yap
// Check if last reset was watchdog
eğer core.get_reset_reason() == core.RESET_IWDG ise yap
io.println("⚠️ System reset by watchdog!")
core.clear_reset_flags()
son
watchdog_test()
son
💡 Örnek: Brownout Detection & Reset Handling
içe_aktar hal::core
enum ResetReason {
POWER_ON,
RESET_PIN,
IWDG,
WWDG,
SOFTWARE,
BROWNOUT,
UNKNOWN
}
fonksiyon get_reset_reason_detailed() -> ResetReason yap
değişken flags = core.get_reset_flags()
değişken reason = eşle flags yap
_ eğer (flags & core.FLAG_LPWR) != 0 => ResetReason::BROWNOUT,
_ eğer (flags & core.FLAG_WWDG) != 0 => ResetReason::WWDG,
_ eğer (flags & core.FLAG_IWDG) != 0 => ResetReason::IWDG,
_ eğer (flags & core.FLAG_SFT) != 0 => ResetReason::SOFTWARE,
_ eğer (flags & core.FLAG_PIN) != 0 => ResetReason::RESET_PIN,
_ eğer (flags & core.FLAG_POR) != 0 => ResetReason::POWER_ON,
_ => ResetReason::UNKNOWN
son
core.clear_reset_flags()
dön reason
son
fonksiyon reset_handler() yap
değişken reason = get_reset_reason_detailed()
io.println("\n=== System Boot ===")
io.println("Reset reason: {}", reason)
eşle reason yap
ResetReason::POWER_ON => yap
io.println("Fresh power-on, initializing...")
// First boot initialization
son,
ResetReason::BROWNOUT => yap
io.println("⚠️ Brownout detected! Check power supply.")
// Save diagnostics
son,
ResetReason::IWDG => yap
io.println("⚠️ Watchdog reset! System hang detected.")
// Crash recovery
son,
ResetReason::SOFTWARE => yap
io.println("Software reset (firmware update?)")
son,
_ => yap
io.println("Unexpected reset")
son
son
son
fonksiyon ana() yap
reset_handler()
// Normal program
döngü yap
io.println("Running...")
core.delay_ms(1000)
son
son
💡 Örnek: CPU Load Monitoring
içe_aktar hal::core
değişken idle_counter = 0
değişken total_counter = 0
fonksiyon calculate_cpu_load() -> kesir yap
değişken idle = idle_counter
değişken total = total_counter
// Reset counters
idle_counter = 0
total_counter = 0
değişken cpu_load = 100.0 - (idle.kesir() / total.kesir() * 100.0)
dön cpu_load
son
fonksiyon idle_task() yap
// Count idle cycles
idle_counter += 1
total_counter += 1
son
fonksiyon work_task() yap
// Simulate work
değişken sum = 0
her i içinde 0..1000 için yap
sum += i
son
total_counter += 1000
son
fonksiyon ana() yap
döngü yap
// Do some work
work_task()
// Idle time
idle_task()
// Report every second
eğer core.uptime_ms() % 1000 == 0 ise yap
değişken cpu_load = calculate_cpu_load()
io.println("CPU load: {:.1f}%", cpu_load)
son
son
son
⚙️ Core Fonksiyonları
// System initialization
fonksiyon system_init()
fonksiyon deinit()
// Clock configuration
fonksiyon clock_config(freq: sayı) // Simple config
fonksiyon pll_config(config: PLLConfig) // Advanced
fonksiyon bus_config(config: BusConfig)
fonksiyon flash_latency(wait_states: sayı)
// Clock queries
fonksiyon get_sysclk_freq() -> sayı
fonksiyon get_hclk_freq() -> sayı
fonksiyon get_pclk1_freq() -> sayı
fonksiyon get_pclk2_freq() -> sayı
// Delays
fonksiyon delay_ms(ms: sayı)
fonksiyon delay_us(us: sayı)
fonksiyon delay_cycles(cycles: sayı)
// Uptime
fonksiyon uptime_ms() -> sayı
fonksiyon uptime_us() -> sayı
fonksiyon tick() -> sayı // SysTick counter
// Power modes
fonksiyon sleep() // Sleep mode
fonksiyon stop() // Stop mode
fonksiyon standby() // Standby mode (lowest power)
// Reset
fonksiyon system_reset()
fonksiyon software_reset()
fonksiyon get_reset_reason() -> ResetReason
fonksiyon get_reset_flags() -> sayı
fonksiyon clear_reset_flags()
// Watchdog
fonksiyon iwdg_init(config: IWDGConfig) // Independent watchdog
fonksiyon iwdg_refresh() // "Feed" watchdog
fonksiyon wwdg_init(config: WWDGConfig) // Window watchdog
// CPU info
fonksiyon get_cpu_id() -> sayı
fonksiyon get_flash_size() -> sayı // KB
fonksiyon get_ram_size() -> sayı // KB
📊 Power Mode Comparison
| Mode | Power | Wakeup Time | Wakeup Source |
|---|---|---|---|
| Run | ~30mA | - | - |
| Sleep | ~15mA | Instant | Any interrupt |
| Stop | ~10μA | ~5μs | EXTI, RTC, watchdog |
| Standby | ~1μA | ~50μs | WKUP pin, RTC alarm |
⚡ Performans İpuçları
- Flash Latency: Yüksek frekans için wait state ekleyin (168MHz = 5 WS)
- PLL Config: VCO 192-432MHz range'de tutun (optimal)
- APB1: Maximum 42MHz (STM32F4), timer clock x2
- Sleep Mode: Quick power save, instant wakeup
- Watchdog: Kullanın system reliability için (hang recovery)
⚠️ Önemli Notlar
- Flash Latency: Yüksek frekans için otomatik ayarlanır (168MHz @ 3.3V = 5 WS)
- PLL Lock Time: PLL stabilization için ~200μs bekleyin
- Standby Mode: Çıkışta system reset olur, backup domain preserved
- Watchdog Start: IWDG başlatıldıktan sonra durdurulamaz
- LSE Startup: External 32kHz crystal için ~1s startup time
- HSE Bypass: External clock source için crystal yerine
🔗 İlgili Modüller
hal::rtc- RTC clock configuration, wakeup timerhal::int- Interrupt priorities, sleep mode wakeuphal::gpio- WKUP pin configuration
📖 Referanslar
- AN4621: STM32 Clock Configuration
- AN4365: Using STM32 Power Modes
- Reference Manual: Reset and clock control (RCC) chapter