🔌 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 controllerhal::core- System initializationhal::timer- PWM generation