2021-05-06 03:59:16 +02:00
|
|
|
#![macro_use]
|
|
|
|
|
2021-07-01 17:37:01 +02:00
|
|
|
#[cfg_attr(usart_v1, path = "v1.rs")]
|
|
|
|
#[cfg_attr(usart_v2, path = "v2.rs")]
|
2021-05-17 02:04:51 +02:00
|
|
|
mod _version;
|
2021-07-15 05:42:06 +02:00
|
|
|
use crate::{dma, peripherals};
|
2021-05-17 02:04:51 +02:00
|
|
|
pub use _version::*;
|
2021-04-14 15:34:58 +02:00
|
|
|
|
2021-05-15 03:52:58 +02:00
|
|
|
use crate::gpio::Pin;
|
2021-06-29 16:59:22 +02:00
|
|
|
use crate::rcc::RccPeripheral;
|
2021-04-14 15:34:58 +02:00
|
|
|
|
2021-06-30 20:37:35 +02:00
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
|
|
|
pub enum DataBits {
|
|
|
|
DataBits8,
|
|
|
|
DataBits9,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
|
|
|
pub enum Parity {
|
|
|
|
ParityNone,
|
|
|
|
ParityEven,
|
|
|
|
ParityOdd,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
|
|
|
pub enum StopBits {
|
|
|
|
#[doc = "1 stop bit"]
|
|
|
|
STOP1,
|
|
|
|
#[doc = "0.5 stop bits"]
|
|
|
|
STOP0P5,
|
|
|
|
#[doc = "2 stop bits"]
|
|
|
|
STOP2,
|
|
|
|
#[doc = "1.5 stop bits"]
|
|
|
|
STOP1P5,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[non_exhaustive]
|
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
|
|
|
pub struct Config {
|
|
|
|
pub baudrate: u32,
|
|
|
|
pub data_bits: DataBits,
|
|
|
|
pub stop_bits: StopBits,
|
|
|
|
pub parity: Parity,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for Config {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self {
|
|
|
|
baudrate: 115200,
|
|
|
|
data_bits: DataBits::DataBits8,
|
|
|
|
stop_bits: StopBits::STOP1,
|
|
|
|
parity: Parity::ParityNone,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-15 03:52:58 +02:00
|
|
|
/// Serial error
|
|
|
|
#[derive(Debug, Eq, PartialEq, Copy, Clone)]
|
2021-07-04 23:34:37 +02:00
|
|
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
2021-04-14 15:34:58 +02:00
|
|
|
#[non_exhaustive]
|
2021-05-15 03:52:58 +02:00
|
|
|
pub enum Error {
|
|
|
|
/// Framing error
|
|
|
|
Framing,
|
|
|
|
/// Noise error
|
|
|
|
Noise,
|
|
|
|
/// RX buffer overrun
|
|
|
|
Overrun,
|
|
|
|
/// Parity check error
|
|
|
|
Parity,
|
2021-04-14 15:34:58 +02:00
|
|
|
}
|
|
|
|
|
2021-04-25 22:35:51 +02:00
|
|
|
pub(crate) mod sealed {
|
|
|
|
use super::*;
|
2021-06-29 19:00:52 +02:00
|
|
|
|
2021-04-25 22:35:51 +02:00
|
|
|
pub trait Instance {
|
2021-07-04 23:34:37 +02:00
|
|
|
fn regs(&self) -> crate::pac::usart::Usart;
|
2021-04-25 22:35:51 +02:00
|
|
|
}
|
2021-05-15 03:07:37 +02:00
|
|
|
pub trait RxPin<T: Instance>: Pin {
|
|
|
|
fn af_num(&self) -> u8;
|
2021-04-25 22:35:51 +02:00
|
|
|
}
|
2021-05-15 03:07:37 +02:00
|
|
|
pub trait TxPin<T: Instance>: Pin {
|
|
|
|
fn af_num(&self) -> u8;
|
2021-04-25 22:35:51 +02:00
|
|
|
}
|
2021-05-15 03:07:37 +02:00
|
|
|
pub trait CtsPin<T: Instance>: Pin {
|
|
|
|
fn af_num(&self) -> u8;
|
2021-04-25 22:35:51 +02:00
|
|
|
}
|
2021-05-15 03:07:37 +02:00
|
|
|
pub trait RtsPin<T: Instance>: Pin {
|
|
|
|
fn af_num(&self) -> u8;
|
2021-04-25 22:35:51 +02:00
|
|
|
}
|
2021-05-15 03:07:37 +02:00
|
|
|
pub trait CkPin<T: Instance>: Pin {
|
|
|
|
fn af_num(&self) -> u8;
|
2021-04-25 22:35:51 +02:00
|
|
|
}
|
2021-06-25 20:00:11 +02:00
|
|
|
|
2021-07-15 05:42:06 +02:00
|
|
|
pub trait RxDma<T: Instance> {
|
|
|
|
fn request(&self) -> dma::Request;
|
|
|
|
}
|
2021-06-25 20:00:11 +02:00
|
|
|
|
2021-07-15 05:42:06 +02:00
|
|
|
pub trait TxDma<T: Instance> {
|
|
|
|
fn request(&self) -> dma::Request;
|
|
|
|
}
|
2021-04-25 22:35:51 +02:00
|
|
|
}
|
2021-06-25 20:00:11 +02:00
|
|
|
|
2021-06-29 16:59:22 +02:00
|
|
|
pub trait Instance: sealed::Instance + RccPeripheral {}
|
2021-04-25 22:35:51 +02:00
|
|
|
pub trait RxPin<T: Instance>: sealed::RxPin<T> {}
|
|
|
|
pub trait TxPin<T: Instance>: sealed::TxPin<T> {}
|
|
|
|
pub trait CtsPin<T: Instance>: sealed::CtsPin<T> {}
|
|
|
|
pub trait RtsPin<T: Instance>: sealed::RtsPin<T> {}
|
|
|
|
pub trait CkPin<T: Instance>: sealed::CkPin<T> {}
|
2021-07-15 05:42:06 +02:00
|
|
|
pub trait RxDma<T: Instance>: sealed::RxDma<T> + dma::Channel {}
|
|
|
|
pub trait TxDma<T: Instance>: sealed::TxDma<T> + dma::Channel {}
|
2021-06-25 20:00:11 +02:00
|
|
|
|
2021-06-03 17:27:17 +02:00
|
|
|
crate::pac::peripherals!(
|
|
|
|
(usart, $inst:ident) => {
|
|
|
|
impl sealed::Instance for peripherals::$inst {
|
2021-05-06 03:43:46 +02:00
|
|
|
fn regs(&self) -> crate::pac::usart::Usart {
|
|
|
|
crate::pac::$inst
|
2021-04-14 15:34:58 +02:00
|
|
|
}
|
|
|
|
}
|
2021-06-03 17:27:17 +02:00
|
|
|
|
|
|
|
impl Instance for peripherals::$inst {}
|
2021-04-14 15:34:58 +02:00
|
|
|
};
|
2021-06-03 17:27:17 +02:00
|
|
|
);
|
2021-04-14 15:34:58 +02:00
|
|
|
|
2021-06-03 17:27:17 +02:00
|
|
|
macro_rules! impl_pin {
|
|
|
|
($inst:ident, $pin:ident, $signal:ident, $af:expr) => {
|
|
|
|
impl sealed::$signal<peripherals::$inst> for peripherals::$pin {
|
2021-05-15 03:07:37 +02:00
|
|
|
fn af_num(&self) -> u8 {
|
|
|
|
$af
|
|
|
|
}
|
2021-04-25 22:35:51 +02:00
|
|
|
}
|
2021-06-03 17:27:17 +02:00
|
|
|
|
|
|
|
impl $signal<peripherals::$inst> for peripherals::$pin {}
|
2021-04-25 22:35:51 +02:00
|
|
|
};
|
|
|
|
}
|
2021-06-03 17:27:17 +02:00
|
|
|
|
|
|
|
crate::pac::peripheral_pins!(
|
2021-07-01 17:26:56 +02:00
|
|
|
|
|
|
|
// USART
|
2021-06-03 17:27:17 +02:00
|
|
|
($inst:ident, usart, USART, $pin:ident, TX, $af:expr) => {
|
|
|
|
impl_pin!($inst, $pin, TxPin, $af);
|
|
|
|
};
|
|
|
|
($inst:ident, usart, USART, $pin:ident, RX, $af:expr) => {
|
|
|
|
impl_pin!($inst, $pin, RxPin, $af);
|
|
|
|
};
|
|
|
|
($inst:ident, usart, USART, $pin:ident, CTS, $af:expr) => {
|
|
|
|
impl_pin!($inst, $pin, CtsPin, $af);
|
|
|
|
};
|
|
|
|
($inst:ident, usart, USART, $pin:ident, RTS, $af:expr) => {
|
|
|
|
impl_pin!($inst, $pin, RtsPin, $af);
|
|
|
|
};
|
|
|
|
($inst:ident, usart, USART, $pin:ident, CK, $af:expr) => {
|
|
|
|
impl_pin!($inst, $pin, CkPin, $af);
|
|
|
|
};
|
2021-07-01 17:26:56 +02:00
|
|
|
|
|
|
|
// UART
|
|
|
|
($inst:ident, uart, UART, $pin:ident, TX, $af:expr) => {
|
|
|
|
impl_pin!($inst, $pin, TxPin, $af);
|
|
|
|
};
|
|
|
|
($inst:ident, uart, UART, $pin:ident, RX, $af:expr) => {
|
|
|
|
impl_pin!($inst, $pin, RxPin, $af);
|
|
|
|
};
|
|
|
|
($inst:ident, uart, UART, $pin:ident, CTS, $af:expr) => {
|
|
|
|
impl_pin!($inst, $pin, CtsPin, $af);
|
|
|
|
};
|
|
|
|
($inst:ident, uart, UART, $pin:ident, RTS, $af:expr) => {
|
|
|
|
impl_pin!($inst, $pin, RtsPin, $af);
|
|
|
|
};
|
|
|
|
($inst:ident, uart, UART, $pin:ident, CK, $af:expr) => {
|
|
|
|
impl_pin!($inst, $pin, CkPin, $af);
|
|
|
|
};
|
2021-06-03 17:27:17 +02:00
|
|
|
);
|
2021-07-15 05:42:06 +02:00
|
|
|
|
|
|
|
macro_rules! impl_dma {
|
|
|
|
($inst:ident, ALL, $signal:ident, $request:expr) => {
|
|
|
|
impl<T: crate::dma::Channel> sealed::$signal<peripherals::$inst> for T {
|
|
|
|
fn request(&self) -> dma::Request {
|
|
|
|
$request
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T: crate::dma::Channel> $signal<peripherals::$inst> for T {}
|
|
|
|
};
|
|
|
|
($inst:ident, $channel:ident, $signal:ident, $request:expr) => {
|
|
|
|
impl sealed::$signal<peripherals::$inst> for peripherals::$channel {
|
|
|
|
fn request(&self) -> dma::Request {
|
|
|
|
$request
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl $signal<peripherals::$inst> for peripherals::$channel {}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
crate::pac::peripheral_dma_channels! {
|
|
|
|
($peri:ident, usart, $kind:ident, RX, $channel:ident, $dma_peri:ident, $channel_num:expr, $request:expr) => {
|
|
|
|
impl_dma!($peri, $channel, RxDma, $request);
|
|
|
|
};
|
|
|
|
($peri:ident, usart, $kind:ident, TX, $channel:ident, $dma_peri:ident, $channel_num:expr, $request:expr) => {
|
|
|
|
impl_dma!($peri, $channel, TxDma, $request);
|
|
|
|
};
|
|
|
|
($peri:ident, uart, $kind:ident, RX, $channel:ident, $dma_peri:ident, $channel_num:expr, $request:expr) => {
|
|
|
|
impl_dma!($peri, $channel, RxDma, $request);
|
|
|
|
};
|
|
|
|
($peri:ident, uart, $kind:ident, TX, $channel:ident, $dma_peri:ident, $channel_num:expr, $request:expr) => {
|
|
|
|
impl_dma!($peri, $channel, TxDma, $request);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
crate::pac::dma_requests! {
|
|
|
|
(usart, $peri:ident, RX, $request:expr) => {
|
|
|
|
impl_dma!($peri, ALL, RxDma, $request);
|
|
|
|
};
|
|
|
|
(usart, $peri:ident, TX, $request:expr) => {
|
|
|
|
impl_dma!($peri, ALL, TxDma, $request);
|
|
|
|
};
|
|
|
|
(uart, $peri:ident, RX, $request:expr) => {
|
|
|
|
impl_dma!($peri, ALL, RxDma, $request);
|
|
|
|
};
|
|
|
|
(uart, $peri:ident, TX, $request:expr) => {
|
|
|
|
impl_dma!($peri, ALL, TxDma, $request);
|
|
|
|
};
|
|
|
|
}
|