commit
86132b5fc9
8
.github/workflows/rust.yml
vendored
8
.github/workflows/rust.yml
vendored
@ -57,6 +57,14 @@ jobs:
|
|||||||
features: nrf52840,defmt
|
features: nrf52840,defmt
|
||||||
- package: embassy-rp-examples
|
- package: embassy-rp-examples
|
||||||
target: thumbv6m-none-eabi
|
target: thumbv6m-none-eabi
|
||||||
|
- package: embassy-stm32
|
||||||
|
target: thumbv7em-none-eabi
|
||||||
|
features: stm32f411ce
|
||||||
|
- package: embassy-stm32
|
||||||
|
target: thumbv7em-none-eabi
|
||||||
|
features: stm32f429zi
|
||||||
|
- package: embassy-stm32-examples
|
||||||
|
target: thumbv7em-none-eabi
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
@ -153,7 +153,9 @@ impl_pin!(P0_30, 0, 30);
|
|||||||
impl_pin!(P0_31, 0, 31);
|
impl_pin!(P0_31, 0, 31);
|
||||||
|
|
||||||
pub mod irqs {
|
pub mod irqs {
|
||||||
|
use crate::pac::Interrupt as InterruptEnum;
|
||||||
use embassy_macros::interrupt_declare as declare;
|
use embassy_macros::interrupt_declare as declare;
|
||||||
|
|
||||||
declare!(POWER_CLOCK);
|
declare!(POWER_CLOCK);
|
||||||
declare!(RADIO);
|
declare!(RADIO);
|
||||||
declare!(UARTE0_UART0);
|
declare!(UARTE0_UART0);
|
||||||
|
@ -158,7 +158,9 @@ impl_pin!(P0_30, 0, 30);
|
|||||||
impl_pin!(P0_31, 0, 31);
|
impl_pin!(P0_31, 0, 31);
|
||||||
|
|
||||||
pub mod irqs {
|
pub mod irqs {
|
||||||
|
use crate::pac::Interrupt as InterruptEnum;
|
||||||
use embassy_macros::interrupt_declare as declare;
|
use embassy_macros::interrupt_declare as declare;
|
||||||
|
|
||||||
declare!(POWER_CLOCK);
|
declare!(POWER_CLOCK);
|
||||||
declare!(RADIO);
|
declare!(RADIO);
|
||||||
declare!(UARTE0_UART0);
|
declare!(UARTE0_UART0);
|
||||||
|
@ -159,7 +159,9 @@ impl_pin!(P0_30, 0, 30);
|
|||||||
impl_pin!(P0_31, 0, 31);
|
impl_pin!(P0_31, 0, 31);
|
||||||
|
|
||||||
pub mod irqs {
|
pub mod irqs {
|
||||||
|
use crate::pac::Interrupt as InterruptEnum;
|
||||||
use embassy_macros::interrupt_declare as declare;
|
use embassy_macros::interrupt_declare as declare;
|
||||||
|
|
||||||
declare!(POWER_CLOCK);
|
declare!(POWER_CLOCK);
|
||||||
declare!(RADIO);
|
declare!(RADIO);
|
||||||
declare!(UARTE0_UART0);
|
declare!(UARTE0_UART0);
|
||||||
|
@ -157,7 +157,9 @@ impl_pin!(P0_30, 0, 30);
|
|||||||
impl_pin!(P0_31, 0, 31);
|
impl_pin!(P0_31, 0, 31);
|
||||||
|
|
||||||
pub mod irqs {
|
pub mod irqs {
|
||||||
|
use crate::pac::Interrupt as InterruptEnum;
|
||||||
use embassy_macros::interrupt_declare as declare;
|
use embassy_macros::interrupt_declare as declare;
|
||||||
|
|
||||||
declare!(POWER_CLOCK);
|
declare!(POWER_CLOCK);
|
||||||
declare!(RADIO);
|
declare!(RADIO);
|
||||||
declare!(UARTE0_UART0);
|
declare!(UARTE0_UART0);
|
||||||
|
@ -172,7 +172,9 @@ impl_pin!(P0_30, 0, 30);
|
|||||||
impl_pin!(P0_31, 0, 31);
|
impl_pin!(P0_31, 0, 31);
|
||||||
|
|
||||||
pub mod irqs {
|
pub mod irqs {
|
||||||
|
use crate::pac::Interrupt as InterruptEnum;
|
||||||
use embassy_macros::interrupt_declare as declare;
|
use embassy_macros::interrupt_declare as declare;
|
||||||
|
|
||||||
declare!(POWER_CLOCK);
|
declare!(POWER_CLOCK);
|
||||||
declare!(RADIO);
|
declare!(RADIO);
|
||||||
declare!(UARTE0_UART0);
|
declare!(UARTE0_UART0);
|
||||||
|
@ -212,7 +212,9 @@ impl_pin!(P1_14, 1, 14);
|
|||||||
impl_pin!(P1_15, 1, 15);
|
impl_pin!(P1_15, 1, 15);
|
||||||
|
|
||||||
pub mod irqs {
|
pub mod irqs {
|
||||||
|
use crate::pac::Interrupt as InterruptEnum;
|
||||||
use embassy_macros::interrupt_declare as declare;
|
use embassy_macros::interrupt_declare as declare;
|
||||||
|
|
||||||
declare!(POWER_CLOCK);
|
declare!(POWER_CLOCK);
|
||||||
declare!(RADIO);
|
declare!(RADIO);
|
||||||
declare!(UARTE0_UART0);
|
declare!(UARTE0_UART0);
|
||||||
|
@ -217,7 +217,9 @@ impl_pin!(P1_14, 1, 14);
|
|||||||
impl_pin!(P1_15, 1, 15);
|
impl_pin!(P1_15, 1, 15);
|
||||||
|
|
||||||
pub mod irqs {
|
pub mod irqs {
|
||||||
|
use crate::pac::Interrupt as InterruptEnum;
|
||||||
use embassy_macros::interrupt_declare as declare;
|
use embassy_macros::interrupt_declare as declare;
|
||||||
|
|
||||||
declare!(POWER_CLOCK);
|
declare!(POWER_CLOCK);
|
||||||
declare!(RADIO);
|
declare!(RADIO);
|
||||||
declare!(UARTE0_UART0);
|
declare!(UARTE0_UART0);
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
use core::sync::atomic::{compiler_fence, Ordering};
|
use core::sync::atomic::{compiler_fence, Ordering};
|
||||||
|
|
||||||
use defmt::{assert, *};
|
use crate::fmt::{assert, *};
|
||||||
|
use crate::pac::dma::vals;
|
||||||
use crate::{pac, peripherals};
|
use crate::{pac, peripherals};
|
||||||
use pac::dma::vals;
|
|
||||||
|
|
||||||
pub struct Dma<T: Channel> {
|
pub struct Dma<T: Channel> {
|
||||||
inner: T,
|
inner: T,
|
||||||
|
@ -9,6 +9,7 @@ pub use embassy_extras::interrupt::Priority3 as Priority;
|
|||||||
|
|
||||||
mod irqs {
|
mod irqs {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use crate::pac::Interrupt as InterruptEnum;
|
||||||
|
|
||||||
declare!(TIMER_IRQ_0);
|
declare!(TIMER_IRQ_0);
|
||||||
declare!(TIMER_IRQ_1);
|
declare!(TIMER_IRQ_1);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use core::ops::Deref;
|
use core::ops::Deref;
|
||||||
use defmt::{assert, *};
|
|
||||||
|
|
||||||
|
use crate::fmt::{assert, *};
|
||||||
use crate::pac;
|
use crate::pac;
|
||||||
|
|
||||||
const XOSC_MHZ: u32 = 12;
|
const XOSC_MHZ: u32 = 12;
|
||||||
|
17
embassy-stm32-examples/src/example_common.rs
Normal file
17
embassy-stm32-examples/src/example_common.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#![macro_use]
|
||||||
|
|
||||||
|
use defmt_rtt as _; // global logger
|
||||||
|
use panic_probe as _;
|
||||||
|
|
||||||
|
pub use defmt::*;
|
||||||
|
|
||||||
|
use core::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
|
||||||
|
defmt::timestamp! {"{=u64}", {
|
||||||
|
static COUNT: AtomicUsize = AtomicUsize::new(0);
|
||||||
|
// NOTE(no-CAS) `timestamps` runs with interrupts disabled
|
||||||
|
let n = COUNT.load(Ordering::Relaxed);
|
||||||
|
COUNT.store(n + 1, Ordering::Relaxed);
|
||||||
|
n as u64
|
||||||
|
}
|
||||||
|
}
|
@ -19,6 +19,7 @@ futures = { version = "0.3.5", default-features = false, features = ["async-awai
|
|||||||
rand_core = { version = "0.6.2", optional = true }
|
rand_core = { version = "0.6.2", optional = true }
|
||||||
sdio-host = { version = "0.5.0", optional = true }
|
sdio-host = { version = "0.5.0", optional = true }
|
||||||
embedded-sdmmc = { git = "https://github.com/thalesfragoso/embedded-sdmmc-rs", branch = "async", optional = true }
|
embedded-sdmmc = { git = "https://github.com/thalesfragoso/embedded-sdmmc-rs", branch = "async", optional = true }
|
||||||
|
critical-section = "0.2.1"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
regex = "1.4.6"
|
regex = "1.4.6"
|
||||||
|
114
embassy-stm32/src/fmt.rs
Normal file
114
embassy-stm32/src/fmt.rs
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
#![macro_use]
|
||||||
|
#![allow(clippy::module_inception)]
|
||||||
|
#![allow(unused)]
|
||||||
|
|
||||||
|
#[cfg(all(feature = "defmt", feature = "log"))]
|
||||||
|
compile_error!("You may not enable both `defmt` and `log` features.");
|
||||||
|
|
||||||
|
pub use fmt::*;
|
||||||
|
|
||||||
|
#[cfg(feature = "defmt")]
|
||||||
|
mod fmt {
|
||||||
|
pub use defmt::{
|
||||||
|
assert, assert_eq, assert_ne, debug, debug_assert, debug_assert_eq, debug_assert_ne, error,
|
||||||
|
info, panic, todo, trace, unreachable, unwrap, warn,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "log")]
|
||||||
|
mod fmt {
|
||||||
|
pub use core::{
|
||||||
|
assert, assert_eq, assert_ne, debug_assert, debug_assert_eq, debug_assert_ne, panic, todo,
|
||||||
|
unreachable,
|
||||||
|
};
|
||||||
|
pub use log::{debug, error, info, trace, warn};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(any(feature = "defmt", feature = "log")))]
|
||||||
|
mod fmt {
|
||||||
|
#![macro_use]
|
||||||
|
|
||||||
|
pub use core::{
|
||||||
|
assert, assert_eq, assert_ne, debug_assert, debug_assert_eq, debug_assert_ne, panic, todo,
|
||||||
|
unreachable,
|
||||||
|
};
|
||||||
|
|
||||||
|
macro_rules! trace {
|
||||||
|
($($msg:expr),+ $(,)?) => {
|
||||||
|
()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! debug {
|
||||||
|
($($msg:expr),+ $(,)?) => {
|
||||||
|
()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! info {
|
||||||
|
($($msg:expr),+ $(,)?) => {
|
||||||
|
()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! warn {
|
||||||
|
($($msg:expr),+ $(,)?) => {
|
||||||
|
()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! error {
|
||||||
|
($($msg:expr),+ $(,)?) => {
|
||||||
|
()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(feature = "defmt"))]
|
||||||
|
macro_rules! unwrap {
|
||||||
|
($arg:expr) => {
|
||||||
|
match $crate::fmt::Try::into_result($arg) {
|
||||||
|
::core::result::Result::Ok(t) => t,
|
||||||
|
::core::result::Result::Err(e) => {
|
||||||
|
::core::panic!("unwrap of `{}` failed: {:?}", ::core::stringify!($arg), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
($arg:expr, $($msg:expr),+ $(,)? ) => {
|
||||||
|
match $crate::fmt::Try::into_result($arg) {
|
||||||
|
::core::result::Result::Ok(t) => t,
|
||||||
|
::core::result::Result::Err(e) => {
|
||||||
|
::core::panic!("unwrap of `{}` failed: {}: {:?}", ::core::stringify!($arg), ::core::format_args!($($msg,)*), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
||||||
|
pub struct NoneError;
|
||||||
|
|
||||||
|
pub trait Try {
|
||||||
|
type Ok;
|
||||||
|
type Error;
|
||||||
|
fn into_result(self) -> Result<Self::Ok, Self::Error>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Try for Option<T> {
|
||||||
|
type Ok = T;
|
||||||
|
type Error = NoneError;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn into_result(self) -> Result<T, NoneError> {
|
||||||
|
self.ok_or(NoneError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T, E> Try for Result<T, E> {
|
||||||
|
type Ok = T;
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn into_result(self) -> Self {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
@ -103,7 +103,11 @@ impl<'d, T: Instance> Uart<'d, T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "_dma_v2")]
|
#[cfg(feature = "_dma_v2")]
|
||||||
pub async fn write_dma(&mut self, ch: &mut impl crate::dma::Channel, buffer: &[u8]) -> Result<(), Error> {
|
pub async fn write_dma(
|
||||||
|
&mut self,
|
||||||
|
ch: &mut impl crate::dma::Channel,
|
||||||
|
buffer: &[u8],
|
||||||
|
) -> Result<(), Error> {
|
||||||
let ch_func = 4; // USART3_TX
|
let ch_func = 4; // USART3_TX
|
||||||
let r = self.inner.regs();
|
let r = self.inner.regs();
|
||||||
|
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
|
@ -11,6 +11,6 @@ pub mod delay;
|
|||||||
pub mod flash;
|
pub mod flash;
|
||||||
pub mod gpio;
|
pub mod gpio;
|
||||||
pub mod i2c;
|
pub mod i2c;
|
||||||
|
pub mod rng;
|
||||||
pub mod spi;
|
pub mod spi;
|
||||||
pub mod uart;
|
pub mod uart;
|
||||||
pub mod rng;
|
|
||||||
|
Loading…
Reference in New Issue
Block a user