Async shared bus for SPI & I2C + rename embassy-traits (#769)
* Rename embassy-traits to embassy-embedded-hal * Rename embassy-traits to embassy-embedded-hal * Add shared bus for SPI and I2C * rustfmt * EHA alpha 1 * Rename embedded-traits in examples * rustfmt * rustfmt Co-authored-by: Henrik Alsér <henrik@mindbite.se>
This commit is contained in:
parent
36a1f20364
commit
e10fc2bada
26 changed files with 262 additions and 26 deletions
8
.vscode/settings.json
vendored
8
.vscode/settings.json
vendored
|
@ -1,15 +1,11 @@
|
||||||
{
|
{
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"rust-analyzer.assist.importEnforceGranularity": true,
|
|
||||||
"rust-analyzer.assist.importGranularity": "module",
|
|
||||||
"rust-analyzer.checkOnSave.allFeatures": false,
|
"rust-analyzer.checkOnSave.allFeatures": false,
|
||||||
"rust-analyzer.checkOnSave.allTargets": false,
|
"rust-analyzer.checkOnSave.allTargets": false,
|
||||||
"rust-analyzer.checkOnSave.noDefaultFeatures": true,
|
"rust-analyzer.checkOnSave.noDefaultFeatures": true,
|
||||||
"rust-analyzer.cargo.allFeatures": false,
|
"rust-analyzer.cargo.allFeatures": false,
|
||||||
"rust-analyzer.cargo.noDefaultFeatures": true,
|
"rust-analyzer.cargo.noDefaultFeatures": true,
|
||||||
"rust-analyzer.experimental.procAttrMacros": false,
|
|
||||||
"rust-analyzer.procMacro.enable": true,
|
"rust-analyzer.procMacro.enable": true,
|
||||||
"rust-analyzer.cargo.runBuildScripts": true,
|
|
||||||
"rust-analyzer.cargo.target": "thumbv7em-none-eabi",
|
"rust-analyzer.cargo.target": "thumbv7em-none-eabi",
|
||||||
"rust-analyzer.cargo.features": [
|
"rust-analyzer.cargo.features": [
|
||||||
// These are needed to prevent embassy-net from failing to build
|
// These are needed to prevent embassy-net from failing to build
|
||||||
|
@ -38,4 +34,8 @@
|
||||||
// "examples/stm32wl55/Cargo.toml",
|
// "examples/stm32wl55/Cargo.toml",
|
||||||
// "examples/wasm/Cargo.toml",
|
// "examples/wasm/Cargo.toml",
|
||||||
],
|
],
|
||||||
|
"rust-analyzer.imports.granularity.enforce": true,
|
||||||
|
"rust-analyzer.imports.granularity.group": "module",
|
||||||
|
"rust-analyzer.cargo.buildScripts.enable": true,
|
||||||
|
"rust-analyzer.procMacro.attributes.enable": false,
|
||||||
}
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
[package]
|
[package]
|
||||||
name = "embassy-traits"
|
name = "embassy-embedded-hal"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Dario Nieuwenhuis <dirbaio@dirbaio.net>"]
|
authors = ["Dario Nieuwenhuis <dirbaio@dirbaio.net>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
@ -8,9 +8,10 @@ edition = "2018"
|
||||||
std = []
|
std = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
embassy = { version = "0.1.0", path = "../embassy" }
|
||||||
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.8" }
|
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.8" }
|
||||||
embedded-hal-async = { version = "0.1.0-alpha.0" }
|
embedded-hal-async = { version = "0.1.0-alpha.1" }
|
||||||
embedded-storage = "0.3.0"
|
embedded-storage = "0.3.0"
|
||||||
embedded-storage-async = "0.3.0"
|
embedded-storage-async = "0.3.0"
|
||||||
nb = "1.0.0"
|
nb = "1.0.0"
|
|
@ -3,3 +3,4 @@
|
||||||
#![feature(type_alias_impl_trait)]
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
pub mod adapter;
|
pub mod adapter;
|
||||||
|
pub mod shared_bus;
|
120
embassy-embedded-hal/src/shared_bus/i2c.rs
Normal file
120
embassy-embedded-hal/src/shared_bus/i2c.rs
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
//! Asynchronous shared I2C bus
|
||||||
|
//!
|
||||||
|
//! # Example (nrf52)
|
||||||
|
//!
|
||||||
|
//! ```rust
|
||||||
|
//! use embassy_embedded_hal::shared_bus::i2c::I2cBusDevice;
|
||||||
|
//! use embassy::mutex::Mutex;
|
||||||
|
//! use embassy::blocking_mutex::raw::ThreadModeRawMutex;
|
||||||
|
//!
|
||||||
|
//! static I2C_BUS: Forever<Mutex::<ThreadModeRawMutex, Twim<TWISPI0>>> = Forever::new();
|
||||||
|
//! let config = twim::Config::default();
|
||||||
|
//! let irq = interrupt::take!(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0);
|
||||||
|
//! let i2c = Twim::new(p.TWISPI0, irq, p.P0_03, p.P0_04, config);
|
||||||
|
//! let i2c_bus = Mutex::<ThreadModeRawMutex, _>::new(i2c);
|
||||||
|
//! let i2c_bus = I2C_BUS.put(i2c_bus);
|
||||||
|
//!
|
||||||
|
//! // Device 1, using embedded-hal-async compatible driver for QMC5883L compass
|
||||||
|
//! let i2c_dev1 = I2cBusDevice::new(i2c_bus);
|
||||||
|
//! let compass = QMC5883L::new(i2c_dev1).await.unwrap();
|
||||||
|
//!
|
||||||
|
//! // Device 2, using embedded-hal-async compatible driver for Mpu6050 accelerometer
|
||||||
|
//! let i2c_dev2 = I2cBusDevice::new(i2c_bus);
|
||||||
|
//! let mpu = Mpu6050::new(i2c_dev2);
|
||||||
|
//! ```
|
||||||
|
use core::{fmt::Debug, future::Future};
|
||||||
|
use embassy::blocking_mutex::raw::RawMutex;
|
||||||
|
use embassy::mutex::Mutex;
|
||||||
|
use embedded_hal_async::i2c;
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
|
||||||
|
pub enum I2cBusDeviceError<BUS> {
|
||||||
|
I2c(BUS),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<BUS> i2c::Error for I2cBusDeviceError<BUS>
|
||||||
|
where
|
||||||
|
BUS: i2c::Error + Debug,
|
||||||
|
{
|
||||||
|
fn kind(&self) -> i2c::ErrorKind {
|
||||||
|
match self {
|
||||||
|
Self::I2c(e) => e.kind(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct I2cBusDevice<'a, M: RawMutex, BUS> {
|
||||||
|
bus: &'a Mutex<M, BUS>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, M: RawMutex, BUS> I2cBusDevice<'a, M, BUS> {
|
||||||
|
pub fn new(bus: &'a Mutex<M, BUS>) -> Self {
|
||||||
|
Self { bus }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, M: RawMutex, BUS> i2c::ErrorType for I2cBusDevice<'a, M, BUS>
|
||||||
|
where
|
||||||
|
BUS: i2c::ErrorType,
|
||||||
|
{
|
||||||
|
type Error = I2cBusDeviceError<BUS::Error>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<M, BUS> i2c::I2c for I2cBusDevice<'_, M, BUS>
|
||||||
|
where
|
||||||
|
M: RawMutex + 'static,
|
||||||
|
BUS: i2c::I2c + 'static,
|
||||||
|
{
|
||||||
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
|
fn read<'a>(&'a mut self, address: u8, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
|
async move {
|
||||||
|
let mut bus = self.bus.lock().await;
|
||||||
|
bus.read(address, buffer)
|
||||||
|
.await
|
||||||
|
.map_err(I2cBusDeviceError::I2c)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
|
fn write<'a>(&'a mut self, address: u8, bytes: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||||
|
async move {
|
||||||
|
let mut bus = self.bus.lock().await;
|
||||||
|
bus.write(address, bytes)
|
||||||
|
.await
|
||||||
|
.map_err(I2cBusDeviceError::I2c)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type WriteReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
|
fn write_read<'a>(
|
||||||
|
&'a mut self,
|
||||||
|
address: u8,
|
||||||
|
wr_buffer: &'a [u8],
|
||||||
|
rd_buffer: &'a mut [u8],
|
||||||
|
) -> Self::WriteReadFuture<'a> {
|
||||||
|
async move {
|
||||||
|
let mut bus = self.bus.lock().await;
|
||||||
|
bus.write_read(address, wr_buffer, rd_buffer)
|
||||||
|
.await
|
||||||
|
.map_err(I2cBusDeviceError::I2c)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type TransactionFuture<'a, 'b> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a, 'b: 'a;
|
||||||
|
|
||||||
|
fn transaction<'a, 'b>(
|
||||||
|
&'a mut self,
|
||||||
|
address: u8,
|
||||||
|
operations: &'a mut [embedded_hal_async::i2c::Operation<'b>],
|
||||||
|
) -> Self::TransactionFuture<'a, 'b> {
|
||||||
|
let _ = address;
|
||||||
|
let _ = operations;
|
||||||
|
async move { todo!() }
|
||||||
|
}
|
||||||
|
}
|
4
embassy-embedded-hal/src/shared_bus/mod.rs
Normal file
4
embassy-embedded-hal/src/shared_bus/mod.rs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
//! Shared bus implementations for embedded-hal-async
|
||||||
|
|
||||||
|
pub mod i2c;
|
||||||
|
pub mod spi;
|
110
embassy-embedded-hal/src/shared_bus/spi.rs
Normal file
110
embassy-embedded-hal/src/shared_bus/spi.rs
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
//! Asynchronous shared SPI bus
|
||||||
|
//!
|
||||||
|
//! # Example (nrf52)
|
||||||
|
//!
|
||||||
|
//! ```rust
|
||||||
|
//! use embassy_embedded_hal::shared_bus::spi::SpiBusDevice;
|
||||||
|
//! use embassy::mutex::Mutex;
|
||||||
|
//! use embassy::blocking_mutex::raw::ThreadModeRawMutex;
|
||||||
|
//!
|
||||||
|
//! static SPI_BUS: Forever<Mutex<ThreadModeRawMutex, spim::Spim<SPI3>>> = Forever::new();
|
||||||
|
//! let mut config = spim::Config::default();
|
||||||
|
//! config.frequency = spim::Frequency::M32;
|
||||||
|
//! let irq = interrupt::take!(SPIM3);
|
||||||
|
//! let spi = spim::Spim::new_txonly(p.SPI3, irq, p.P0_15, p.P0_18, config);
|
||||||
|
//! let spi_bus = Mutex::<ThreadModeRawMutex, _>::new(spi);
|
||||||
|
//! let spi_bus = SPI_BUS.put(spi_bus);
|
||||||
|
//!
|
||||||
|
//! // Device 1, using embedded-hal-async compatible driver for ST7735 LCD display
|
||||||
|
//! let cs_pin1 = Output::new(p.P0_24, Level::Low, OutputDrive::Standard);
|
||||||
|
//! let spi_dev1 = SpiBusDevice::new(spi_bus, cs_pin1);
|
||||||
|
//! let display1 = ST7735::new(spi_dev1, dc1, rst1, Default::default(), 160, 128);
|
||||||
|
//!
|
||||||
|
//! // Device 2
|
||||||
|
//! let cs_pin2 = Output::new(p.P0_24, Level::Low, OutputDrive::Standard);
|
||||||
|
//! let spi_dev2 = SpiBusDevice::new(spi_bus, cs_pin2);
|
||||||
|
//! let display2 = ST7735::new(spi_dev2, dc2, rst2, Default::default(), 160, 128);
|
||||||
|
//! ```
|
||||||
|
use core::{fmt::Debug, future::Future};
|
||||||
|
use embassy::blocking_mutex::raw::RawMutex;
|
||||||
|
use embassy::mutex::Mutex;
|
||||||
|
|
||||||
|
use embedded_hal_1::digital::blocking::OutputPin;
|
||||||
|
use embedded_hal_1::spi::ErrorType;
|
||||||
|
use embedded_hal_async::spi;
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
|
||||||
|
pub enum SpiBusDeviceError<BUS, CS> {
|
||||||
|
Spi(BUS),
|
||||||
|
Cs(CS),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<BUS, CS> spi::Error for SpiBusDeviceError<BUS, CS>
|
||||||
|
where
|
||||||
|
BUS: spi::Error + Debug,
|
||||||
|
CS: Debug,
|
||||||
|
{
|
||||||
|
fn kind(&self) -> spi::ErrorKind {
|
||||||
|
match self {
|
||||||
|
Self::Spi(e) => e.kind(),
|
||||||
|
Self::Cs(_) => spi::ErrorKind::Other,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct SpiBusDevice<'a, M: RawMutex, BUS, CS> {
|
||||||
|
bus: &'a Mutex<M, BUS>,
|
||||||
|
cs: CS,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, M: RawMutex, BUS, CS> SpiBusDevice<'a, M, BUS, CS> {
|
||||||
|
pub fn new(bus: &'a Mutex<M, BUS>, cs: CS) -> Self {
|
||||||
|
Self { bus, cs }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, M: RawMutex, BUS, CS> spi::ErrorType for SpiBusDevice<'a, M, BUS, CS>
|
||||||
|
where
|
||||||
|
BUS: spi::ErrorType,
|
||||||
|
CS: OutputPin,
|
||||||
|
{
|
||||||
|
type Error = SpiBusDeviceError<BUS::Error, CS::Error>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<M, BUS, CS> spi::SpiDevice for SpiBusDevice<'_, M, BUS, CS>
|
||||||
|
where
|
||||||
|
M: RawMutex + 'static,
|
||||||
|
BUS: spi::SpiBusFlush + 'static,
|
||||||
|
CS: OutputPin,
|
||||||
|
{
|
||||||
|
type Bus = BUS;
|
||||||
|
|
||||||
|
type TransactionFuture<'a, R, F, Fut> = impl Future<Output = Result<R, Self::Error>> + 'a
|
||||||
|
where
|
||||||
|
Self: 'a, R: 'a, F: FnOnce(*mut Self::Bus) -> Fut + 'a,
|
||||||
|
Fut: Future<Output = Result<R, <Self::Bus as ErrorType>::Error>> + 'a;
|
||||||
|
|
||||||
|
fn transaction<'a, R, F, Fut>(&'a mut self, f: F) -> Self::TransactionFuture<'a, R, F, Fut>
|
||||||
|
where
|
||||||
|
R: 'a,
|
||||||
|
F: FnOnce(*mut Self::Bus) -> Fut + 'a,
|
||||||
|
Fut: Future<Output = Result<R, <Self::Bus as ErrorType>::Error>> + 'a,
|
||||||
|
{
|
||||||
|
async move {
|
||||||
|
let mut bus = self.bus.lock().await;
|
||||||
|
self.cs.set_low().map_err(SpiBusDeviceError::Cs)?;
|
||||||
|
|
||||||
|
let f_res = f(&mut *bus).await;
|
||||||
|
|
||||||
|
// On failure, it's important to still flush and deassert CS.
|
||||||
|
let flush_res = bus.flush().await;
|
||||||
|
let cs_res = self.cs.set_high();
|
||||||
|
|
||||||
|
let f_res = f_res.map_err(SpiBusDeviceError::Spi)?;
|
||||||
|
flush_res.map_err(SpiBusDeviceError::Spi)?;
|
||||||
|
cs_res.map_err(SpiBusDeviceError::Cs)?;
|
||||||
|
|
||||||
|
Ok(f_res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,7 +8,7 @@ version = "0.1.0"
|
||||||
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
||||||
embassy-nrf = { version = "0.1.0", path = "../../../embassy-nrf", features = ["time-driver-rtc1", "gpiote", "nightly", "nrf52840"] }
|
embassy-nrf = { version = "0.1.0", path = "../../../embassy-nrf", features = ["time-driver-rtc1", "gpiote", "nightly", "nrf52840"] }
|
||||||
embassy-boot-nrf = { version = "0.1.0", path = "../../../embassy-boot/nrf" }
|
embassy-boot-nrf = { version = "0.1.0", path = "../../../embassy-boot/nrf" }
|
||||||
embassy-traits = { version = "0.1.0", path = "../../../embassy-traits" }
|
embassy-embedded-hal = { version = "0.1.0", path = "../../../embassy-embedded-hal" }
|
||||||
|
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
defmt-rtt = { version = "0.3", optional = true }
|
defmt-rtt = { version = "0.3", optional = true }
|
||||||
|
|
|
@ -5,13 +5,13 @@
|
||||||
#![feature(type_alias_impl_trait)]
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
use embassy_boot_nrf::FirmwareUpdater;
|
use embassy_boot_nrf::FirmwareUpdater;
|
||||||
|
use embassy_embedded_hal::adapter::BlockingAsync;
|
||||||
use embassy_nrf::{
|
use embassy_nrf::{
|
||||||
gpio::{Input, Pull},
|
gpio::{Input, Pull},
|
||||||
gpio::{Level, Output, OutputDrive},
|
gpio::{Level, Output, OutputDrive},
|
||||||
nvmc::Nvmc,
|
nvmc::Nvmc,
|
||||||
Peripherals,
|
Peripherals,
|
||||||
};
|
};
|
||||||
use embassy_traits::adapter::BlockingAsync;
|
|
||||||
use panic_reset as _;
|
use panic_reset as _;
|
||||||
|
|
||||||
static APP_B: &[u8] = include_bytes!("../../b.bin");
|
static APP_B: &[u8] = include_bytes!("../../b.bin");
|
||||||
|
|
|
@ -8,7 +8,7 @@ version = "0.1.0"
|
||||||
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32f303re", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32f303re", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32" }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32" }
|
||||||
embassy-traits = { version = "0.1.0", path = "../../../embassy-traits" }
|
embassy-embedded-hal = { version = "0.1.0", path = "../../../embassy-embedded-hal" }
|
||||||
|
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
defmt-rtt = { version = "0.3", optional = true }
|
defmt-rtt = { version = "0.3", optional = true }
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
#![feature(type_alias_impl_trait)]
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
use embassy_boot_stm32::FirmwareUpdater;
|
use embassy_boot_stm32::FirmwareUpdater;
|
||||||
|
use embassy_embedded_hal::adapter::BlockingAsync;
|
||||||
use embassy_stm32::exti::ExtiInput;
|
use embassy_stm32::exti::ExtiInput;
|
||||||
use embassy_stm32::flash::Flash;
|
use embassy_stm32::flash::Flash;
|
||||||
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
||||||
use embassy_stm32::Peripherals;
|
use embassy_stm32::Peripherals;
|
||||||
use embassy_traits::adapter::BlockingAsync;
|
|
||||||
use panic_reset as _;
|
use panic_reset as _;
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
|
|
|
@ -8,7 +8,7 @@ version = "0.1.0"
|
||||||
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32f767zi", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32f767zi", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32" }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32" }
|
||||||
embassy-traits = { version = "0.1.0", path = "../../../embassy-traits" }
|
embassy-embedded-hal = { version = "0.1.0", path = "../../../embassy-embedded-hal" }
|
||||||
|
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
defmt-rtt = { version = "0.3", optional = true }
|
defmt-rtt = { version = "0.3", optional = true }
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
#![feature(type_alias_impl_trait)]
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
use embassy_boot_stm32::FirmwareUpdater;
|
use embassy_boot_stm32::FirmwareUpdater;
|
||||||
|
use embassy_embedded_hal::adapter::BlockingAsync;
|
||||||
use embassy_stm32::exti::ExtiInput;
|
use embassy_stm32::exti::ExtiInput;
|
||||||
use embassy_stm32::flash::Flash;
|
use embassy_stm32::flash::Flash;
|
||||||
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
||||||
use embassy_stm32::Peripherals;
|
use embassy_stm32::Peripherals;
|
||||||
use embassy_traits::adapter::BlockingAsync;
|
|
||||||
use panic_reset as _;
|
use panic_reset as _;
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
|
|
|
@ -8,7 +8,7 @@ version = "0.1.0"
|
||||||
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32h743zi", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32h743zi", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32" }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32" }
|
||||||
embassy-traits = { version = "0.1.0", path = "../../../embassy-traits" }
|
embassy-embedded-hal = { version = "0.1.0", path = "../../../embassy-embedded-hal" }
|
||||||
|
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
defmt-rtt = { version = "0.3", optional = true }
|
defmt-rtt = { version = "0.3", optional = true }
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
#![feature(type_alias_impl_trait)]
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
use embassy_boot_stm32::FirmwareUpdater;
|
use embassy_boot_stm32::FirmwareUpdater;
|
||||||
|
use embassy_embedded_hal::adapter::BlockingAsync;
|
||||||
use embassy_stm32::exti::ExtiInput;
|
use embassy_stm32::exti::ExtiInput;
|
||||||
use embassy_stm32::flash::Flash;
|
use embassy_stm32::flash::Flash;
|
||||||
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
||||||
use embassy_stm32::Peripherals;
|
use embassy_stm32::Peripherals;
|
||||||
use embassy_traits::adapter::BlockingAsync;
|
|
||||||
use panic_reset as _;
|
use panic_reset as _;
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
|
|
|
@ -8,7 +8,7 @@ version = "0.1.0"
|
||||||
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32l072cz", "time-driver-any", "exti", "memory-x"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32l072cz", "time-driver-any", "exti", "memory-x"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32", features = ["thumbv6"] }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32", features = ["thumbv6"] }
|
||||||
embassy-traits = { version = "0.1.0", path = "../../../embassy-traits" }
|
embassy-embedded-hal = { version = "0.1.0", path = "../../../embassy-embedded-hal" }
|
||||||
|
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
defmt-rtt = { version = "0.3", optional = true }
|
defmt-rtt = { version = "0.3", optional = true }
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
|
|
||||||
use embassy::time::{Duration, Timer};
|
use embassy::time::{Duration, Timer};
|
||||||
use embassy_boot_stm32::FirmwareUpdater;
|
use embassy_boot_stm32::FirmwareUpdater;
|
||||||
|
use embassy_embedded_hal::adapter::BlockingAsync;
|
||||||
use embassy_stm32::exti::ExtiInput;
|
use embassy_stm32::exti::ExtiInput;
|
||||||
use embassy_stm32::flash::Flash;
|
use embassy_stm32::flash::Flash;
|
||||||
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
||||||
use embassy_stm32::Peripherals;
|
use embassy_stm32::Peripherals;
|
||||||
use embassy_traits::adapter::BlockingAsync;
|
|
||||||
use panic_reset as _;
|
use panic_reset as _;
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
|
|
|
@ -8,7 +8,7 @@ version = "0.1.0"
|
||||||
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32l151cb-a", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32l151cb-a", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32" }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32" }
|
||||||
embassy-traits = { version = "0.1.0", path = "../../../embassy-traits" }
|
embassy-embedded-hal = { version = "0.1.0", path = "../../../embassy-embedded-hal" }
|
||||||
|
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
defmt-rtt = { version = "0.3", optional = true }
|
defmt-rtt = { version = "0.3", optional = true }
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
|
|
||||||
use embassy::time::{Duration, Timer};
|
use embassy::time::{Duration, Timer};
|
||||||
use embassy_boot_stm32::FirmwareUpdater;
|
use embassy_boot_stm32::FirmwareUpdater;
|
||||||
|
use embassy_embedded_hal::adapter::BlockingAsync;
|
||||||
use embassy_stm32::exti::ExtiInput;
|
use embassy_stm32::exti::ExtiInput;
|
||||||
use embassy_stm32::flash::Flash;
|
use embassy_stm32::flash::Flash;
|
||||||
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
||||||
use embassy_stm32::Peripherals;
|
use embassy_stm32::Peripherals;
|
||||||
use embassy_traits::adapter::BlockingAsync;
|
|
||||||
use panic_reset as _;
|
use panic_reset as _;
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
|
|
|
@ -8,7 +8,7 @@ version = "0.1.0"
|
||||||
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32l475vg", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32l475vg", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32" }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32" }
|
||||||
embassy-traits = { version = "0.1.0", path = "../../../embassy-traits" }
|
embassy-embedded-hal = { version = "0.1.0", path = "../../../embassy-embedded-hal" }
|
||||||
|
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
defmt-rtt = { version = "0.3", optional = true }
|
defmt-rtt = { version = "0.3", optional = true }
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
#![feature(type_alias_impl_trait)]
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
use embassy_boot_stm32::FirmwareUpdater;
|
use embassy_boot_stm32::FirmwareUpdater;
|
||||||
|
use embassy_embedded_hal::adapter::BlockingAsync;
|
||||||
use embassy_stm32::exti::ExtiInput;
|
use embassy_stm32::exti::ExtiInput;
|
||||||
use embassy_stm32::flash::Flash;
|
use embassy_stm32::flash::Flash;
|
||||||
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
||||||
use embassy_stm32::Peripherals;
|
use embassy_stm32::Peripherals;
|
||||||
use embassy_traits::adapter::BlockingAsync;
|
|
||||||
use panic_reset as _;
|
use panic_reset as _;
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
|
|
|
@ -8,7 +8,7 @@ version = "0.1.0"
|
||||||
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
embassy = { version = "0.1.0", path = "../../../embassy", features = ["nightly"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32wl55jc-cm4", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../embassy-stm32", features = ["unstable-traits", "nightly", "stm32wl55jc-cm4", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32" }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../embassy-boot/stm32" }
|
||||||
embassy-traits = { version = "0.1.0", path = "../../../embassy-traits" }
|
embassy-embedded-hal = { version = "0.1.0", path = "../../../embassy-embedded-hal" }
|
||||||
|
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
defmt-rtt = { version = "0.3", optional = true }
|
defmt-rtt = { version = "0.3", optional = true }
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
#![feature(type_alias_impl_trait)]
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
use embassy_boot_stm32::FirmwareUpdater;
|
use embassy_boot_stm32::FirmwareUpdater;
|
||||||
|
use embassy_embedded_hal::adapter::BlockingAsync;
|
||||||
use embassy_stm32::exti::ExtiInput;
|
use embassy_stm32::exti::ExtiInput;
|
||||||
use embassy_stm32::flash::Flash;
|
use embassy_stm32::flash::Flash;
|
||||||
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
||||||
use embassy_stm32::Peripherals;
|
use embassy_stm32::Peripherals;
|
||||||
use embassy_traits::adapter::BlockingAsync;
|
|
||||||
use panic_reset as _;
|
use panic_reset as _;
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
|
|
|
@ -9,7 +9,7 @@ resolver = "2"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt", "defmt-timestamp-uptime"] }
|
embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt", "defmt-timestamp-uptime"] }
|
||||||
embassy-traits = { version = "0.1.0", path = "../../embassy-traits" }
|
embassy-embedded-hal = { version = "0.1.0", path = "../../embassy-embedded-hal" }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["nightly", "defmt", "unstable-pac", "stm32l4s5vi", "time-driver-any", "exti", "unstable-traits"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["nightly", "defmt", "unstable-pac", "stm32l4s5vi", "time-driver-any", "exti", "unstable-traits"] }
|
||||||
|
|
||||||
defmt = "0.3"
|
defmt = "0.3"
|
||||||
|
|
|
@ -7,12 +7,12 @@ use panic_probe as _;
|
||||||
|
|
||||||
use defmt::*;
|
use defmt::*;
|
||||||
use embassy::executor::Spawner;
|
use embassy::executor::Spawner;
|
||||||
|
use embassy_embedded_hal::adapter::BlockingAsync;
|
||||||
use embassy_stm32::dma::NoDma;
|
use embassy_stm32::dma::NoDma;
|
||||||
use embassy_stm32::i2c::I2c;
|
use embassy_stm32::i2c::I2c;
|
||||||
use embassy_stm32::interrupt;
|
use embassy_stm32::interrupt;
|
||||||
use embassy_stm32::time::Hertz;
|
use embassy_stm32::time::Hertz;
|
||||||
use embassy_stm32::Peripherals;
|
use embassy_stm32::Peripherals;
|
||||||
use embassy_traits::adapter::BlockingAsync;
|
|
||||||
use embedded_hal_async::i2c::I2c as I2cTrait;
|
use embedded_hal_async::i2c::I2c as I2cTrait;
|
||||||
|
|
||||||
const ADDRESS: u8 = 0x5F;
|
const ADDRESS: u8 = 0x5F;
|
||||||
|
|
|
@ -7,12 +7,12 @@ use panic_probe as _;
|
||||||
|
|
||||||
use defmt::*;
|
use defmt::*;
|
||||||
use embassy::executor::Spawner;
|
use embassy::executor::Spawner;
|
||||||
|
use embassy_embedded_hal::adapter::BlockingAsync;
|
||||||
use embassy_stm32::dma::NoDma;
|
use embassy_stm32::dma::NoDma;
|
||||||
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
|
||||||
use embassy_stm32::spi::{Config, Spi};
|
use embassy_stm32::spi::{Config, Spi};
|
||||||
use embassy_stm32::time::Hertz;
|
use embassy_stm32::time::Hertz;
|
||||||
use embassy_stm32::Peripherals;
|
use embassy_stm32::Peripherals;
|
||||||
use embassy_traits::adapter::BlockingAsync;
|
|
||||||
use embedded_hal_async::spi::SpiBus;
|
use embedded_hal_async::spi::SpiBus;
|
||||||
|
|
||||||
#[embassy::main]
|
#[embassy::main]
|
||||||
|
|
Loading…
Reference in a new issue