Merge #572
572: Makes the uarte endtx event available r=Dirbaio a=huntc This PR allows `event_endtx` to be used outside of the `Uarte` itself. As a consequence, PPI can be used to drive tasks given the end of transmission on the Uarte. This is particularly useful for situations like RS485 where a GPIO may be required to be set to high when transmitting, then cleared when done. A non-PPI approach can cause a delay in the clearing of this GPIO as other Embassy tasks might become scheduled. Not clearing the GPIO in a timely manner can be problematic. Here's an example of our usage with this change: ```rust let uarte_tx_enable = OutputChannel::new( p.gpiote_ch, Output::new(p.uarte_tx_enable_pin, Level::Low, OutputDrive::Standard), OutputChannelPolarity::Set, ); let mut ppi = Ppi::new_one_to_one(p.ppi_ch, uarte.event_endtx(), uarte_tx_enable.task_clr()); ppi.enable(); ``` ...and then later when writing: ```rust uarte_tx_enable.set(); let _ = uarte_tx.write(&datagram_buf).await; ``` Co-authored-by: huntc <huntchr@gmail.com>
This commit is contained in:
commit
01af8095fd
1 changed files with 6 additions and 0 deletions
|
@ -151,6 +151,12 @@ impl<'d, T: Instance> Uarte<'d, T> {
|
||||||
(self.tx, self.rx)
|
(self.tx, self.rx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return the endtx event for use with PPI
|
||||||
|
pub fn event_endtx(&self) -> Event {
|
||||||
|
let r = T::regs();
|
||||||
|
Event::from_reg(&r.events_endtx)
|
||||||
|
}
|
||||||
|
|
||||||
fn on_interrupt(_: *mut ()) {
|
fn on_interrupt(_: *mut ()) {
|
||||||
let r = T::regs();
|
let r = T::regs();
|
||||||
let s = T::state();
|
let s = T::state();
|
||||||
|
|
Loading…
Reference in a new issue