refactor UART RX with IRQ
All checks were successful
Rust/va416xx-rs/pipeline/pr-main This commit looks good
All checks were successful
Rust/va416xx-rs/pipeline/pr-main This commit looks good
This commit is contained in:
parent
731fe7ca4f
commit
87e4469974
@ -180,7 +180,7 @@ mod app {
|
|||||||
&mut cx.device.sysconfig,
|
&mut cx.device.sysconfig,
|
||||||
&clocks,
|
&clocks,
|
||||||
);
|
);
|
||||||
let (tx, mut rx, _) = uart0.split_with_irq();
|
let (tx, rx) = uart0.split();
|
||||||
|
|
||||||
let verif_reporter = VerificationReportCreator::new(0).unwrap();
|
let verif_reporter = VerificationReportCreator::new(0).unwrap();
|
||||||
|
|
||||||
@ -193,6 +193,7 @@ mod app {
|
|||||||
Mono::start(cx.core.SYST, clocks.sysclk().raw());
|
Mono::start(cx.core.SYST, clocks.sysclk().raw());
|
||||||
CLOCKS.set(clocks).unwrap();
|
CLOCKS.set(clocks).unwrap();
|
||||||
|
|
||||||
|
let mut rx = rx.to_rx_with_irq();
|
||||||
let mut rx_context = IrqContextTimeoutOrMaxSize::new(MAX_TC_FRAME_SIZE);
|
let mut rx_context = IrqContextTimeoutOrMaxSize::new(MAX_TC_FRAME_SIZE);
|
||||||
rx.read_fixed_len_or_timeout_based_using_irq(&mut rx_context)
|
rx.read_fixed_len_or_timeout_based_using_irq(&mut rx_context)
|
||||||
.expect("initiating UART RX failed");
|
.expect("initiating UART RX failed");
|
||||||
|
@ -569,22 +569,6 @@ impl<TxPinInst: TxPin<UartInstance>, RxPinInst: RxPin<UartInstance>, UartInstanc
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If the IRQ capabilities of the peripheral are used, the UART needs to be converted
|
|
||||||
/// with this function. Currently, IRQ abstractions are only implemented for the RX part
|
|
||||||
/// of the UART, so this function will release a TX and RX handle as well as the pin
|
|
||||||
/// instances.
|
|
||||||
pub fn split_with_irq(
|
|
||||||
self,
|
|
||||||
) -> (
|
|
||||||
Tx<UartInstance>,
|
|
||||||
RxWithIrq<UartInstance>,
|
|
||||||
(TxPinInst, RxPinInst),
|
|
||||||
) {
|
|
||||||
let (inner, pins) = self.downgrade_internal();
|
|
||||||
let (tx, rx) = inner.split();
|
|
||||||
(tx, RxWithIrq(rx), pins)
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate::delegate! {
|
delegate::delegate! {
|
||||||
to self.inner {
|
to self.inner {
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -611,15 +595,6 @@ impl<TxPinInst: TxPin<UartInstance>, RxPinInst: RxPin<UartInstance>, UartInstanc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn downgrade_internal(self) -> (UartBase<UartInstance>, (TxPinInst, RxPinInst)) {
|
|
||||||
let base = UartBase {
|
|
||||||
uart: self.inner.uart,
|
|
||||||
tx: self.inner.tx,
|
|
||||||
rx: self.inner.rx,
|
|
||||||
};
|
|
||||||
(base, self.pins)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn downgrade(self) -> UartBase<UartInstance> {
|
pub fn downgrade(self) -> UartBase<UartInstance> {
|
||||||
UartBase {
|
UartBase {
|
||||||
uart: self.inner.uart,
|
uart: self.inner.uart,
|
||||||
@ -658,6 +633,10 @@ impl<Uart: Instance> Rx<Uart> {
|
|||||||
self.0.enable().modify(|_, w| w.rxenable().clear_bit());
|
self.0.enable().modify(|_, w| w.rxenable().clear_bit());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn to_rx_with_irq(self) -> RxWithIrq<Uart> {
|
||||||
|
RxWithIrq(self)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn release(self) -> Uart {
|
pub fn release(self) -> Uart {
|
||||||
self.0
|
self.0
|
||||||
}
|
}
|
||||||
@ -709,7 +688,9 @@ pub enum IrqError {
|
|||||||
Uart(IrqUartError),
|
Uart(IrqUartError),
|
||||||
}
|
}
|
||||||
|
|
||||||
// Serial receiver, using interrupts to offload reading to the hardware.
|
/// Serial receiver, using interrupts to offload reading to the hardware.
|
||||||
|
///
|
||||||
|
/// You can use [Rx::to_rx_with_irq] to convert a normal [Rx] structure into this structure.
|
||||||
pub struct RxWithIrq<Uart>(Rx<Uart>);
|
pub struct RxWithIrq<Uart>(Rx<Uart>);
|
||||||
|
|
||||||
impl<Uart: Instance> RxWithIrq<Uart> {
|
impl<Uart: Instance> RxWithIrq<Uart> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user