Merge branch 'master' of https://github.com/embassy-rs/embassy into embassy-stm32/rtc

This commit is contained in:
Mathias 2022-10-11 09:19:55 +02:00
commit aff265a7f5
85 changed files with 536 additions and 148 deletions

86
.github/workflows/doc.yml vendored Normal file
View File

@ -0,0 +1,86 @@
name: Docs
on:
push:
branches: [master]
env:
BUILDER_THREADS: '1'
jobs:
doc:
runs-on: ubuntu-latest
# Since stm32 crates take SO LONG to build, we split them
# into a separate job. This way it doesn't slow down updating
# the rest.
strategy:
matrix:
crates:
- stm32
- rest
# This will ensure at most one doc build job is running at a time
# (for stm32 and non-stm32 independently).
# If another job is already running, the new job will wait.
# If another job is already waiting, it'll be canceled.
# This means some commits will be skipped, but that's fine because
# we only care that the latest gets built.
concurrency: doc-${{ matrix.crates }}
steps:
- uses: actions/checkout@v2
with:
submodules: true
- name: Install Rust targets
run: |
rustup target add x86_64-unknown-linux-gnu
rustup target add wasm32-unknown-unknown
rustup target add thumbv6m-none-eabi
rustup target add thumbv7m-none-eabi
rustup target add thumbv7em-none-eabi
rustup target add thumbv7em-none-eabihf
rustup target add thumbv8m.base-none-eabi
rustup target add thumbv8m.main-none-eabi
rustup target add thumbv8m.main-none-eabihf
- name: Install docserver
run: |
wget -q -O /usr/local/bin/builder "https://github.com/embassy-rs/docserver/releases/download/v0.3/builder"
chmod +x /usr/local/bin/builder
- name: build-stm32
if: ${{ matrix.crates=='stm32' }}
run: |
mkdir crates
builder ./embassy-stm32 crates/embassy-stm32/git.zup
builder ./stm32-metapac crates/stm32-metapac/git.zup
- name: build-rest
if: ${{ matrix.crates=='rest' }}
run: |
mkdir crates
builder ./embassy-boot/boot crates/embassy-boot/git.zup
builder ./embassy-boot/nrf crates/embassy-boot-nrf/git.zup
builder ./embassy-boot/stm32 crates/embassy-boot-stm32/git.zup
builder ./embassy-cortex-m crates/embassy-cortex-m/git.zup
builder ./embassy-embedded-hal crates/embassy-embedded-hal/git.zup
builder ./embassy-executor crates/embassy-executor/git.zup
builder ./embassy-futures crates/embassy-futures/git.zup
builder ./embassy-lora crates/embassy-lora/git.zup
builder ./embassy-net crates/embassy-net/git.zup
builder ./embassy-nrf crates/embassy-nrf/git.zup
builder ./embassy-rp crates/embassy-rp/git.zup
builder ./embassy-sync crates/embassy-sync/git.zup
builder ./embassy-time crates/embassy-time/git.zup
builder ./embassy-usb crates/embassy-usb/git.zup
builder ./embassy-usb-driver crates/embassy-usb-driver/git.zup
- name: upload
run: |
mkdir -p ~/.kube
echo "${{secrets.KUBECONFIG}}" > ~/.kube/config
POD=$(kubectl -n embassy get po -l app=docserver -o jsonpath={.items[0].metadata.name})
kubectl cp crates $POD:/data

View File

@ -11,7 +11,7 @@ env:
jobs: jobs:
all: all:
runs-on: ubuntu-20.04 runs-on: ubuntu-latest
needs: [build-nightly, build-stable, test] needs: [build-nightly, build-stable, test]
steps: steps:
- name: Done - name: Done

View File

@ -3,6 +3,7 @@ authors = ["Dario Nieuwenhuis <dirbaio@dirbaio.net>"]
edition = "2018" edition = "2018"
name = "embassy-basic-example" name = "embassy-basic-example"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-executor = { version = "0.1.0", path = "../../../../../embassy-executor", features = ["defmt", "nightly"] } embassy-executor = { version = "0.1.0", path = "../../../../../embassy-executor", features = ["defmt", "nightly"] }

View File

@ -2,6 +2,7 @@
name = "blinky-async" name = "blinky-async"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
cortex-m = "0.7" cortex-m = "0.7"

View File

@ -2,6 +2,7 @@
name = "blinky-hal" name = "blinky-hal"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
cortex-m = "0.7" cortex-m = "0.7"

View File

@ -2,6 +2,7 @@
name = "blinky-irq" name = "blinky-irq"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
cortex-m = "0.7" cortex-m = "0.7"

View File

@ -2,6 +2,7 @@
name = "blinky-pac" name = "blinky-pac"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
cortex-m = "0.7" cortex-m = "0.7"

View File

@ -3,6 +3,7 @@ edition = "2021"
name = "embassy-boot" name = "embassy-boot"
version = "0.1.0" version = "0.1.0"
description = "Bootloader using Embassy" description = "Bootloader using Embassy"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-v$VERSION/embassy-boot/boot/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-v$VERSION/embassy-boot/boot/src/"

View File

@ -3,6 +3,7 @@ edition = "2021"
name = "embassy-boot-nrf" name = "embassy-boot-nrf"
version = "0.1.0" version = "0.1.0"
description = "Bootloader lib for nRF chips" description = "Bootloader lib for nRF chips"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-nrf-v$VERSION/embassy-boot/nrf/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-nrf-v$VERSION/embassy-boot/nrf/src/"

View File

@ -3,6 +3,7 @@ edition = "2021"
name = "embassy-boot-stm32" name = "embassy-boot-stm32"
version = "0.1.0" version = "0.1.0"
description = "Bootloader lib for STM32 chips" description = "Bootloader lib for STM32 chips"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-nrf-v$VERSION/embassy-boot/stm32/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-nrf-v$VERSION/embassy-boot/stm32/src/"

View File

@ -2,6 +2,7 @@
name = "embassy-cortex-m" name = "embassy-cortex-m"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-cortex-m-v$VERSION/embassy-cortex-m/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-cortex-m-v$VERSION/embassy-cortex-m/src/"

View File

@ -2,13 +2,14 @@
name = "embassy-embedded-hal" name = "embassy-embedded-hal"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-embedded-hal-v$VERSION/embassy-embedded-hal/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-embedded-hal-v$VERSION/embassy-embedded-hal/src/"
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-embedded-hal/src/" src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-embedded-hal/src/"
features = ["nightly", "std"] features = ["nightly", "std"]
target = "thumbv7em-none-eabi" target = "x86_64-unknown-linux-gnu"
[features] [features]
std = [] std = []

View File

@ -2,12 +2,13 @@
name = "embassy-executor" name = "embassy-executor"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-executor-v$VERSION/embassy-executor/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-executor-v$VERSION/embassy-executor/src/"
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-executor/src/" src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-executor/src/"
features = ["nightly", "defmt", "unstable-traits"] features = ["nightly", "defmt"]
flavors = [ flavors = [
{ name = "std", target = "x86_64-unknown-linux-gnu", features = ["std"] }, { name = "std", target = "x86_64-unknown-linux-gnu", features = ["std"] },
{ name = "wasm", target = "wasm32-unknown-unknown", features = ["wasm"] }, { name = "wasm", target = "wasm32-unknown-unknown", features = ["wasm"] },

View File

@ -2,6 +2,7 @@
name = "embassy-hal-common" name = "embassy-hal-common"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[features] [features]

View File

@ -2,6 +2,7 @@
name = "embassy-lora" name = "embassy-lora"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-lora-v$VERSION/embassy-lora/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-lora-v$VERSION/embassy-lora/src/"

View File

@ -2,6 +2,7 @@
name = "embassy-macros" name = "embassy-macros"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
syn = { version = "1.0.76", features = ["full", "extra-traits"] } syn = { version = "1.0.76", features = ["full", "extra-traits"] }

View File

@ -2,6 +2,7 @@
name = "embassy-net" name = "embassy-net"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]

View File

@ -2,6 +2,7 @@
name = "embassy-nrf" name = "embassy-nrf"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-nrf-v$VERSION/embassy-nrf/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-nrf-v$VERSION/embassy-nrf/src/"

View File

@ -2,6 +2,7 @@
name = "embassy-rp" name = "embassy-rp"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-rp-v$VERSION/embassy-rp/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-rp-v$VERSION/embassy-rp/src/"

View File

@ -599,12 +599,12 @@ pub(crate) mod sealed {
fn pin_bank(&self) -> u8; fn pin_bank(&self) -> u8;
#[inline] #[inline]
fn pin(&self) -> u8 { fn _pin(&self) -> u8 {
self.pin_bank() & 0x1f self.pin_bank() & 0x1f
} }
#[inline] #[inline]
fn bank(&self) -> Bank { fn _bank(&self) -> Bank {
if self.pin_bank() & 0x20 == 0 { if self.pin_bank() & 0x20 == 0 {
Bank::Bank0 Bank::Bank0
} else { } else {
@ -613,35 +613,35 @@ pub(crate) mod sealed {
} }
fn io(&self) -> pac::io::Gpio { fn io(&self) -> pac::io::Gpio {
let block = match self.bank() { let block = match self._bank() {
Bank::Bank0 => crate::pac::IO_BANK0, Bank::Bank0 => crate::pac::IO_BANK0,
Bank::Qspi => crate::pac::IO_QSPI, Bank::Qspi => crate::pac::IO_QSPI,
}; };
block.gpio(self.pin() as _) block.gpio(self._pin() as _)
} }
fn pad_ctrl(&self) -> Reg<pac::pads::regs::GpioCtrl, RW> { fn pad_ctrl(&self) -> Reg<pac::pads::regs::GpioCtrl, RW> {
let block = match self.bank() { let block = match self._bank() {
Bank::Bank0 => crate::pac::PADS_BANK0, Bank::Bank0 => crate::pac::PADS_BANK0,
Bank::Qspi => crate::pac::PADS_QSPI, Bank::Qspi => crate::pac::PADS_QSPI,
}; };
block.gpio(self.pin() as _) block.gpio(self._pin() as _)
} }
fn sio_out(&self) -> pac::sio::Gpio { fn sio_out(&self) -> pac::sio::Gpio {
SIO.gpio_out(self.bank() as _) SIO.gpio_out(self._bank() as _)
} }
fn sio_oe(&self) -> pac::sio::Gpio { fn sio_oe(&self) -> pac::sio::Gpio {
SIO.gpio_oe(self.bank() as _) SIO.gpio_oe(self._bank() as _)
} }
fn sio_in(&self) -> Reg<u32, RW> { fn sio_in(&self) -> Reg<u32, RW> {
SIO.gpio_in(self.bank() as _) SIO.gpio_in(self._bank() as _)
} }
fn int_proc(&self) -> pac::io::Int { fn int_proc(&self) -> pac::io::Int {
let io_block = match self.bank() { let io_block = match self._bank() {
Bank::Bank0 => crate::pac::IO_BANK0, Bank::Bank0 => crate::pac::IO_BANK0,
Bank::Qspi => crate::pac::IO_QSPI, Bank::Qspi => crate::pac::IO_QSPI,
}; };
@ -658,6 +658,18 @@ pub trait Pin: Peripheral<P = Self> + Into<AnyPin> + sealed::Pin + Sized + 'stat
pin_bank: self.pin_bank(), pin_bank: self.pin_bank(),
} }
} }
/// Returns the pin number within a bank
#[inline]
fn pin(&self) -> u8 {
self._pin()
}
/// Returns the bank of this pin
#[inline]
fn bank(&self) -> Bank {
self._bank()
}
} }
pub struct AnyPin { pub struct AnyPin {

View File

@ -2,6 +2,7 @@
name = "embassy-stm32" name = "embassy-stm32"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-stm32-v$VERSION/embassy-stm32/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-stm32-v$VERSION/embassy-stm32/src/"
@ -44,6 +45,7 @@ embassy-usb-driver = {version = "0.1.0", path = "../embassy-usb-driver", optiona
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.9", optional = true} embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.9", optional = true}
embedded-hal-async = { version = "=0.1.0-alpha.2", optional = true} embedded-hal-async = { version = "=0.1.0-alpha.2", optional = true}
embedded-hal-nb = { version = "=1.0.0-alpha.1", optional = true}
embedded-storage = "0.3.0" embedded-storage = "0.3.0"
embedded-storage-async = { version = "0.3.0", optional = true } embedded-storage-async = { version = "0.3.0", optional = true }
@ -103,7 +105,7 @@ unstable-pac = []
# Implement embedded-hal 1.0 alpha traits. # Implement embedded-hal 1.0 alpha traits.
# Implement embedded-hal-async traits if `nightly` is set as well. # Implement embedded-hal-async traits if `nightly` is set as well.
unstable-traits = ["embedded-hal-1"] unstable-traits = ["embedded-hal-1", "dep:embedded-hal-nb"]
# BEGIN GENERATED FEATURES # BEGIN GENERATED FEATURES
# Generated by stm32-gen-features. DO NOT EDIT. # Generated by stm32-gen-features. DO NOT EDIT.

View File

@ -28,15 +28,20 @@ pub(crate) mod sealed {
pub trait AdcPin<T: Instance> { pub trait AdcPin<T: Instance> {
fn channel(&self) -> u8; fn channel(&self) -> u8;
} }
pub trait InternalChannel<T> {
fn channel(&self) -> u8;
}
} }
#[cfg(not(adc_f1))] #[cfg(not(any(adc_f1, adc_v2)))]
pub trait Instance: sealed::Instance + 'static {} pub trait Instance: sealed::Instance + 'static {}
#[cfg(adc_f1)] #[cfg(any(adc_f1, adc_v2))]
pub trait Instance: sealed::Instance + crate::rcc::RccPeripheral + 'static {} pub trait Instance: sealed::Instance + crate::rcc::RccPeripheral + 'static {}
#[cfg(all(not(adc_f1), not(adc_v1)))] #[cfg(all(not(adc_f1), not(adc_v1)))]
pub trait Common: sealed::Common + 'static {} pub trait Common: sealed::Common + 'static {}
pub trait AdcPin<T: Instance>: sealed::AdcPin<T> {} pub trait AdcPin<T: Instance>: sealed::AdcPin<T> {}
pub trait InternalChannel<T>: sealed::InternalChannel<T> {}
#[cfg(not(stm32h7))] #[cfg(not(stm32h7))]
foreach_peripheral!( foreach_peripheral!(

View File

@ -3,7 +3,9 @@ use core::marker::PhantomData;
use embassy_hal_common::into_ref; use embassy_hal_common::into_ref;
use embedded_hal_02::blocking::delay::DelayUs; use embedded_hal_02::blocking::delay::DelayUs;
use super::InternalChannel;
use crate::adc::{AdcPin, Instance}; use crate::adc::{AdcPin, Instance};
use crate::peripherals::ADC1;
use crate::time::Hertz; use crate::time::Hertz;
use crate::Peripheral; use crate::Peripheral;
@ -12,20 +14,8 @@ pub const VREF_DEFAULT_MV: u32 = 3300;
/// VREF voltage used for factory calibration of VREFINTCAL register. /// VREF voltage used for factory calibration of VREFINTCAL register.
pub const VREF_CALIB_MV: u32 = 3300; pub const VREF_CALIB_MV: u32 = 3300;
#[cfg(not(any(rcc_f4, rcc_f7)))] /// ADC turn-on time
fn enable() { pub const ADC_POWERUP_TIME_US: u32 = 3;
todo!()
}
#[cfg(any(rcc_f4, rcc_f7))]
fn enable() {
critical_section::with(|_| unsafe {
// TODO do not enable all adc clocks if not needed
crate::pac::RCC.apb2enr().modify(|w| w.set_adc1en(true));
crate::pac::RCC.apb2enr().modify(|w| w.set_adc2en(true));
crate::pac::RCC.apb2enr().modify(|w| w.set_adc3en(true));
});
}
pub enum Resolution { pub enum Resolution {
TwelveBit, TwelveBit,
@ -61,24 +51,53 @@ impl Resolution {
} }
pub struct VrefInt; pub struct VrefInt;
impl<T: Instance> AdcPin<T> for VrefInt {} impl InternalChannel<ADC1> for VrefInt {}
impl<T: Instance> super::sealed::AdcPin<T> for VrefInt { impl super::sealed::InternalChannel<ADC1> for VrefInt {
fn channel(&self) -> u8 { fn channel(&self) -> u8 {
17 17
} }
} }
impl VrefInt {
/// Time needed for internal voltage reference to stabilize
pub fn start_time_us() -> u32 {
10
}
}
pub struct Temperature; pub struct Temperature;
impl<T: Instance> AdcPin<T> for Temperature {} impl InternalChannel<ADC1> for Temperature {}
impl<T: Instance> super::sealed::AdcPin<T> for Temperature { impl super::sealed::InternalChannel<ADC1> for Temperature {
fn channel(&self) -> u8 { fn channel(&self) -> u8 {
16 cfg_if::cfg_if! {
if #[cfg(any(stm32f40, stm32f41))] {
16
} else {
18
}
}
}
}
impl Temperature {
/// Converts temperature sensor reading in millivolts to degrees celcius
pub fn to_celcius(sample_mv: u16) -> f32 {
// From 6.3.22 Temperature sensor characteristics
const V25: i32 = 760; // mV
const AVG_SLOPE: f32 = 2.5; // mV/C
(sample_mv as i32 - V25) as f32 / AVG_SLOPE + 25.0
}
/// Time needed for temperature sensor readings to stabilize
pub fn start_time_us() -> u32 {
10
} }
} }
pub struct Vbat; pub struct Vbat;
impl<T: Instance> AdcPin<T> for Vbat {} impl InternalChannel<ADC1> for Vbat {}
impl<T: Instance> super::sealed::AdcPin<T> for Vbat { impl super::sealed::InternalChannel<ADC1> for Vbat {
fn channel(&self) -> u8 { fn channel(&self) -> u8 {
18 18
} }
@ -164,21 +183,19 @@ where
{ {
pub fn new(_peri: impl Peripheral<P = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self { pub fn new(_peri: impl Peripheral<P = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self {
into_ref!(_peri); into_ref!(_peri);
enable(); T::enable();
T::reset();
let presc = unsafe { Prescaler::from_pclk2(crate::rcc::get_freqs().apb2) }; let presc = Prescaler::from_pclk2(T::frequency());
unsafe { unsafe {
T::common_regs().ccr().modify(|w| w.set_adcpre(presc.adcpre())); T::common_regs().ccr().modify(|w| w.set_adcpre(presc.adcpre()));
}
unsafe {
// disable before config is set
T::regs().cr2().modify(|reg| { T::regs().cr2().modify(|reg| {
reg.set_adon(crate::pac::adc::vals::Adon::DISABLED); reg.set_adon(crate::pac::adc::vals::Adon::ENABLED);
}); });
} }
delay.delay_us(20); // TODO? delay.delay_us(ADC_POWERUP_TIME_US);
Self { Self {
sample_time: Default::default(), sample_time: Default::default(),
@ -208,6 +225,45 @@ where
((u32::from(sample) * self.vref_mv) / self.resolution.to_max_count()) as u16 ((u32::from(sample) * self.vref_mv) / self.resolution.to_max_count()) as u16
} }
/// Enables internal voltage reference and returns [VrefInt], which can be used in
/// [Adc::read_internal()] to perform conversion.
pub fn enable_vrefint(&self) -> VrefInt {
unsafe {
T::common_regs().ccr().modify(|reg| {
reg.set_tsvrefe(crate::pac::adccommon::vals::Tsvrefe::ENABLED);
});
}
VrefInt {}
}
/// Enables internal temperature sensor and returns [Temperature], which can be used in
/// [Adc::read_internal()] to perform conversion.
///
/// On STM32F42 and STM32F43 this can not be used together with [Vbat]. If both are enabled,
/// temperature sensor will return vbat value.
pub fn enable_temperature(&self) -> Temperature {
unsafe {
T::common_regs().ccr().modify(|reg| {
reg.set_tsvrefe(crate::pac::adccommon::vals::Tsvrefe::ENABLED);
});
}
Temperature {}
}
/// Enables vbat input and returns [Vbat], which can be used in
/// [Adc::read_internal()] to perform conversion.
pub fn enable_vbat(&self) -> Vbat {
unsafe {
T::common_regs().ccr().modify(|reg| {
reg.set_vbate(crate::pac::adccommon::vals::Vbate::ENABLED);
});
}
Vbat {}
}
/// Perform a single conversion. /// Perform a single conversion.
fn convert(&mut self) -> u16 { fn convert(&mut self) -> u16 {
unsafe { unsafe {
@ -238,44 +294,31 @@ where
P: crate::gpio::sealed::Pin, P: crate::gpio::sealed::Pin,
{ {
unsafe { unsafe {
// dissable ADC
T::regs().cr2().modify(|reg| {
reg.set_swstart(false);
});
T::regs().cr2().modify(|reg| {
reg.set_adon(crate::pac::adc::vals::Adon::DISABLED);
});
pin.set_as_analog(); pin.set_as_analog();
// Configure ADC self.read_channel(pin.channel())
T::regs().cr1().modify(|reg| reg.set_res(self.resolution.res()));
// Select channel
T::regs().sqr3().write(|reg| reg.set_sq(0, pin.channel()));
// Configure channel
Self::set_channel_sample_time(pin.channel(), self.sample_time);
// enable adc
T::regs().cr2().modify(|reg| {
reg.set_adon(crate::pac::adc::vals::Adon::ENABLED);
});
let val = self.convert();
// dissable ADC
T::regs().cr2().modify(|reg| {
reg.set_swstart(false);
});
T::regs().cr2().modify(|reg| {
reg.set_adon(crate::pac::adc::vals::Adon::DISABLED);
});
val
} }
} }
pub fn read_internal(&mut self, channel: &mut impl InternalChannel<T>) -> u16 {
unsafe { self.read_channel(channel.channel()) }
}
unsafe fn read_channel(&mut self, channel: u8) -> u16 {
// Configure ADC
T::regs().cr1().modify(|reg| reg.set_res(self.resolution.res()));
// Select channel
T::regs().sqr3().write(|reg| reg.set_sq(0, channel));
// Configure channel
Self::set_channel_sample_time(channel, self.sample_time);
let val = self.convert();
val
}
unsafe fn set_channel_sample_time(ch: u8, sample_time: SampleTime) { unsafe fn set_channel_sample_time(ch: u8, sample_time: SampleTime) {
if ch <= 9 { if ch <= 9 {
T::regs() T::regs()
@ -288,3 +331,9 @@ where
} }
} }
} }
impl<'d, T: Instance> Drop for Adc<'d, T> {
fn drop(&mut self) {
T::disable();
}
}

View File

@ -5,7 +5,7 @@ use embedded_hal_02::blocking::delay::DelayUs;
use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel}; use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel};
use pac::adccommon::vals::Presc; use pac::adccommon::vals::Presc;
use super::{AdcPin, Instance}; use super::{AdcPin, Instance, InternalChannel};
use crate::time::Hertz; use crate::time::Hertz;
use crate::{pac, Peripheral}; use crate::{pac, Peripheral};
@ -50,18 +50,10 @@ impl Resolution {
} }
} }
pub trait InternalChannel<T>: sealed::InternalChannel<T> {}
mod sealed {
pub trait InternalChannel<T> {
fn channel(&self) -> u8;
}
}
// NOTE: Vrefint/Temperature/Vbat are only available on ADC3 on H7, this currently cannot be modeled with stm32-data, so these are available from the software on all ADCs // NOTE: Vrefint/Temperature/Vbat are only available on ADC3 on H7, this currently cannot be modeled with stm32-data, so these are available from the software on all ADCs
pub struct VrefInt; pub struct VrefInt;
impl<T: Instance> InternalChannel<T> for VrefInt {} impl<T: Instance> InternalChannel<T> for VrefInt {}
impl<T: Instance> sealed::InternalChannel<T> for VrefInt { impl<T: Instance> super::sealed::InternalChannel<T> for VrefInt {
fn channel(&self) -> u8 { fn channel(&self) -> u8 {
19 19
} }
@ -69,7 +61,7 @@ impl<T: Instance> sealed::InternalChannel<T> for VrefInt {
pub struct Temperature; pub struct Temperature;
impl<T: Instance> InternalChannel<T> for Temperature {} impl<T: Instance> InternalChannel<T> for Temperature {}
impl<T: Instance> sealed::InternalChannel<T> for Temperature { impl<T: Instance> super::sealed::InternalChannel<T> for Temperature {
fn channel(&self) -> u8 { fn channel(&self) -> u8 {
18 18
} }
@ -77,7 +69,7 @@ impl<T: Instance> sealed::InternalChannel<T> for Temperature {
pub struct Vbat; pub struct Vbat;
impl<T: Instance> InternalChannel<T> for Vbat {} impl<T: Instance> InternalChannel<T> for Vbat {}
impl<T: Instance> sealed::InternalChannel<T> for Vbat { impl<T: Instance> super::sealed::InternalChannel<T> for Vbat {
fn channel(&self) -> u8 { fn channel(&self) -> u8 {
// TODO this should be 14 for H7a/b/35 // TODO this should be 14 for H7a/b/35
17 17

View File

@ -23,17 +23,6 @@ impl<'d> Flash<'d> {
Self { _inner: p } Self { _inner: p }
} }
pub fn unlock(p: impl Peripheral<P = FLASH> + 'd) -> Self {
let flash = Self::new(p);
unsafe { family::unlock() };
flash
}
pub fn lock(&mut self) {
unsafe { family::lock() };
}
pub fn blocking_read(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), Error> { pub fn blocking_read(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), Error> {
let offset = FLASH_BASE as u32 + offset; let offset = FLASH_BASE as u32 + offset;
if offset as usize >= FLASH_END || offset as usize + bytes.len() > FLASH_END { if offset as usize >= FLASH_END || offset as usize + bytes.len() > FLASH_END {
@ -57,7 +46,12 @@ impl<'d> Flash<'d> {
self.clear_all_err(); self.clear_all_err();
unsafe { family::blocking_write(offset, buf) } unsafe {
family::unlock();
let res = family::blocking_write(offset, buf);
family::lock();
res
}
} }
pub fn blocking_erase(&mut self, from: u32, to: u32) -> Result<(), Error> { pub fn blocking_erase(&mut self, from: u32, to: u32) -> Result<(), Error> {
@ -72,7 +66,12 @@ impl<'d> Flash<'d> {
self.clear_all_err(); self.clear_all_err();
unsafe { family::blocking_erase(from, to) } unsafe {
family::unlock();
let res = family::blocking_erase(from, to);
family::lock();
res
}
} }
fn clear_all_err(&mut self) { fn clear_all_err(&mut self) {
@ -82,7 +81,7 @@ impl<'d> Flash<'d> {
impl Drop for Flash<'_> { impl Drop for Flash<'_> {
fn drop(&mut self) { fn drop(&mut self) {
self.lock(); unsafe { family::lock() };
} }
} }

View File

@ -160,6 +160,30 @@ impl<'d, T: BasicInstance, RxDma> UartRx<'d, T, RxDma> {
Ok(()) Ok(())
} }
pub fn nb_read(&mut self) -> Result<u8, nb::Error<Error>> {
let r = T::regs();
unsafe {
let sr = sr(r).read();
if sr.pe() {
rdr(r).read_volatile();
Err(nb::Error::Other(Error::Parity))
} else if sr.fe() {
rdr(r).read_volatile();
Err(nb::Error::Other(Error::Framing))
} else if sr.ne() {
rdr(r).read_volatile();
Err(nb::Error::Other(Error::Noise))
} else if sr.ore() {
rdr(r).read_volatile();
Err(nb::Error::Other(Error::Overrun))
} else if sr.rxne() {
Ok(rdr(r).read_volatile())
} else {
Err(nb::Error::WouldBlock)
}
}
}
pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<(), Error> { pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<(), Error> {
unsafe { unsafe {
let r = T::regs(); let r = T::regs();
@ -263,6 +287,10 @@ impl<'d, T: BasicInstance, TxDma, RxDma> Uart<'d, T, TxDma, RxDma> {
self.rx.read(buffer).await self.rx.read(buffer).await
} }
pub fn nb_read(&mut self) -> Result<u8, nb::Error<Error>> {
self.rx.nb_read()
}
pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<(), Error> { pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<(), Error> {
self.rx.blocking_read(buffer) self.rx.blocking_read(buffer)
} }
@ -281,27 +309,7 @@ mod eh02 {
impl<'d, T: BasicInstance, RxDma> embedded_hal_02::serial::Read<u8> for UartRx<'d, T, RxDma> { impl<'d, T: BasicInstance, RxDma> embedded_hal_02::serial::Read<u8> for UartRx<'d, T, RxDma> {
type Error = Error; type Error = Error;
fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
let r = T::regs(); self.nb_read()
unsafe {
let sr = sr(r).read();
if sr.pe() {
rdr(r).read_volatile();
Err(nb::Error::Other(Error::Parity))
} else if sr.fe() {
rdr(r).read_volatile();
Err(nb::Error::Other(Error::Framing))
} else if sr.ne() {
rdr(r).read_volatile();
Err(nb::Error::Other(Error::Noise))
} else if sr.ore() {
rdr(r).read_volatile();
Err(nb::Error::Other(Error::Overrun))
} else if sr.rxne() {
Ok(rdr(r).read_volatile())
} else {
Err(nb::Error::WouldBlock)
}
}
} }
} }
@ -318,7 +326,7 @@ mod eh02 {
impl<'d, T: BasicInstance, TxDma, RxDma> embedded_hal_02::serial::Read<u8> for Uart<'d, T, TxDma, RxDma> { impl<'d, T: BasicInstance, TxDma, RxDma> embedded_hal_02::serial::Read<u8> for Uart<'d, T, TxDma, RxDma> {
type Error = Error; type Error = Error;
fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
embedded_hal_02::serial::Read::read(&mut self.rx) self.nb_read()
} }
} }
@ -359,6 +367,58 @@ mod eh1 {
impl<'d, T: BasicInstance, RxDma> embedded_hal_1::serial::ErrorType for UartRx<'d, T, RxDma> { impl<'d, T: BasicInstance, RxDma> embedded_hal_1::serial::ErrorType for UartRx<'d, T, RxDma> {
type Error = Error; type Error = Error;
} }
impl<'d, T: BasicInstance, RxDma> embedded_hal_nb::serial::Read for UartRx<'d, T, RxDma> {
fn read(&mut self) -> nb::Result<u8, Self::Error> {
self.nb_read()
}
}
impl<'d, T: BasicInstance, TxDma> embedded_hal_1::serial::Write for UartTx<'d, T, TxDma> {
fn write(&mut self, buffer: &[u8]) -> Result<(), Self::Error> {
self.blocking_write(buffer)
}
fn flush(&mut self) -> Result<(), Self::Error> {
self.blocking_flush()
}
}
impl<'d, T: BasicInstance, TxDma> embedded_hal_nb::serial::Write for UartTx<'d, T, TxDma> {
fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> {
self.blocking_write(&[char]).map_err(nb::Error::Other)
}
fn flush(&mut self) -> nb::Result<(), Self::Error> {
self.blocking_flush().map_err(nb::Error::Other)
}
}
impl<'d, T: BasicInstance, TxDma, RxDma> embedded_hal_nb::serial::Read for Uart<'d, T, TxDma, RxDma> {
fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
self.nb_read()
}
}
impl<'d, T: BasicInstance, TxDma, RxDma> embedded_hal_1::serial::Write for Uart<'d, T, TxDma, RxDma> {
fn write(&mut self, buffer: &[u8]) -> Result<(), Self::Error> {
self.blocking_write(buffer)
}
fn flush(&mut self) -> Result<(), Self::Error> {
self.blocking_flush()
}
}
impl<'d, T: BasicInstance, TxDma, RxDma> embedded_hal_nb::serial::Write for Uart<'d, T, TxDma, RxDma> {
fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> {
self.blocking_write(&[char]).map_err(nb::Error::Other)
}
fn flush(&mut self) -> nb::Result<(), Self::Error> {
self.blocking_flush().map_err(nb::Error::Other)
}
}
} }
#[cfg(all( #[cfg(all(

View File

@ -2,6 +2,16 @@
name = "embassy-sync" name = "embassy-sync"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
description = "no-std, no-alloc synchronization primitives with async support"
repository = "https://github.com/embassy-rs/embassy"
readme = "README.md"
license = "MIT OR Apache-2.0"
categories = [
"embedded",
"no-std",
"concurrency",
"asynchronous",
]
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-sync-v$VERSION/embassy-sync/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-sync-v$VERSION/embassy-sync/src/"

View File

@ -1,12 +1,32 @@
# embassy-sync # embassy-sync
Synchronization primitives and data structures with an async API: An [Embassy](https://embassy.dev) project.
Synchronization primitives and data structures with async support:
- [`Channel`](channel::Channel) - A Multiple Producer Multiple Consumer (MPMC) channel. Each message is only received by a single consumer. - [`Channel`](channel::Channel) - A Multiple Producer Multiple Consumer (MPMC) channel. Each message is only received by a single consumer.
- [`PubSubChannel`](pubsub::PubSubChannel) - A broadcast channel (publish-subscribe) channel. Each message is received by all consumers. - [`PubSubChannel`](pubsub::PubSubChannel) - A broadcast channel (publish-subscribe) channel. Each message is received by all consumers.
- [`Signal`](signal::Signal) - Signalling latest value to a single consumer. - [`Signal`](signal::Signal) - Signalling latest value to a single consumer.
- [`Mutex`](mutex::Mutex) - A Mutex for synchronizing state between asynchronous tasks. - [`Mutex`](mutex::Mutex) - Mutex for synchronizing state between asynchronous tasks.
- [`Pipe`](pipe::Pipe) - Byte stream implementing `embedded_io` traits. - [`Pipe`](pipe::Pipe) - Byte stream implementing `embedded_io` traits.
- [`WakerRegistration`](waitqueue::WakerRegistration) - Utility to register and wake a `Waker`. - [`WakerRegistration`](waitqueue::WakerRegistration) - Utility to register and wake a `Waker`.
- [`AtomicWaker`](waitqueue::AtomicWaker) - A variant of `WakerRegistration` accessible using a non-mut API. - [`AtomicWaker`](waitqueue::AtomicWaker) - A variant of `WakerRegistration` accessible using a non-mut API.
- [`MultiWakerRegistration`](waitqueue::MultiWakerRegistration) - Utility registering and waking multiple `Waker`'s. - [`MultiWakerRegistration`](waitqueue::MultiWakerRegistration) - Utility registering and waking multiple `Waker`'s.
## Interoperability
Futures from this crate can run on any executor.
## Minimum supported Rust version (MSRV)
Embassy is guaranteed to compile on the latest stable Rust version at the time of release. It might compile with older versions but that may change in any new patch release.
## License
This work is licensed under either of
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or
<http://www.apache.org/licenses/LICENSE-2.0>)
- MIT license ([LICENSE-MIT](LICENSE-MIT) or <http://opensource.org/licenses/MIT>)
at your option.

View File

@ -123,6 +123,14 @@ impl<'a, PSB: PubSubBehavior<T> + ?Sized, T: Clone> ImmediatePub<'a, PSB, T> {
pub fn try_publish(&self, message: T) -> Result<(), T> { pub fn try_publish(&self, message: T) -> Result<(), T> {
self.channel.publish_with_context(message, None) self.channel.publish_with_context(message, None)
} }
/// The amount of messages that can still be published without having to wait or without having to lag the subscribers
///
/// *Note: In the time between checking this and a publish action, other publishers may have had time to publish something.
/// So checking doesn't give any guarantees.*
pub fn space(&self) -> usize {
self.channel.space()
}
} }
/// An immediate publisher that holds a dynamic reference to the channel /// An immediate publisher that holds a dynamic reference to the channel

View File

@ -2,6 +2,7 @@
name = "embassy-time" name = "embassy-time"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]

View File

@ -2,6 +2,7 @@
name = "embassy-usb-driver" name = "embassy-usb-driver"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@ -2,11 +2,12 @@
name = "embassy-usb" name = "embassy-usb"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-usb-v$VERSION/embassy-usb/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-usb-v$VERSION/embassy-usb/src/"
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-usb/src/" src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-usb/src/"
features = ["defmt"] features = ["defmt", "usbd-hid"]
target = "thumbv7em-none-eabi" target = "thumbv7em-none-eabi"
[features] [features]

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-boot-nrf-examples" name = "embassy-boot-nrf-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync" } embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync" }

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-boot-stm32f3-examples" name = "embassy-boot-stm32f3-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync", features = ["defmt"] }

View File

@ -17,7 +17,7 @@ static APP_B: &[u8] = include_bytes!("../../b.bin");
#[embassy_executor::main] #[embassy_executor::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
let flash = Flash::unlock(p.FLASH); let flash = Flash::new(p.FLASH);
let mut flash = BlockingAsync::new(flash); let mut flash = BlockingAsync::new(flash);
let button = Input::new(p.PC13, Pull::Up); let button = Input::new(p.PC13, Pull::Up);

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-boot-stm32f7-examples" name = "embassy-boot-stm32f7-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync", features = ["defmt"] }

View File

@ -16,7 +16,7 @@ static APP_B: &[u8] = include_bytes!("../../b.bin");
#[embassy_executor::main] #[embassy_executor::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
let mut flash = Flash::unlock(p.FLASH); let mut flash = Flash::new(p.FLASH);
let button = Input::new(p.PC13, Pull::Down); let button = Input::new(p.PC13, Pull::Down);
let mut button = ExtiInput::new(button, p.EXTI13); let mut button = ExtiInput::new(button, p.EXTI13);

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-boot-stm32h7-examples" name = "embassy-boot-stm32h7-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync" } embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync" }

View File

@ -16,7 +16,7 @@ static APP_B: &[u8] = include_bytes!("../../b.bin");
#[embassy_executor::main] #[embassy_executor::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
let mut flash = Flash::unlock(p.FLASH); let mut flash = Flash::new(p.FLASH);
let button = Input::new(p.PC13, Pull::Down); let button = Input::new(p.PC13, Pull::Down);
let mut button = ExtiInput::new(button, p.EXTI13); let mut button = ExtiInput::new(button, p.EXTI13);

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-boot-stm32l0-examples" name = "embassy-boot-stm32l0-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync", features = ["defmt"] }

View File

@ -18,7 +18,7 @@ static APP_B: &[u8] = include_bytes!("../../b.bin");
#[embassy_executor::main] #[embassy_executor::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
let flash = Flash::unlock(p.FLASH); let flash = Flash::new(p.FLASH);
let mut flash = BlockingAsync::new(flash); let mut flash = BlockingAsync::new(flash);
let button = Input::new(p.PB2, Pull::Up); let button = Input::new(p.PB2, Pull::Up);

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-boot-stm32l1-examples" name = "embassy-boot-stm32l1-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync", features = ["defmt"] }

View File

@ -18,7 +18,7 @@ static APP_B: &[u8] = include_bytes!("../../b.bin");
#[embassy_executor::main] #[embassy_executor::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
let flash = Flash::unlock(p.FLASH); let flash = Flash::new(p.FLASH);
let mut flash = BlockingAsync::new(flash); let mut flash = BlockingAsync::new(flash);
let button = Input::new(p.PB2, Pull::Up); let button = Input::new(p.PB2, Pull::Up);

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-boot-stm32l4-examples" name = "embassy-boot-stm32l4-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync", features = ["defmt"] }

View File

@ -17,7 +17,7 @@ static APP_B: &[u8] = include_bytes!("../../b.bin");
#[embassy_executor::main] #[embassy_executor::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
let flash = Flash::unlock(p.FLASH); let flash = Flash::new(p.FLASH);
let mut flash = BlockingAsync::new(flash); let mut flash = BlockingAsync::new(flash);
let button = Input::new(p.PC13, Pull::Up); let button = Input::new(p.PC13, Pull::Up);

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-boot-stm32wl-examples" name = "embassy-boot-stm32wl-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../../../embassy-sync", features = ["defmt"] }

View File

@ -17,7 +17,7 @@ static APP_B: &[u8] = include_bytes!("../../b.bin");
#[embassy_executor::main] #[embassy_executor::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
let flash = Flash::unlock(p.FLASH); let flash = Flash::new(p.FLASH);
let mut flash = BlockingAsync::new(flash); let mut flash = BlockingAsync::new(flash);
let button = Input::new(p.PA0, Pull::Up); let button = Input::new(p.PA0, Pull::Up);

View File

@ -3,6 +3,7 @@ edition = "2021"
name = "nrf-bootloader-example" name = "nrf-bootloader-example"
version = "0.1.0" version = "0.1.0"
description = "Bootloader for nRF chips" description = "Bootloader for nRF chips"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
defmt = { version = "0.3", optional = true } defmt = { version = "0.3", optional = true }

View File

@ -3,6 +3,7 @@ edition = "2021"
name = "stm32-bootloader-example" name = "stm32-bootloader-example"
version = "0.1.0" version = "0.1.0"
description = "Example bootloader for STM32 chips" description = "Example bootloader for STM32 chips"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
defmt = { version = "0.3", optional = true } defmt = { version = "0.3", optional = true }

View File

@ -20,7 +20,7 @@ fn main() -> ! {
*/ */
let mut bl: BootLoader<ERASE_SIZE, WRITE_SIZE> = BootLoader::default(); let mut bl: BootLoader<ERASE_SIZE, WRITE_SIZE> = BootLoader::default();
let flash = Flash::unlock(p.FLASH); let flash = Flash::new(p.FLASH);
let mut flash = BootFlash::<_, ERASE_SIZE, ERASE_VALUE>::new(flash); let mut flash = BootFlash::<_, ERASE_SIZE, ERASE_VALUE>::new(flash);
let start = bl.prepare(&mut SingleFlashConfig::new(&mut flash)); let start = bl.prepare(&mut SingleFlashConfig::new(&mut flash));
core::mem::drop(flash); core::mem::drop(flash);

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-nrf-rtos-trace-examples" name = "embassy-nrf-rtos-trace-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[features] [features]
default = ["log", "nightly"] default = ["log", "nightly"]

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-nrf-examples" name = "embassy-nrf-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[features] [features]
default = ["nightly"] default = ["nightly"]

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-rp-examples" name = "embassy-rp-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
@ -26,7 +27,7 @@ st7789 = "0.6.1"
display-interface = "0.4.1" display-interface = "0.4.1"
byte-slice-cast = { version = "1.2.0", default-features = false } byte-slice-cast = { version = "1.2.0", default-features = false }
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.8" } embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.9" }
embedded-hal-async = { version = "0.1.0-alpha.1" } embedded-hal-async = { version = "0.1.0-alpha.1" }
embedded-io = { version = "0.3.0", features = ["async", "defmt"] } embedded-io = { version = "0.3.0", features = ["async", "defmt"] }
static_cell = "1.0.0" static_cell = "1.0.0"

View File

@ -0,0 +1,70 @@
#![no_std]
#![no_main]
#![feature(type_alias_impl_trait)]
use defmt::*;
use embassy_executor::Spawner;
use embassy_rp::i2c::{self, Config};
use embassy_time::{Duration, Timer};
use embedded_hal_1::i2c::I2c;
use {defmt_rtt as _, panic_probe as _};
#[allow(dead_code)]
mod mcp23017 {
pub const ADDR: u8 = 0x20; // default addr
pub const IODIRA: u8 = 0x00;
pub const IPOLA: u8 = 0x02;
pub const GPINTENA: u8 = 0x04;
pub const DEFVALA: u8 = 0x06;
pub const INTCONA: u8 = 0x08;
pub const IOCONA: u8 = 0x0A;
pub const GPPUA: u8 = 0x0C;
pub const INTFA: u8 = 0x0E;
pub const INTCAPA: u8 = 0x10;
pub const GPIOA: u8 = 0x12;
pub const OLATA: u8 = 0x14;
pub const IODIRB: u8 = 0x01;
pub const IPOLB: u8 = 0x03;
pub const GPINTENB: u8 = 0x05;
pub const DEFVALB: u8 = 0x07;
pub const INTCONB: u8 = 0x09;
pub const IOCONB: u8 = 0x0B;
pub const GPPUB: u8 = 0x0D;
pub const INTFB: u8 = 0x0F;
pub const INTCAPB: u8 = 0x11;
pub const GPIOB: u8 = 0x13;
pub const OLATB: u8 = 0x15;
}
#[embassy_executor::main]
async fn main(_spawner: Spawner) {
let p = embassy_rp::init(Default::default());
let sda = p.PIN_14;
let scl = p.PIN_15;
info!("set up i2c ");
let mut i2c = i2c::I2c::new_blocking(p.I2C1, scl, sda, Config::default());
use mcp23017::*;
info!("init mcp23017 config for IxpandO");
// init - a outputs, b inputs
i2c.write(ADDR, &[IODIRA, 0x00]).unwrap();
i2c.write(ADDR, &[IODIRB, 0xff]).unwrap();
i2c.write(ADDR, &[GPPUB, 0xff]).unwrap(); // pullups
let mut val = 0xaa;
loop {
let mut portb = [0];
i2c.write(mcp23017::ADDR, &[GPIOA, val]).unwrap();
i2c.write_read(mcp23017::ADDR, &[GPIOB], &mut portb).unwrap();
info!("portb = {:02x}", portb[0]);
val = !val;
Timer::after(Duration::from_secs(1)).await;
}
}

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-std-examples" name = "embassy-std-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["log"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["log"] }

View File

@ -2,6 +2,7 @@
name = "embassy-stm32f0-examples" name = "embassy-stm32f0-examples"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32f1-examples" name = "embassy-stm32f1-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] }

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32f2-examples" name = "embassy-stm32f2-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] }

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32f3-examples" name = "embassy-stm32f3-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] }

View File

@ -15,7 +15,7 @@ async fn main(_spawner: Spawner) {
const ADDR: u32 = 0x26000; const ADDR: u32 = 0x26000;
let mut f = Flash::unlock(p.FLASH); let mut f = Flash::new(p.FLASH);
info!("Reading..."); info!("Reading...");
let mut buf = [0u8; 8]; let mut buf = [0u8; 8];

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32f4-examples" name = "embassy-stm32f4-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]

View File

@ -2,9 +2,10 @@
#![no_main] #![no_main]
#![feature(type_alias_impl_trait)] #![feature(type_alias_impl_trait)]
use cortex_m::prelude::_embedded_hal_blocking_delay_DelayUs;
use defmt::*; use defmt::*;
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_stm32::adc::Adc; use embassy_stm32::adc::{Adc, Temperature, VrefInt};
use embassy_time::{Delay, Duration, Timer}; use embassy_time::{Delay, Duration, Timer};
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
@ -13,12 +14,30 @@ async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
info!("Hello World!"); info!("Hello World!");
let mut adc = Adc::new(p.ADC1, &mut Delay); let mut delay = Delay;
let mut adc = Adc::new(p.ADC1, &mut delay);
let mut pin = p.PC1; let mut pin = p.PC1;
let mut vrefint = adc.enable_vrefint();
let mut temp = adc.enable_temperature();
// Startup delay can be combined to the maximum of either
delay.delay_us(Temperature::start_time_us().max(VrefInt::start_time_us()));
loop { loop {
// Read pin
let v = adc.read(&mut pin); let v = adc.read(&mut pin);
info!("--> {} - {} mV", v, adc.to_millivolts(v)); info!("PC1: {} ({} mV)", v, adc.to_millivolts(v));
// Read internal temperature
let v = adc.read_internal(&mut temp);
let celcius = Temperature::to_celcius(adc.to_millivolts(v));
info!("Internal temp: {} ({} C)", v, celcius);
// Read internal voltage reference
let v = adc.read_internal(&mut vrefint);
info!("VrefInt: {} ({} mV)", v, adc.to_millivolts(v));
Timer::after(Duration::from_millis(100)).await; Timer::after(Duration::from_millis(100)).await;
} }
} }

View File

@ -13,7 +13,7 @@ async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
info!("Hello Flash!"); info!("Hello Flash!");
let mut f = Flash::unlock(p.FLASH); let mut f = Flash::new(p.FLASH);
// Sector 5 // Sector 5
test_flash(&mut f, 128 * 1024, 128 * 1024); test_flash(&mut f, 128 * 1024, 128 * 1024);

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32f7-examples" name = "embassy-stm32f7-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] }

View File

@ -19,7 +19,7 @@ async fn main(_spawner: Spawner) {
// wait a bit before accessing the flash // wait a bit before accessing the flash
Timer::after(Duration::from_millis(300)).await; Timer::after(Duration::from_millis(300)).await;
let mut f = Flash::unlock(p.FLASH); let mut f = Flash::new(p.FLASH);
info!("Reading..."); info!("Reading...");
let mut buf = [0u8; 32]; let mut buf = [0u8; 32];

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32g0-examples" name = "embassy-stm32g0-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] }

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32g4-examples" name = "embassy-stm32g4-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] }

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32h7-examples" name = "embassy-stm32h7-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] }

View File

@ -19,7 +19,7 @@ async fn main(_spawner: Spawner) {
// wait a bit before accessing the flash // wait a bit before accessing the flash
Timer::after(Duration::from_millis(300)).await; Timer::after(Duration::from_millis(300)).await;
let mut f = Flash::unlock(p.FLASH); let mut f = Flash::new(p.FLASH);
info!("Reading..."); info!("Reading...");
let mut buf = [0u8; 32]; let mut buf = [0u8; 32];

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32l0-examples" name = "embassy-stm32l0-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[features] [features]
default = ["nightly"] default = ["nightly"]

View File

@ -15,7 +15,7 @@ async fn main(_spawner: Spawner) {
const ADDR: u32 = 0x26000; const ADDR: u32 = 0x26000;
let mut f = Flash::unlock(p.FLASH); let mut f = Flash::new(p.FLASH);
info!("Reading..."); info!("Reading...");
let mut buf = [0u8; 8]; let mut buf = [0u8; 8];

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32l1-examples" name = "embassy-stm32l1-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] }

View File

@ -15,7 +15,7 @@ async fn main(_spawner: Spawner) {
const ADDR: u32 = 0x26000; const ADDR: u32 = 0x26000;
let mut f = Flash::unlock(p.FLASH); let mut f = Flash::new(p.FLASH);
info!("Reading..."); info!("Reading...");
let mut buf = [0u8; 8]; let mut buf = [0u8; 8];

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32l4-examples" name = "embassy-stm32l4-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[features] [features]

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32l5-examples" name = "embassy-stm32l5-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[features] [features]

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32u5-examples" name = "embassy-stm32u5-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] }

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32wb-examples" name = "embassy-stm32wb-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] }

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32wl-examples" name = "embassy-stm32wl-examples"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] }

View File

@ -15,7 +15,7 @@ async fn main(_spawner: Spawner) {
const ADDR: u32 = 0x36000; const ADDR: u32 = 0x36000;
let mut f = Flash::unlock(p.FLASH); let mut f = Flash::new(p.FLASH);
info!("Reading..."); info!("Reading...");
let mut buf = [0u8; 8]; let mut buf = [0u8; 8];

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-wasm-example" name = "embassy-wasm-example"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[lib] [lib]
crate-type = ["cdylib"] crate-type = ["cdylib"]

View File

@ -2,6 +2,7 @@
name = "gen_features" name = "gen_features"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@ -2,6 +2,7 @@
name = "stm32-metapac-gen" name = "stm32-metapac-gen"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-rp-tests" name = "embassy-rp-tests"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] } embassy-sync = { version = "0.1.0", path = "../../embassy-sync", features = ["defmt"] }

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "embassy-stm32-tests" name = "embassy-stm32-tests"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[features] [features]
stm32f103c8 = ["embassy-stm32/stm32f103c8"] # Blue Pill stm32f103c8 = ["embassy-stm32/stm32f103c8"] # Blue Pill

View File

@ -2,6 +2,7 @@
edition = "2021" edition = "2021"
name = "xtask" name = "xtask"
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
anyhow = "1.0.43" anyhow = "1.0.43"