🔧 HAL - Hardware Abstraction Layer
Hardware Abstraction Layer for Embedded Systems
📋 HAL Modules (21 Modules)
🔌 gpio
381 lines - GPIO Pin Control
Digital I/O, input/output modes, interrupts, pull-up/down
📊 adc
400 lines - Analog-to-Digital Converter
ADC channels, sampling, resolution, DMA support
📈 dac
391 lines - Digital-to-Analog Converter
DAC output, waveform generation, voltage control
🔄 spi
394 lines - Serial Peripheral Interface
SPI master/slave, full-duplex, DMA transfers
🔗 i2c
396 lines - Inter-Integrated Circuit
I2C bus, multi-master, 7/10-bit addressing
📡 usart
407 lines - Universal Serial Communication
UART/USART, baud rates, parity, DMA
🚗 can
383 lines - Controller Area Network
CAN bus, filters, message queues, error handling
⏱️ timer
366 lines - Hardware Timers
PWM, input capture, output compare, encoder mode
🕐 rtc
379 lines - Real-Time Clock
Date/time, alarms, calendar, backup registers
💾 dma
391 lines - Direct Memory Access
Memory-to-memory, peripheral-to-memory transfers
⚡ int
366 lines - Interrupt Controller
NVIC, interrupt priorities, enable/disable
🧠 core
367 lines - CPU Core Functions
System init, clock config, power modes
🎛️ regs
366 lines - Register Access
Memory-mapped registers, bit manipulation
🔧 hw
366 lines - Hardware Utilities
Delays, atomic operations, critical sections
📦 dev
371 lines - Device Management
Device tree, resource allocation
🖥️ host
367 lines - Host Communication
USB host, debugging interface
🔀 pipe
369 lines - Data Pipes
Stream processing, buffering
📝 enum
366 lines - Enumerations
Hardware enums, constants
⚠️ ie
366 lines - Interrupt Events
Event handling, callbacks
🎵 transc
366 lines - Transceivers
RF transceivers, wireless communication
📚 std
366 lines - Standard HAL Library
Common types, utilities
🚀 Quick Start
import hal::gpio, hal::timer
// GPIO LED blink
let led_pin = gpio.pin_init(gpio.PORT_A, 5, gpio.MODE_OUTPUT)
gpio.pin_write(led_pin, gpio.HIGH)
// Timer PWM
let pwm = timer.pwm_init(timer.TIM1, timer.CH1, 1000) // 1kHz
timer.pwm_set_duty(pwm, 50) // 50% duty cycle
timer.pwm_start(pwm)
💡 Example: STM32 LED Blink
import hal::core, hal::gpio, hal::timer
function main() do
// System initialization
core.system_init()
core.clock_config(72_000_000) // 72MHz
// GPIO setup
gpio.clock_enable(gpio.PORT_C)
let led = gpio.pin_init(gpio.PORT_C, 13, do
mode: gpio.MODE_OUTPUT,
speed: gpio.SPEED_LOW,
pull: gpio.PULL_NONE
end)
// Blink loop
loop do
gpio.pin_toggle(led)
core.delay_ms(500)
end
end
💡 Example: ADC Reading
import hal::adc, hal::gpio, hal::core
function read_temperature() -> float do
// ADC setup
adc.clock_enable()
let adc1 = adc.init(adc.ADC1, do
resolution: adc.RESOLUTION_12BIT,
align: adc.ALIGN_RIGHT
end)
// GPIO for analog input
let pin = gpio.pin_init(gpio.PORT_A, 0, gpio.MODE_ANALOG)
// Configure channel
adc.channel_config(adc1, adc.CHANNEL_0, do
sampling_time: adc.SAMPLETIME_480CYCLES
end)
// Read value
adc.start(adc1)
let raw = adc.read(adc1)
// Convert to temperature (example)
let voltage = raw.float() * 3.3 / 4095.0
let temp = (voltage - 0.76) / 0.0025 + 25.0
return temp
end
function main() do
core.system_init()
loop do
let temp = read_temperature()
io.println("Temperature: " + temp.to_string() + "°C")
core.delay_ms(1000)
end
end
💡 Example: I2C OLED Display
import hal::i2c, hal::gpio
const OLED_ADDR = 0x3C
function oled_init(i2c: I2CHandle) do
// Initialization sequence
let init_cmds = [
0xAE, // Display off
0xD5, 0x80, // Clock divide
0xA8, 0x3F, // Multiplex
0xD3, 0x00, // Display offset
0x40, // Start line
0x8D, 0x14, // Charge pump
0x20, 0x00, // Memory mode
0xA1, // Segment remap
0xC8, // COM scan direction
0xDA, 0x12, // COM pins
0x81, 0xCF, // Contrast
0xD9, 0xF1, // Pre-charge
0xDB, 0x40, // VCOMH deselect
0xA4, // Display resume
0xA6, // Normal display
0xAF // Display on
]
for cmd in init_cmds do
i2c.write_byte(i2c, OLED_ADDR, 0x00, cmd)
end
end
function main() do
// I2C setup
gpio.pin_init(gpio.PORT_B, 6, gpio.MODE_AF_OD) // SCL
gpio.pin_init(gpio.PORT_B, 7, gpio.MODE_AF_OD) // SDA
let i2c1 = i2c.init(i2c.I2C1, do
speed: i2c.SPEED_100KHZ,
mode: i2c.MODE_I2C
end)
oled_init(i2c1)
// Display text
oled_print(i2c1, "BERK v1.0.0")
oled_print(i2c1, "Embedded!")
end
📚 Platform Support
- STM32: F0, F1, F2, F3, F4, F7, H7, L0, L1, L4, L5
- ESP32: ESP32, ESP32-S2, ESP32-S3, ESP32-C3
- Nordic: nRF51, nRF52, nRF53
- RISC-V: GD32VF103, CH32V103
- ARM Cortex-M: M0, M0+, M3, M4, M7, M33