Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

🧠 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 timer
  • hal::int - Interrupt priorities, sleep mode wakeup
  • hal::gpio - WKUP pin configuration

📖 Referanslar

← HAL Modülleri