# common_hal_interface
A common interface between Rust HALs, for use in the Iron Coder IDE.
**One interface, any board.** The same macro names work across all supported platforms - just change the feature flag.
## Quick Start
```toml
[dependencies]
# Pick ONE feature for your board:
common_hal_interface = { version = "1.0.16-alpha", features = ["adafruit-feather-rp2040"] }
# OR: features = ["rp-pico"]
# OR: features = ["rp2040"] (raw hal, no BSP)
# OR: features = ["arduino-uno"]
# OR: features = ["esp"]
```
```rust
use common_hal_interface::*;
// Same code works on any supported board!
rp2040_setup!(pac, core, clocks, pins);
let i2c = setup_i2c!(pac, clocks, 400_000u32, I2C1, pins.sda, pins.scl);
```
## Features
### RP2040 Boards
| `adafruit-feather-rp2040` | Adafruit Feather RP2040 | `adafruit-feather-rp2040` |
| `rp-pico` | Raspberry Pi Pico | `rp-pico` |
| `rp2040` | Raw HAL (no BSP) | `rp2040-hal` |
### Arduino Boards
| `arduino-uno` | Arduino Uno |
| `arduino-nano` | Arduino Nano |
| `arduino-mega2560` | Arduino Mega 2560 |
| `arduino-leonardo` | Arduino Leonardo |
### Other
| `esp` | ESP32 family |
| `stm32f4` | STM32F4 (WIP) |
## Universal Macros
### RP2040 (all boards)
| `rp2040_setup!(pac, core, clocks, pins)` | Initialize peripherals |
| `new_delay!(core, clocks)` | Create cortex-m delay |
| `new_timer!(pac, clocks)` | Create hardware timer |
| `setup_i2c!(pac, clocks, baud, I2Cx, sda, scl)` | Set up I2C |
| `setup_spi!(pac, clocks, baud, SPIx, mosi, miso, sck, mode)` | Set up SPI |
| `setup_uart!(pac, clocks, baud, UARTx, tx, rx)` | Set up UART |
| `setup_neopixel!(pac, pin, clocks, timer)` | Set up WS2812 NeoPixel |
| `setup_onboard_neopixel!(pac, pins, clocks, timer)` | Set up onboard NeoPixel |
### Arduino
| `arduino_setup!(dp, pins)` | Initialize peripherals |
| `setup_serial!(dp, pins, baud)` | Set up serial |
| `setup_i2c!(dp, sda, scl, freq)` | Set up I2C |
| `setup_spi!(dp, sck, mosi, miso, ss)` | Set up SPI |
### ESP
| `esp_setup!()` | Initialize peripherals |
| `delay_ms!(ms)` | Delay milliseconds |
| `setup_i2c!(peripheral, sda, scl, freq_khz)` | Set up I2C |
| `setup_spi!(peripheral, sck, mosi, miso, freq_khz)` | Set up SPI |
## Example: Adafruit Feather RP2040
```rust
#![no_std]
#![no_main]
use adafruit_feather_rp2040::entry;
use panic_halt as _;
use ws2812_pio::Ws2812;
use common_hal_interface::*;
#[entry]
fn main() -> ! {
// Initialize - same on any RP2040 board
rp2040_setup!(pac, core, clocks, pins);
let mut delay = new_delay!(core, clocks);
let timer = new_timer!(pac, clocks);
// I2C on labeled pins
let i2c = setup_i2c!(pac, clocks, 400_000u32, I2C1, pins.sda, pins.scl);
// NeoPixel on D4
let ws = setup_neopixel!(pac, pins.d4, clocks, timer);
loop {
delay.delay_ms(100);
}
}
```
## Switching Boards
To switch from Feather to Pico, just change:
1. `Cargo.toml`: `features = ["rp-pico"]`
2. `use` statement: `use rp_pico::entry;`
3. Pin names (BSP-specific): `pins.gpio2` instead of `pins.sda`
The macro calls stay the same!
## License
MIT