diff --git a/examples/ch32v307/src/bin/uart_echo_async.rs b/examples/ch32v307/src/bin/uart_echo_async.rs new file mode 100644 index 0000000..d5906b9 --- /dev/null +++ b/examples/ch32v307/src/bin/uart_echo_async.rs @@ -0,0 +1,45 @@ +#![no_std] +#![no_main] + +use embassy_executor::Spawner; +use hal::gpio::{Level, Output}; +use hal::usart; +use hal::usart::Uart; +use {ch32_hal as hal, panic_halt as _}; + +use ch32_hal::bind_interrupts; + +bind_interrupts!(struct Irqs { + USART4 => ch32_hal::usart::InterruptHandler; +}); + +#[embassy_executor::main(entry = "ch32_hal::entry")] +async fn main(_spawner: Spawner) -> ! { + let p = hal::init(Default::default()); + + // GPIO + let mut led = Output::new(p.PB4, Level::Low, Default::default()); + + let cfg = usart::Config::default(); + let (mut tx_uart, mut rx_uart) = Uart::new(p.USART4, p.PE1, p.PE0, Irqs, p.DMA2_CH5, p.DMA2_CH3, cfg) + .unwrap() + .split(); + + tx_uart.write(b"Init ok\r\n").await.unwrap(); + + let mut buf = [0u8; 255]; + loop { + match rx_uart.read_until_idle(&mut buf).await { + Ok(size) => { + for character in &mut buf[..size] { + if *character >= b'a' && *character <= b'z' { + *character -= 32; + } + } + tx_uart.write(&buf[..size]).await.unwrap(); + led.toggle(); + } + Err(_err) => {} + } + } +} diff --git a/src/usart/mod.rs b/src/usart/mod.rs index 500e6e6..907b986 100644 --- a/src/usart/mod.rs +++ b/src/usart/mod.rs @@ -838,6 +838,7 @@ impl<'d, T: Instance> Uart<'d, T, Async> { rx.set_as_input(Pull::None); tx.set_as_af_output(AFType::OutputPushPull, Speed::High); + T::set_remap(REMAP); Self::new_inner( peri, @@ -869,6 +870,7 @@ impl<'d, T: Instance> Uart<'d, T, Async> { tx.set_as_af_output(AFType::OutputPushPull, Speed::High); rts.set_as_af_output(AFType::OutputPushPull, Speed::High); cts.set_as_input(Pull::None); + T::set_remap(REMAP); Self::new_inner( peri,