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::gpio

General Purpose Input/Output Control - GPIO Pin Yönetimi

381 satır ~30 fonksiyon STM32/GD32/ESP32

📖 Genel Bakış

GPIO (General Purpose Input/Output) modülü, mikrokontrolcü pinlerinin dijital giriş/çıkış olarak kontrolünü sağlar. LED kontrolü, buton okuma, sensör arayüzleri ve dijital sinyaller için kullanılır.

🔑 Temel Özellikler

  • Digital input/output modes
  • Push-pull/Open-drain output
  • Pull-up/Pull-down resistors
  • Pin speed configuration
  • Interrupt support (EXTI)
  • Alternate function mapping
  • Atomic bit operations
  • Port locking

🚀 Hızlı Başlangıç

içe_aktar hal::gpio

// GPIO clock enable
gpio.clock_enable(gpio.PORT_C)

// LED pin setup (output)
değişken led = gpio.pin_init(gpio.PORT_C, 13, yap
    mode: gpio.MODE_OUTPUT,
    speed: gpio.SPEED_LOW,
    pull: gpio.PULL_NONE
son)

// LED control
gpio.pin_write(led, gpio.HIGH)  // Turn on
gpio.pin_toggle(led)  // Toggle
gpio.pin_write(led, gpio.LOW)  // Turn off

📦 Tipler ve Enum'lar

// GPIO Portları
enum Port {
    A, B, C, D, E, F, G, H, I
}

// Pin Modları
enum Mode {
    INPUT,        // Digital input
    OUTPUT,       // Push-pull output
    OUTPUT_OD,    // Open-drain output
    AF,           // Alternate function push-pull
    AF_OD,        // Alternate function open-drain
    ANALOG        // Analog mode
}

// Hız Seviyesi
enum Speed {
    LOW,       // Low speed (2 MHz)
    MEDIUM,    // Medium speed (25 MHz)
    HIGH,      // High speed (50 MHz)
    VERY_HIGH  // Very high speed (100 MHz)
}

// Pull Direnci
enum Pull {
    NONE,  // No pull resistor
    UP,    // Pull-up
    DOWN   // Pull-down
}

// Logic Level
enum Level {
    LOW,   // Logic 0 (0V)
    HIGH   // Logic 1 (3.3V/5V)
}

// Interrupt Tetikleme
enum Trigger {
    RISING,   // Rising edge
    FALLING,  // Falling edge
    BOTH      // Both edges
}

⚙️ Fonksiyonlar

Clock Management

fonksiyon clock_enable(port: Port) -> Sonuç[Hiçbir, Hata]
// Enable GPIO port clock

fonksiyon clock_disable(port: Port) -> Sonuç[Hiçbir, Hata]
// Disable GPIO port clock

Pin Initialization

fonksiyon pin_init(port: Port, pin: sayı, config: PinConfig) -> Pin
// Initialize GPIO pin with configuration

// PinConfig structure
yapı PinConfig yap
    mode: Mode,      // Pin mode
    speed: Speed,    // Output speed
    pull: Pull,      // Pull resistor
    af: İsteğe_Bağlı[sayı]  // Alternate function number
son

Digital I/O

fonksiyon pin_write(pin: Pin, level: Level)
// Write digital output

fonksiyon pin_read(pin: Pin) -> Level
// Read digital input

fonksiyon pin_toggle(pin: Pin)
// Toggle output pin

fonksiyon port_write(port: Port, value: u16)
// Write entire port (16 pins)

fonksiyon port_read(port: Port) -> u16
// Read entire port

Interrupt Management

fonksiyon interrupt_enable(pin: Pin, trigger: Trigger, callback: İşlev)
// Enable pin interrupt

fonksiyon interrupt_disable(pin: Pin)
// Disable pin interrupt

💡 Örnek 1: LED Blink

içe_aktar hal::gpio, hal::core

fonksiyon ana() yap
    // System init
    core.system_init()
    core.clock_config(72_000_000)  // 72MHz
    
    // LED setup (PC13 on STM32 Blue Pill)
    gpio.clock_enable(gpio.PORT_C)
    değişken led = gpio.pin_init(gpio.PORT_C, 13, yap
        mode: gpio.MODE_OUTPUT,
        speed: gpio.SPEED_LOW,
        pull: gpio.PULL_NONE
    son)
    
    // Blink loop
    döngü yap
        gpio.pin_toggle(led)
        core.delay_ms(500)
    son
son

💡 Örnek 2: Button Input with Interrupt

içe_aktar hal::gpio, hal::int

değişken button_pressed = yanlış

fonksiyon button_handler() yap
    button_pressed = doğru
    io.println("Button pressed!")
son

fonksiyon ana() yap
    // LED setup (output)
    gpio.clock_enable(gpio.PORT_C)
    değişken led = gpio.pin_init(gpio.PORT_C, 13, yap
        mode: gpio.MODE_OUTPUT,
        speed: gpio.SPEED_LOW,
        pull: gpio.PULL_NONE
    son)
    
    // Button setup (input with pull-up)
    gpio.clock_enable(gpio.PORT_A)
    değişken button = gpio.pin_init(gpio.PORT_A, 0, yap
        mode: gpio.MODE_INPUT,
        pull: gpio.PULL_UP,
        speed: gpio.SPEED_LOW
    son)
    
    // Enable button interrupt
    gpio.interrupt_enable(button, gpio.TRIGGER_FALLING, button_handler)
    
    // Main loop
    döngü yap
        eğer button_pressed ise yap
            button_pressed = yanlış
            gpio.pin_toggle(led)
        son
        core.delay_ms(10)
    son
son

💡 Örnek 3: Multi-LED Control (Port Operations)

içe_aktar hal::gpio, hal::core

fonksiyon ana() yap
    core.system_init()
    
    // Setup 8 LEDs on Port B (PB0-PB7)
    gpio.clock_enable(gpio.PORT_B)
    
    // Initialize all 8 pins
    her i içinde 0..8 için yap
        gpio.pin_init(gpio.PORT_B, i, yap
            mode: gpio.MODE_OUTPUT,
            speed: gpio.SPEED_MEDIUM,
            pull: gpio.PULL_NONE
        son)
    son
    
    // LED patterns
    değişken patterns = [
        0b00000001,  // Single LED
        0b00000011,  // 2 LEDs
        0b00000111,  // 3 LEDs
        0b00001111,  // 4 LEDs
        0b00011111,  // 5 LEDs
        0b00111111,  // 6 LEDs
        0b01111111,  // 7 LEDs
        0b11111111   // All LEDs
    ]
    
    döngü yap
        her pattern içinde patterns için yap
            gpio.port_write(gpio.PORT_B, pattern)
            core.delay_ms(200)
        son
        
        // Reverse
        her pattern içinde patterns.ters() için yap
            gpio.port_write(gpio.PORT_B, pattern)
            core.delay_ms(200)
        son
    son
son

💡 Örnek 4: Traffic Light Controller

içe_aktar hal::gpio, hal::core

yapı TrafficLight yap
    red: gpio.Pin,
    yellow: gpio.Pin,
    green: gpio.Pin
son

fonksiyon traffic_light_init() -> TrafficLight yap
    gpio.clock_enable(gpio.PORT_A)
    
    değişken tl = TrafficLight yap
        red: gpio.pin_init(gpio.PORT_A, 0, yap
            mode: gpio.MODE_OUTPUT,
            speed: gpio.SPEED_LOW,
            pull: gpio.PULL_NONE
        son),
        yellow: gpio.pin_init(gpio.PORT_A, 1, yap
            mode: gpio.MODE_OUTPUT,
            speed: gpio.SPEED_LOW,
            pull: gpio.PULL_NONE
        son),
        green: gpio.pin_init(gpio.PORT_A, 2, yap
            mode: gpio.MODE_OUTPUT,
            speed: gpio.SPEED_LOW,
            pull: gpio.PULL_NONE
        son)
    son
    
    dön tl
son

fonksiyon set_state(tl: TrafficLight, red: mantıksal, yellow: mantıksal, green: mantıksal) yap
    gpio.pin_write(tl.red, eğer red ise gpio.HIGH yoksa gpio.LOW)
    gpio.pin_write(tl.yellow, eğer yellow ise gpio.HIGH yoksa gpio.LOW)
    gpio.pin_write(tl.green, eğer green ise gpio.HIGH yoksa gpio.LOW)
son

fonksiyon ana() yap
    core.system_init()
    değişken tl = traffic_light_init()
    
    döngü yap
        // Green light
        set_state(tl, yanlış, yanlış, doğru)
        core.delay_ms(5000)
        
        // Yellow light
        set_state(tl, yanlış, doğru, yanlış)
        core.delay_ms(2000)
        
        // Red light
        set_state(tl, doğru, yanlış, yanlış)
        core.delay_ms(5000)
    son
son

⚠️ Önemli Notlar

  • Pin kullanmadan önce port clock'unu enable etmelisiniz
  • Open-drain çıkışlar external pull-up gerektirir
  • 5V tolerant pinler için datasheet kontrol edin
  • Interrupt kullanırken NVIC konfigürasyonu gerekir
  • Maximum pin current sınırlarına dikkat edin (~25mA)
  • Analog mode kullanırken dijital bufferleri disable edilir

📚 Platform Desteği

  • STM32: Tüm F/L/H/G serisi
  • GD32: GD32VF103 (RISC-V)
  • ESP32: GPIO 0-39
  • Nordic: nRF52/53 GPIO

🔗 İlgili Modüller

  • hal::int - Interrupt controller
  • hal::core - System initialization
  • hal::timer - PWM generation

← HAL Modülleri | Tüm Modüller | Ana Sayfa