From ed73383e7c485e3fa4770b95fcc14812fdaaa58c Mon Sep 17 00:00:00 2001 From: Paul Sbarra Date: Tue, 31 Dec 2024 17:20:43 -0600 Subject: [PATCH] add support for SparkFun Pro Micro 3.3V (8MHz) --- .github/workflows/ci.yml | 5 +- Cargo.toml | 3 +- arduino-hal/Cargo.toml | 3 +- arduino-hal/src/clock.rs | 8 ++- arduino-hal/src/lib.rs | 14 ++++-- arduino-hal/src/port/mod.rs | 4 +- .../.cargo/config.toml | 0 examples/sparkfun-promicro-3v3/Cargo.toml | 26 ++++++++++ .../src/bin/promicro-adc.rs | 0 .../src/bin/promicro-blink.rs | 0 .../src/bin/promicro-i2cdetect.rs | 0 .../src/bin/promicro-spi-feedback.rs | 0 .../src/bin/promicro-usart.rs | 0 .../sparkfun-promicro-5v/.cargo/config.toml | 8 +++ .../Cargo.toml | 2 +- .../src/bin/promicro-adc.rs | 46 +++++++++++++++++ .../src/bin/promicro-blink.rs | 22 ++++++++ .../src/bin/promicro-i2cdetect.rs | 28 +++++++++++ .../src/bin/promicro-spi-feedback.rs | 50 +++++++++++++++++++ .../src/bin/promicro-usart.rs | 24 +++++++++ 20 files changed, 232 insertions(+), 11 deletions(-) rename examples/{sparkfun-promicro => sparkfun-promicro-3v3}/.cargo/config.toml (100%) create mode 100644 examples/sparkfun-promicro-3v3/Cargo.toml rename examples/{sparkfun-promicro => sparkfun-promicro-3v3}/src/bin/promicro-adc.rs (100%) rename examples/{sparkfun-promicro => sparkfun-promicro-3v3}/src/bin/promicro-blink.rs (100%) rename examples/{sparkfun-promicro => sparkfun-promicro-3v3}/src/bin/promicro-i2cdetect.rs (100%) rename examples/{sparkfun-promicro => sparkfun-promicro-3v3}/src/bin/promicro-spi-feedback.rs (100%) rename examples/{sparkfun-promicro => sparkfun-promicro-3v3}/src/bin/promicro-usart.rs (100%) create mode 100644 examples/sparkfun-promicro-5v/.cargo/config.toml rename examples/{sparkfun-promicro => sparkfun-promicro-5v}/Cargo.toml (94%) create mode 100644 examples/sparkfun-promicro-5v/src/bin/promicro-adc.rs create mode 100644 examples/sparkfun-promicro-5v/src/bin/promicro-blink.rs create mode 100644 examples/sparkfun-promicro-5v/src/bin/promicro-i2cdetect.rs create mode 100644 examples/sparkfun-promicro-5v/src/bin/promicro-spi-feedback.rs create mode 100644 examples/sparkfun-promicro-5v/src/bin/promicro-usart.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 507335a20c..0ce7ac3392 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,7 +31,10 @@ jobs: name: arduino-mega1280 examples: true - type: board - name: sparkfun-promicro + name: sparkfun-promicro-3v3 + examples: true + - type: board + name: sparkfun-promicro-5v examples: true - type: board name: sparkfun-promini-3v3 diff --git a/Cargo.toml b/Cargo.toml index ca159ee2b2..cb7d05ff45 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,8 @@ members = [ "examples/arduino-uno", "examples/atmega2560", "examples/nano168", - "examples/sparkfun-promicro", + "examples/sparkfun-promicro-3v3", + "examples/sparkfun-promicro-5v", "examples/sparkfun-promini-3v3", "examples/sparkfun-promini-5v", "examples/trinket-pro", diff --git a/arduino-hal/Cargo.toml b/arduino-hal/Cargo.toml index 1f400c73f3..a90fa01d34 100644 --- a/arduino-hal/Cargo.toml +++ b/arduino-hal/Cargo.toml @@ -26,7 +26,8 @@ arduino-mega1280 = ["mcu-atmega", "atmega-hal/atmega1280", "board-selected"] arduino-nano = ["mcu-atmega", "atmega-hal/atmega328p", "atmega-hal/enable-extra-adc", "board-selected"] arduino-uno = ["mcu-atmega", "atmega-hal/atmega328p", "board-selected"] trinket-pro = ["mcu-atmega", "atmega-hal/atmega328p", "board-selected"] -sparkfun-promicro = ["mcu-atmega", "atmega-hal/atmega32u4", "board-selected"] +sparkfun-promicro-3v3 = ["mcu-atmega", "atmega-hal/atmega32u4", "board-selected"] +sparkfun-promicro-5v = ["mcu-atmega", "atmega-hal/atmega32u4", "board-selected"] sparkfun-promini-3v3 = ["mcu-atmega", "atmega-hal/atmega328p", "atmega-hal/enable-extra-adc", "board-selected"] sparkfun-promini-5v = ["mcu-atmega", "atmega-hal/atmega328p", "atmega-hal/enable-extra-adc", "board-selected"] trinket = ["mcu-attiny", "attiny-hal/attiny85", "board-selected"] diff --git a/arduino-hal/src/clock.rs b/arduino-hal/src/clock.rs index 7c53088015..92ed84f366 100644 --- a/arduino-hal/src/clock.rs +++ b/arduino-hal/src/clock.rs @@ -21,12 +21,16 @@ pub(crate) mod default { feature = "arduino-mega1280", feature = "arduino-nano", feature = "arduino-uno", - feature = "sparkfun-promicro", + feature = "sparkfun-promicro-5v", feature = "sparkfun-promini-5v", feature = "trinket-pro", feature = "nano168", ))] pub type DefaultClock = avr_hal_generic::clock::MHz16; - #[cfg(any(feature = "trinket", feature = "sparkfun-promini-3v3"))] + #[cfg(any( + feature = "trinket", + feature = "sparkfun-promicro-3v3", + feature = "sparkfun-promini-3v3", + ))] pub type DefaultClock = avr_hal_generic::clock::MHz8; } diff --git a/arduino-hal/src/lib.rs b/arduino-hal/src/lib.rs index 5e78dc3318..8ff524e2b5 100644 --- a/arduino-hal/src/lib.rs +++ b/arduino-hal/src/lib.rs @@ -12,7 +12,14 @@ #![cfg_attr(feature = "arduino-mega1280", doc = "**Arduino Mega 1280**.")] #![cfg_attr(feature = "arduino-nano", doc = "**Arduino Nano**.")] #![cfg_attr(feature = "arduino-uno", doc = "**Arduino Uno**.")] -#![cfg_attr(feature = "sparkfun-promicro", doc = "**SparkFun ProMicro**.")] +#![cfg_attr( + feature = "sparkfun-promicro-3v3", + doc = "**SparkFun ProMicro 3.3V (8MHz)**." +)] +#![cfg_attr( + feature = "sparkfun-promicro-5v", + doc = "**SparkFun ProMicro 5V (16MHz)**." +)] #![cfg_attr( feature = "sparkfun-promini-3v3", doc = "**SparkFun ProMini 3.3V (8MHz)**." @@ -66,7 +73,8 @@ compile_error!( * arduino-mega1280 * arduino-nano * arduino-uno - * sparkfun-promicro + * sparkfun-promicro-3v3 + * sparkfun-promicro-5v * sparkfun-promini-3v3 * sparkfun-promini-5v * trinket-pro @@ -259,7 +267,7 @@ macro_rules! default_serial { /// let pins = arduino_hal::pins!(dp); /// let serial = arduino_hal::default_serial!(dp, pins, 57600); /// ``` -#[cfg(any(feature = "sparkfun-promicro"))] +#[cfg(any(feature = "sparkfun-promicro-3v3", features = "sparkfun-promicro-5v"))] #[macro_export] macro_rules! default_serial { ($p:expr, $pins:expr, $baud:expr) => { diff --git a/arduino-hal/src/port/mod.rs b/arduino-hal/src/port/mod.rs index 160d3f9811..3e22bbfc7a 100644 --- a/arduino-hal/src/port/mod.rs +++ b/arduino-hal/src/port/mod.rs @@ -43,9 +43,9 @@ mod uno; feature = "sparkfun-promini-5v" ))] pub use uno::*; -#[cfg(feature = "sparkfun-promicro")] +#[cfg(any(feature = "sparkfun-promicro-3v3", feature = "sparkfun-promicro-5v"))] mod promicro; -#[cfg(feature = "sparkfun-promicro")] +#[cfg(any(feature = "sparkfun-promicro-3v3", feature = "sparkfun-promicro-5v"))] pub use promicro::*; #[cfg(feature = "trinket-pro")] mod trinket_pro; diff --git a/examples/sparkfun-promicro/.cargo/config.toml b/examples/sparkfun-promicro-3v3/.cargo/config.toml similarity index 100% rename from examples/sparkfun-promicro/.cargo/config.toml rename to examples/sparkfun-promicro-3v3/.cargo/config.toml diff --git a/examples/sparkfun-promicro-3v3/Cargo.toml b/examples/sparkfun-promicro-3v3/Cargo.toml new file mode 100644 index 0000000000..66652da847 --- /dev/null +++ b/examples/sparkfun-promicro-3v3/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "sparkfun-promicro-examples" +version = "0.0.0" +authors = ["Rahix "] +edition = "2021" +publish = false + +[dependencies] +panic-halt = "0.2.0" +ufmt = "0.2.0" +nb = "1.1.0" +embedded-hal = "1.0" + +[dependencies.embedded-hal-v0] +version = "0.2.3" +package = "embedded-hal" + +[dependencies.arduino-hal] +path = "../../arduino-hal/" +features = ["sparkfun-promicro-3v3"] + +# The latest releases of `proc-macro2` do not support the rust toolchain that +# we use. Thus, we must fix this dependency to an older version where our +# toolchain is still supported. See https://github.com/Rahix/avr-hal/issues/537 +[build-dependencies.proc-macro2] +version = "=1.0.79" diff --git a/examples/sparkfun-promicro/src/bin/promicro-adc.rs b/examples/sparkfun-promicro-3v3/src/bin/promicro-adc.rs similarity index 100% rename from examples/sparkfun-promicro/src/bin/promicro-adc.rs rename to examples/sparkfun-promicro-3v3/src/bin/promicro-adc.rs diff --git a/examples/sparkfun-promicro/src/bin/promicro-blink.rs b/examples/sparkfun-promicro-3v3/src/bin/promicro-blink.rs similarity index 100% rename from examples/sparkfun-promicro/src/bin/promicro-blink.rs rename to examples/sparkfun-promicro-3v3/src/bin/promicro-blink.rs diff --git a/examples/sparkfun-promicro/src/bin/promicro-i2cdetect.rs b/examples/sparkfun-promicro-3v3/src/bin/promicro-i2cdetect.rs similarity index 100% rename from examples/sparkfun-promicro/src/bin/promicro-i2cdetect.rs rename to examples/sparkfun-promicro-3v3/src/bin/promicro-i2cdetect.rs diff --git a/examples/sparkfun-promicro/src/bin/promicro-spi-feedback.rs b/examples/sparkfun-promicro-3v3/src/bin/promicro-spi-feedback.rs similarity index 100% rename from examples/sparkfun-promicro/src/bin/promicro-spi-feedback.rs rename to examples/sparkfun-promicro-3v3/src/bin/promicro-spi-feedback.rs diff --git a/examples/sparkfun-promicro/src/bin/promicro-usart.rs b/examples/sparkfun-promicro-3v3/src/bin/promicro-usart.rs similarity index 100% rename from examples/sparkfun-promicro/src/bin/promicro-usart.rs rename to examples/sparkfun-promicro-3v3/src/bin/promicro-usart.rs diff --git a/examples/sparkfun-promicro-5v/.cargo/config.toml b/examples/sparkfun-promicro-5v/.cargo/config.toml new file mode 100644 index 0000000000..4c5d2b5453 --- /dev/null +++ b/examples/sparkfun-promicro-5v/.cargo/config.toml @@ -0,0 +1,8 @@ +[build] +target = "../../avr-specs/avr-atmega32u4.json" + +[target.'cfg(target_arch = "avr")'] +runner = "ravedude promicro" + +[unstable] +build-std = ["core"] diff --git a/examples/sparkfun-promicro/Cargo.toml b/examples/sparkfun-promicro-5v/Cargo.toml similarity index 94% rename from examples/sparkfun-promicro/Cargo.toml rename to examples/sparkfun-promicro-5v/Cargo.toml index 63e9a0814f..d7243f253b 100644 --- a/examples/sparkfun-promicro/Cargo.toml +++ b/examples/sparkfun-promicro-5v/Cargo.toml @@ -17,7 +17,7 @@ package = "embedded-hal" [dependencies.arduino-hal] path = "../../arduino-hal/" -features = ["sparkfun-promicro"] +features = ["sparkfun-promicro-5v"] # The latest releases of `proc-macro2` do not support the rust toolchain that # we use. Thus, we must fix this dependency to an older version where our diff --git a/examples/sparkfun-promicro-5v/src/bin/promicro-adc.rs b/examples/sparkfun-promicro-5v/src/bin/promicro-adc.rs new file mode 100644 index 0000000000..f7340aaf0a --- /dev/null +++ b/examples/sparkfun-promicro-5v/src/bin/promicro-adc.rs @@ -0,0 +1,46 @@ +#![no_std] +#![no_main] + +use arduino_hal::prelude::*; +use panic_halt as _; + +use arduino_hal::adc; + +#[arduino_hal::entry] +fn main() -> ! { + let dp = arduino_hal::Peripherals::take().unwrap(); + let pins = arduino_hal::pins!(dp); + let mut serial = arduino_hal::default_serial!(dp, pins, 57600); + + let mut adc = arduino_hal::Adc::new(dp.ADC, Default::default()); + + let (vbg, gnd, tmp) = ( + adc.read_blocking(&adc::channel::Vbg), + adc.read_blocking(&adc::channel::Gnd), + adc.read_blocking(&adc::channel::Temperature), + ); + ufmt::uwriteln!(&mut serial, "Vbandgap: {}", vbg).unwrap_infallible(); + ufmt::uwriteln!(&mut serial, "Ground: {}", gnd).unwrap_infallible(); + ufmt::uwriteln!(&mut serial, "Temperature: {}", tmp).unwrap_infallible(); + + let a0 = pins.a0.into_analog_input(&mut adc); + let a1 = pins.a1.into_analog_input(&mut adc); + let a2 = pins.a2.into_analog_input(&mut adc); + let a3 = pins.a3.into_analog_input(&mut adc); + + loop { + let values = [ + a0.analog_read(&mut adc), + a1.analog_read(&mut adc), + a2.analog_read(&mut adc), + a3.analog_read(&mut adc), + ]; + + for (i, v) in values.iter().enumerate() { + ufmt::uwrite!(&mut serial, "A{}: {} ", i, v).unwrap_infallible(); + } + + ufmt::uwriteln!(&mut serial, "").unwrap_infallible(); + arduino_hal::delay_ms(1000); + } +} diff --git a/examples/sparkfun-promicro-5v/src/bin/promicro-blink.rs b/examples/sparkfun-promicro-5v/src/bin/promicro-blink.rs new file mode 100644 index 0000000000..4ab740c232 --- /dev/null +++ b/examples/sparkfun-promicro-5v/src/bin/promicro-blink.rs @@ -0,0 +1,22 @@ +#![no_std] +#![no_main] + +use panic_halt as _; + +#[arduino_hal::entry] +fn main() -> ! { + let dp = arduino_hal::Peripherals::take().unwrap(); + let pins = arduino_hal::pins!(dp); + + let mut led1 = pins.led_rx.into_output(); + let mut led2 = pins.led_tx.into_output(); + + loop { + led1.set_high(); + led2.set_low(); + arduino_hal::delay_ms(300); + led1.set_low(); + led2.set_high(); + arduino_hal::delay_ms(300); + } +} diff --git a/examples/sparkfun-promicro-5v/src/bin/promicro-i2cdetect.rs b/examples/sparkfun-promicro-5v/src/bin/promicro-i2cdetect.rs new file mode 100644 index 0000000000..e6af7f4f4b --- /dev/null +++ b/examples/sparkfun-promicro-5v/src/bin/promicro-i2cdetect.rs @@ -0,0 +1,28 @@ +#![no_std] +#![no_main] + +use arduino_hal::prelude::*; +use panic_halt as _; + +#[arduino_hal::entry] +fn main() -> ! { + let dp = arduino_hal::Peripherals::take().unwrap(); + let pins = arduino_hal::pins!(dp); + let mut serial = arduino_hal::default_serial!(dp, pins, 57600); + + let mut i2c = arduino_hal::I2c::new( + dp.TWI, + pins.d2.into_pull_up_input(), + pins.d3.into_pull_up_input(), + 50000, + ); + + ufmt::uwriteln!(&mut serial, "Write direction test:\r").unwrap_infallible(); + i2c.i2cdetect(&mut serial, arduino_hal::i2c::Direction::Write) + .unwrap_infallible(); + ufmt::uwriteln!(&mut serial, "\r\nRead direction test:\r").unwrap_infallible(); + i2c.i2cdetect(&mut serial, arduino_hal::i2c::Direction::Read) + .unwrap_infallible(); + + loop {} +} diff --git a/examples/sparkfun-promicro-5v/src/bin/promicro-spi-feedback.rs b/examples/sparkfun-promicro-5v/src/bin/promicro-spi-feedback.rs new file mode 100644 index 0000000000..00cb37406e --- /dev/null +++ b/examples/sparkfun-promicro-5v/src/bin/promicro-spi-feedback.rs @@ -0,0 +1,50 @@ +//! This example demonstrates how to set up a SPI interface and communicate +//! over it. The physical hardware configuation consists of connecting a +//! jumper directly from pin `~14` to pin `~16`. +//! +//! Once this program is written to the board, the serial output can be +//! accessed with +//! +//! ``` +//! sudo screen /dev/ttyACM0 57600 +//! ``` +//! +//! You should see it output the line `data: 15` repeatedly (aka 0b00001111). +//! If the output you see is `data: 255`, you may need to check your jumper. + +#![no_std] +#![no_main] + +use arduino_hal::prelude::*; +use arduino_hal::spi; +use embedded_hal_v0::spi::FullDuplex; +use panic_halt as _; + +#[arduino_hal::entry] +fn main() -> ! { + let dp = arduino_hal::Peripherals::take().unwrap(); + let pins = arduino_hal::pins!(dp); + + // set up serial interface for text output + let mut serial = arduino_hal::default_serial!(dp, pins, 57600); + + // Create SPI interface. + let (mut spi, _) = arduino_hal::Spi::new( + dp.SPI, + pins.d15.into_output(), + pins.d14.into_output(), + pins.d16.into_pull_up_input(), + pins.led_rx.into_output(), + spi::Settings::default(), + ); + + loop { + // Send a byte + nb::block!(spi.send(0b00001111)).unwrap_infallible(); + // Because MISO is connected to MOSI, the read data should be the same + let data = nb::block!(spi.read()).unwrap_infallible(); + + ufmt::uwriteln!(&mut serial, "data: {}\r", data).unwrap_infallible(); + arduino_hal::delay_ms(1000); + } +} diff --git a/examples/sparkfun-promicro-5v/src/bin/promicro-usart.rs b/examples/sparkfun-promicro-5v/src/bin/promicro-usart.rs new file mode 100644 index 0000000000..a8c2339555 --- /dev/null +++ b/examples/sparkfun-promicro-5v/src/bin/promicro-usart.rs @@ -0,0 +1,24 @@ +#![no_std] +#![no_main] + +use arduino_hal::prelude::*; +use panic_halt as _; + +use embedded_hal_v0::serial::Read; + +#[arduino_hal::entry] +fn main() -> ! { + let dp = arduino_hal::Peripherals::take().unwrap(); + let pins = arduino_hal::pins!(dp); + let mut serial = arduino_hal::default_serial!(dp, pins, 57600); + + ufmt::uwriteln!(&mut serial, "Hello from Arduino!\r").unwrap_infallible(); + + loop { + // Read a byte from the serial connection + let b = nb::block!(serial.read()).unwrap_infallible(); + + // Answer + ufmt::uwriteln!(&mut serial, "Got {}!\r", b).unwrap_infallible(); + } +}