stm32/usart: remove DMA generic params.
This commit is contained in:
parent
524c24c8b3
commit
d6b1233f16
17 changed files with 574 additions and 411 deletions
|
@ -82,12 +82,12 @@ macro_rules! new_dma {
|
|||
}
|
||||
|
||||
macro_rules! new_pin {
|
||||
($name:ident, $aftype:expr, $speed:expr) => {{
|
||||
let pin = $name.into_ref();
|
||||
pin.set_as_af(pin.af_num(), $aftype);
|
||||
pin.set_speed($speed);
|
||||
Some(pin.map_into())
|
||||
($name:ident, $aftype:expr) => {{
|
||||
new_pin!($name, $aftype, crate::gpio::Speed::Medium, crate::gpio::Pull::None)
|
||||
}};
|
||||
($name:ident, $aftype:expr, $speed:expr) => {
|
||||
new_pin!($name, $aftype, $speed, crate::gpio::Pull::None)
|
||||
};
|
||||
($name:ident, $aftype:expr, $speed:expr, $pull:expr) => {{
|
||||
let pin = $name.into_ref();
|
||||
pin.set_as_af_pull(pin.af_num(), $aftype, $pull);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,21 +1,22 @@
|
|||
use core::future::poll_fn;
|
||||
use core::marker::PhantomData;
|
||||
use core::mem;
|
||||
use core::sync::atomic::{compiler_fence, Ordering};
|
||||
use core::task::Poll;
|
||||
|
||||
use embassy_embedded_hal::SetConfig;
|
||||
use embassy_hal_internal::PeripheralRef;
|
||||
use futures::future::{select, Either};
|
||||
|
||||
use super::{clear_interrupt_flags, rdr, reconfigure, sr, BasicInstance, Config, ConfigError, Error, UartRx};
|
||||
use crate::dma::ReadableRingBuffer;
|
||||
use crate::mode::Async;
|
||||
use crate::usart::{Regs, Sr};
|
||||
|
||||
/// Rx-only Ring-buffered UART Driver
|
||||
///
|
||||
/// Created with [UartRx::into_ring_buffered]
|
||||
pub struct RingBufferedUartRx<'d, T: BasicInstance> {
|
||||
_peri: PeripheralRef<'d, T>,
|
||||
_phantom: PhantomData<T>,
|
||||
ring_buf: ReadableRingBuffer<'d, u8>,
|
||||
}
|
||||
|
||||
|
@ -28,26 +29,29 @@ impl<'d, T: BasicInstance> SetConfig for RingBufferedUartRx<'d, T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'d, T: BasicInstance, RxDma: super::RxDma<T>> UartRx<'d, T, RxDma> {
|
||||
impl<'d, T: BasicInstance> UartRx<'d, T, Async> {
|
||||
/// Turn the `UartRx` into a buffered uart which can continously receive in the background
|
||||
/// without the possibility of losing bytes. The `dma_buf` is a buffer registered to the
|
||||
/// DMA controller, and must be large enough to prevent overflows.
|
||||
pub fn into_ring_buffered(self, dma_buf: &'d mut [u8]) -> RingBufferedUartRx<'d, T> {
|
||||
pub fn into_ring_buffered(mut self, dma_buf: &'d mut [u8]) -> RingBufferedUartRx<'d, T> {
|
||||
assert!(!dma_buf.is_empty() && dma_buf.len() <= 0xFFFF);
|
||||
|
||||
let request = self.rx_dma.request();
|
||||
let opts = Default::default();
|
||||
|
||||
// Safety: we forget the struct before this function returns.
|
||||
let rx_dma = unsafe { self.rx_dma.clone_unchecked() };
|
||||
let _peri = unsafe { self._peri.clone_unchecked() };
|
||||
let rx_dma = self.rx_dma.as_mut().unwrap();
|
||||
let request = rx_dma.request;
|
||||
let rx_dma = unsafe { rx_dma.channel.clone_unchecked() };
|
||||
|
||||
let ring_buf = unsafe { ReadableRingBuffer::new(rx_dma, request, rdr(T::regs()), dma_buf, opts) };
|
||||
|
||||
// Don't disable the clock
|
||||
mem::forget(self);
|
||||
|
||||
RingBufferedUartRx { _peri, ring_buf }
|
||||
RingBufferedUartRx {
|
||||
_phantom: PhantomData,
|
||||
ring_buf,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ use core::fmt::Write;
|
|||
|
||||
use defmt::*;
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::usart::{Config, Uart};
|
||||
use embassy_stm32::{bind_interrupts, peripherals, usart};
|
||||
use heapless::String;
|
||||
|
@ -21,7 +20,7 @@ async fn main(_spawner: Spawner) {
|
|||
info!("Hello World!");
|
||||
|
||||
let config = Config::default();
|
||||
let mut usart = Uart::new(p.USART1, p.PE1, p.PE0, Irqs, p.DMA1_CH4, NoDma, config).unwrap();
|
||||
let mut usart = Uart::new(p.USART1, p.PE1, p.PE0, Irqs, p.DMA1_CH4, p.DMA1_CH5, config).unwrap();
|
||||
|
||||
for n in 0u32.. {
|
||||
let mut s: String<128> = String::new();
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
|
||||
use cortex_m_rt::entry;
|
||||
use defmt::*;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::usart::{Config, Uart};
|
||||
use embassy_stm32::{bind_interrupts, peripherals, usart};
|
||||
use {defmt_rtt as _, panic_probe as _};
|
||||
|
@ -19,7 +18,7 @@ fn main() -> ! {
|
|||
let p = embassy_stm32::init(Default::default());
|
||||
|
||||
let config = Config::default();
|
||||
let mut usart = Uart::new(p.USART3, p.PD9, p.PD8, Irqs, NoDma, NoDma, config).unwrap();
|
||||
let mut usart = Uart::new_blocking(p.USART3, p.PD9, p.PD8, config).unwrap();
|
||||
|
||||
unwrap!(usart.blocking_write(b"Hello Embassy World!\r\n"));
|
||||
info!("wrote Hello, starting echo");
|
||||
|
|
|
@ -5,7 +5,6 @@ use core::fmt::Write;
|
|||
|
||||
use defmt::*;
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::usart::{Config, Uart};
|
||||
use embassy_stm32::{bind_interrupts, peripherals, usart};
|
||||
use heapless::String;
|
||||
|
@ -21,7 +20,7 @@ async fn main(_spawner: Spawner) {
|
|||
info!("Hello World!");
|
||||
|
||||
let config = Config::default();
|
||||
let mut usart = Uart::new(p.USART3, p.PD9, p.PD8, Irqs, p.DMA1_CH3, NoDma, config).unwrap();
|
||||
let mut usart = Uart::new(p.USART3, p.PD9, p.PD8, Irqs, p.DMA1_CH3, p.DMA1_CH1, config).unwrap();
|
||||
|
||||
for n in 0u32.. {
|
||||
let mut s: String<128> = String::new();
|
||||
|
|
|
@ -5,7 +5,6 @@ use core::fmt::Write;
|
|||
|
||||
use defmt::*;
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::usart::{Config, Uart};
|
||||
use embassy_stm32::{bind_interrupts, peripherals, usart};
|
||||
use heapless::String;
|
||||
|
@ -19,7 +18,7 @@ bind_interrupts!(struct Irqs {
|
|||
async fn main(_spawner: Spawner) {
|
||||
let p = embassy_stm32::init(Default::default());
|
||||
let config = Config::default();
|
||||
let mut usart = Uart::new(p.UART7, p.PA8, p.PA15, Irqs, p.DMA1_CH1, NoDma, config).unwrap();
|
||||
let mut usart = Uart::new(p.UART7, p.PA8, p.PA15, Irqs, p.DMA1_CH1, p.DMA1_CH3, config).unwrap();
|
||||
|
||||
for n in 0u32.. {
|
||||
let mut s: String<128> = String::new();
|
||||
|
|
|
@ -4,22 +4,16 @@
|
|||
use cortex_m_rt::entry;
|
||||
use defmt::*;
|
||||
use embassy_executor::Executor;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::usart::{Config, Uart};
|
||||
use embassy_stm32::{bind_interrupts, peripherals, usart};
|
||||
use static_cell::StaticCell;
|
||||
use {defmt_rtt as _, panic_probe as _};
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
UART7 => usart::InterruptHandler<peripherals::UART7>;
|
||||
});
|
||||
|
||||
#[embassy_executor::task]
|
||||
async fn main_task() {
|
||||
let p = embassy_stm32::init(Default::default());
|
||||
|
||||
let config = Config::default();
|
||||
let mut usart = Uart::new(p.UART7, p.PF6, p.PF7, Irqs, NoDma, NoDma, config).unwrap();
|
||||
let mut usart = Uart::new_blocking(p.UART7, p.PF6, p.PF7, config).unwrap();
|
||||
|
||||
unwrap!(usart.blocking_write(b"Hello Embassy World!\r\n"));
|
||||
info!("wrote Hello, starting echo");
|
||||
|
|
|
@ -6,7 +6,6 @@ use core::fmt::Write;
|
|||
use cortex_m_rt::entry;
|
||||
use defmt::*;
|
||||
use embassy_executor::Executor;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::usart::{Config, Uart};
|
||||
use embassy_stm32::{bind_interrupts, peripherals, usart};
|
||||
use heapless::String;
|
||||
|
@ -22,7 +21,7 @@ async fn main_task() {
|
|||
let p = embassy_stm32::init(Default::default());
|
||||
|
||||
let config = Config::default();
|
||||
let mut usart = Uart::new(p.UART7, p.PF6, p.PF7, Irqs, p.GPDMA1_CH0, NoDma, config).unwrap();
|
||||
let mut usart = Uart::new(p.UART7, p.PF6, p.PF7, Irqs, p.GPDMA1_CH0, p.GPDMA1_CH1, config).unwrap();
|
||||
|
||||
for n in 0u32.. {
|
||||
let mut s: String<128> = String::new();
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
|
||||
use defmt::*;
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::peripherals::{GPDMA1_CH1, UART7};
|
||||
use embassy_stm32::mode::Async;
|
||||
use embassy_stm32::peripherals::UART7;
|
||||
use embassy_stm32::usart::{Config, Uart, UartRx};
|
||||
use embassy_stm32::{bind_interrupts, peripherals, usart};
|
||||
use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex;
|
||||
|
@ -15,18 +15,6 @@ bind_interrupts!(struct Irqs {
|
|||
UART7 => usart::InterruptHandler<peripherals::UART7>;
|
||||
});
|
||||
|
||||
#[embassy_executor::task]
|
||||
async fn writer(mut usart: Uart<'static, UART7, NoDma, NoDma>) {
|
||||
unwrap!(usart.blocking_write(b"Hello Embassy World!\r\n"));
|
||||
info!("wrote Hello, starting echo");
|
||||
|
||||
let mut buf = [0u8; 1];
|
||||
loop {
|
||||
unwrap!(usart.blocking_read(&mut buf));
|
||||
unwrap!(usart.blocking_write(&buf));
|
||||
}
|
||||
}
|
||||
|
||||
static CHANNEL: Channel<ThreadModeRawMutex, [u8; 8], 1> = Channel::new();
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -50,7 +38,7 @@ async fn main(spawner: Spawner) -> ! {
|
|||
}
|
||||
|
||||
#[embassy_executor::task]
|
||||
async fn reader(mut rx: UartRx<'static, UART7, GPDMA1_CH1>) {
|
||||
async fn reader(mut rx: UartRx<'static, UART7, Async>) {
|
||||
let mut buf = [0; 8];
|
||||
loop {
|
||||
info!("reading...");
|
||||
|
|
|
@ -4,22 +4,16 @@
|
|||
use cortex_m_rt::entry;
|
||||
use defmt::*;
|
||||
use embassy_executor::Executor;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::usart::{Config, Uart};
|
||||
use embassy_stm32::{bind_interrupts, peripherals, usart};
|
||||
use static_cell::StaticCell;
|
||||
use {defmt_rtt as _, panic_probe as _};
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
UART7 => usart::InterruptHandler<peripherals::UART7>;
|
||||
});
|
||||
|
||||
#[embassy_executor::task]
|
||||
async fn main_task() {
|
||||
let p = embassy_stm32::init(Default::default());
|
||||
|
||||
let config = Config::default();
|
||||
let mut usart = Uart::new(p.UART7, p.PF6, p.PF7, Irqs, NoDma, NoDma, config).unwrap();
|
||||
let mut usart = Uart::new_blocking(p.UART7, p.PF6, p.PF7, config).unwrap();
|
||||
|
||||
unwrap!(usart.blocking_write(b"Hello Embassy World!\r\n"));
|
||||
info!("wrote Hello, starting echo");
|
||||
|
|
|
@ -6,7 +6,6 @@ use core::fmt::Write;
|
|||
use cortex_m_rt::entry;
|
||||
use defmt::*;
|
||||
use embassy_executor::Executor;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::usart::{Config, Uart};
|
||||
use embassy_stm32::{bind_interrupts, peripherals, usart};
|
||||
use heapless::String;
|
||||
|
@ -22,7 +21,7 @@ async fn main_task() {
|
|||
let p = embassy_stm32::init(Default::default());
|
||||
|
||||
let config = Config::default();
|
||||
let mut usart = Uart::new(p.UART7, p.PF6, p.PF7, Irqs, p.DMA1_CH0, NoDma, config).unwrap();
|
||||
let mut usart = Uart::new(p.UART7, p.PF6, p.PF7, Irqs, p.DMA1_CH0, p.DMA1_CH1, config).unwrap();
|
||||
|
||||
for n in 0u32.. {
|
||||
let mut s: String<128> = String::new();
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
|
||||
use defmt::*;
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::peripherals::{DMA1_CH1, UART7};
|
||||
use embassy_stm32::mode::Async;
|
||||
use embassy_stm32::peripherals::UART7;
|
||||
use embassy_stm32::usart::{Config, Uart, UartRx};
|
||||
use embassy_stm32::{bind_interrupts, peripherals, usart};
|
||||
use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex;
|
||||
|
@ -15,18 +15,6 @@ bind_interrupts!(struct Irqs {
|
|||
UART7 => usart::InterruptHandler<peripherals::UART7>;
|
||||
});
|
||||
|
||||
#[embassy_executor::task]
|
||||
async fn writer(mut usart: Uart<'static, UART7, NoDma, NoDma>) {
|
||||
unwrap!(usart.blocking_write(b"Hello Embassy World!\r\n"));
|
||||
info!("wrote Hello, starting echo");
|
||||
|
||||
let mut buf = [0u8; 1];
|
||||
loop {
|
||||
unwrap!(usart.blocking_read(&mut buf));
|
||||
unwrap!(usart.blocking_write(&buf));
|
||||
}
|
||||
}
|
||||
|
||||
static CHANNEL: Channel<ThreadModeRawMutex, [u8; 8], 1> = Channel::new();
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -50,7 +38,7 @@ async fn main(spawner: Spawner) -> ! {
|
|||
}
|
||||
|
||||
#[embassy_executor::task]
|
||||
async fn reader(mut rx: UartRx<'static, UART7, DMA1_CH1>) {
|
||||
async fn reader(mut rx: UartRx<'static, UART7, Async>) {
|
||||
let mut buf = [0; 8];
|
||||
loop {
|
||||
info!("reading...");
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
#![no_main]
|
||||
|
||||
use defmt::*;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::usart::{Config, Uart};
|
||||
use embassy_stm32::{bind_interrupts, peripherals, usart};
|
||||
use {defmt_rtt as _, panic_probe as _};
|
||||
|
@ -18,7 +17,7 @@ fn main() -> ! {
|
|||
let p = embassy_stm32::init(Default::default());
|
||||
|
||||
let config = Config::default();
|
||||
let mut usart = Uart::new(p.UART4, p.PA1, p.PA0, Irqs, NoDma, NoDma, config).unwrap();
|
||||
let mut usart = Uart::new_blocking(p.UART4, p.PA1, p.PA0, config).unwrap();
|
||||
|
||||
unwrap!(usart.blocking_write(b"Hello Embassy World!\r\n"));
|
||||
info!("wrote Hello, starting echo");
|
||||
|
|
|
@ -5,7 +5,6 @@ use core::fmt::Write;
|
|||
|
||||
use defmt::*;
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::usart::{Config, Uart};
|
||||
use embassy_stm32::{bind_interrupts, peripherals, usart};
|
||||
use heapless::String;
|
||||
|
@ -21,7 +20,7 @@ async fn main(_spawner: Spawner) {
|
|||
info!("Hello World!");
|
||||
|
||||
let config = Config::default();
|
||||
let mut usart = Uart::new(p.UART4, p.PA1, p.PA0, Irqs, p.DMA1_CH3, NoDma, config).unwrap();
|
||||
let mut usart = Uart::new(p.UART4, p.PA1, p.PA0, Irqs, p.DMA1_CH3, p.DMA1_CH4, config).unwrap();
|
||||
|
||||
for n in 0u32.. {
|
||||
let mut s: String<128> = String::new();
|
||||
|
|
|
@ -6,7 +6,6 @@ mod common;
|
|||
use common::*;
|
||||
use defmt::{assert, assert_eq, unreachable};
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_stm32::dma::NoDma;
|
||||
use embassy_stm32::usart::{Config, ConfigError, Error, Uart};
|
||||
use embassy_time::{block_for, Duration, Instant};
|
||||
|
||||
|
@ -20,11 +19,10 @@ async fn main(_spawner: Spawner) {
|
|||
let mut usart = peri!(p, UART);
|
||||
let mut rx = peri!(p, UART_RX);
|
||||
let mut tx = peri!(p, UART_TX);
|
||||
let irq = irqs!(UART);
|
||||
|
||||
{
|
||||
let config = Config::default();
|
||||
let mut usart = Uart::new(&mut usart, &mut rx, &mut tx, irq, NoDma, NoDma, config).unwrap();
|
||||
let mut usart = Uart::new_blocking(&mut usart, &mut rx, &mut tx, config).unwrap();
|
||||
|
||||
// We can't send too many bytes, they have to fit in the FIFO.
|
||||
// This is because we aren't sending+receiving at the same time.
|
||||
|
@ -40,7 +38,7 @@ async fn main(_spawner: Spawner) {
|
|||
// Test error handling with with an overflow error
|
||||
{
|
||||
let config = Config::default();
|
||||
let mut usart = Uart::new(&mut usart, &mut rx, &mut tx, irq, NoDma, NoDma, config).unwrap();
|
||||
let mut usart = Uart::new_blocking(&mut usart, &mut rx, &mut tx, config).unwrap();
|
||||
|
||||
// Send enough bytes to fill the RX FIFOs off all USART versions.
|
||||
let data = [0; 64];
|
||||
|
@ -70,7 +68,7 @@ async fn main(_spawner: Spawner) {
|
|||
|
||||
let mut config = Config::default();
|
||||
config.baudrate = baudrate;
|
||||
let mut usart = match Uart::new(&mut usart, &mut rx, &mut tx, irq, NoDma, NoDma, config) {
|
||||
let mut usart = match Uart::new_blocking(&mut usart, &mut rx, &mut tx, config) {
|
||||
Ok(x) => x,
|
||||
Err(ConfigError::BaudrateTooHigh) => {
|
||||
info!("baudrate too high");
|
||||
|
|
|
@ -8,6 +8,7 @@ mod common;
|
|||
use common::*;
|
||||
use defmt::{assert_eq, panic};
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_stm32::mode::Async;
|
||||
use embassy_stm32::usart::{Config, DataBits, Parity, RingBufferedUartRx, StopBits, Uart, UartTx};
|
||||
use embassy_time::Timer;
|
||||
use rand_chacha::ChaCha8Rng;
|
||||
|
@ -51,7 +52,7 @@ async fn main(spawner: Spawner) {
|
|||
}
|
||||
|
||||
#[embassy_executor::task]
|
||||
async fn transmit_task(mut tx: UartTx<'static, peris::UART, peris::UART_TX_DMA>) {
|
||||
async fn transmit_task(mut tx: UartTx<'static, peris::UART, Async>) {
|
||||
// workaround https://github.com/embassy-rs/embassy/issues/1426
|
||||
Timer::after_millis(100).await;
|
||||
|
||||
|
|
Loading…
Reference in a new issue