nrf/buffered_uarte: add HIL tests.
This commit is contained in:
74
tests/nrf/src/bin/buffered_uart.rs
Normal file
74
tests/nrf/src/bin/buffered_uart.rs
Normal file
@ -0,0 +1,74 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
use defmt::{assert_eq, *};
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_futures::join::join;
|
||||
use embassy_nrf::buffered_uarte::BufferedUarte;
|
||||
use embassy_nrf::{interrupt, uarte};
|
||||
use {defmt_rtt as _, panic_probe as _};
|
||||
|
||||
#[embassy_executor::main]
|
||||
async fn main(_spawner: Spawner) {
|
||||
let p = embassy_nrf::init(Default::default());
|
||||
let mut config = uarte::Config::default();
|
||||
config.parity = uarte::Parity::EXCLUDED;
|
||||
config.baudrate = uarte::Baudrate::BAUD1M;
|
||||
|
||||
let mut tx_buffer = [0u8; 1024];
|
||||
let mut rx_buffer = [0u8; 1024];
|
||||
|
||||
let mut u = BufferedUarte::new(
|
||||
p.UARTE0,
|
||||
p.TIMER0,
|
||||
p.PPI_CH0,
|
||||
p.PPI_CH1,
|
||||
p.PPI_GROUP0,
|
||||
interrupt::take!(UARTE0_UART0),
|
||||
p.P1_03,
|
||||
p.P1_02,
|
||||
config.clone(),
|
||||
&mut rx_buffer,
|
||||
&mut tx_buffer,
|
||||
);
|
||||
|
||||
info!("uarte initialized!");
|
||||
|
||||
let (mut rx, mut tx) = u.split();
|
||||
|
||||
const COUNT: usize = 40_000;
|
||||
|
||||
let tx_fut = async {
|
||||
let mut tx_buf = [0; 215];
|
||||
let mut i = 0;
|
||||
while i < COUNT {
|
||||
let n = tx_buf.len().min(COUNT - i);
|
||||
let tx_buf = &mut tx_buf[..n];
|
||||
for (j, b) in tx_buf.iter_mut().enumerate() {
|
||||
*b = (i + j) as u8;
|
||||
}
|
||||
let n = unwrap!(tx.write(tx_buf).await);
|
||||
i += n;
|
||||
}
|
||||
};
|
||||
let rx_fut = async {
|
||||
let mut i = 0;
|
||||
while i < COUNT {
|
||||
let buf = unwrap!(rx.fill_buf().await);
|
||||
|
||||
for &b in buf {
|
||||
assert_eq!(b, i as u8);
|
||||
i = i + 1;
|
||||
}
|
||||
|
||||
let n = buf.len();
|
||||
rx.consume(n);
|
||||
}
|
||||
};
|
||||
|
||||
join(rx_fut, tx_fut).await;
|
||||
|
||||
info!("Test OK");
|
||||
cortex_m::asm::bkpt();
|
||||
}
|
86
tests/nrf/src/bin/buffered_uart_spam.rs
Normal file
86
tests/nrf/src/bin/buffered_uart_spam.rs
Normal file
@ -0,0 +1,86 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
use core::mem;
|
||||
use core::ptr::NonNull;
|
||||
|
||||
use defmt::{assert_eq, *};
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_nrf::buffered_uarte::BufferedUarte;
|
||||
use embassy_nrf::gpio::{Level, Output, OutputDrive};
|
||||
use embassy_nrf::ppi::{Event, Ppi, Task};
|
||||
use embassy_nrf::uarte::Uarte;
|
||||
use embassy_nrf::{interrupt, pac, uarte};
|
||||
use embassy_time::{Duration, Timer};
|
||||
use {defmt_rtt as _, panic_probe as _};
|
||||
|
||||
#[embassy_executor::main]
|
||||
async fn main(_spawner: Spawner) {
|
||||
let mut p = embassy_nrf::init(Default::default());
|
||||
let mut config = uarte::Config::default();
|
||||
config.parity = uarte::Parity::EXCLUDED;
|
||||
config.baudrate = uarte::Baudrate::BAUD1M;
|
||||
|
||||
let mut tx_buffer = [0u8; 1024];
|
||||
let mut rx_buffer = [0u8; 1024];
|
||||
|
||||
mem::forget(Output::new(&mut p.P1_02, Level::High, OutputDrive::Standard));
|
||||
|
||||
let mut u = BufferedUarte::new(
|
||||
p.UARTE0,
|
||||
p.TIMER0,
|
||||
p.PPI_CH0,
|
||||
p.PPI_CH1,
|
||||
p.PPI_GROUP0,
|
||||
interrupt::take!(UARTE0_UART0),
|
||||
p.P1_03,
|
||||
p.P1_04,
|
||||
config.clone(),
|
||||
&mut rx_buffer,
|
||||
&mut tx_buffer,
|
||||
);
|
||||
|
||||
info!("uarte initialized!");
|
||||
|
||||
// uarte needs some quiet time to start rxing properly.
|
||||
Timer::after(Duration::from_millis(10)).await;
|
||||
|
||||
// Tx spam in a loop.
|
||||
const NSPAM: usize = 17;
|
||||
static mut TX_BUF: [u8; NSPAM] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
|
||||
let _spam = Uarte::new(p.UARTE1, interrupt::take!(UARTE1), p.P1_01, p.P1_02, config.clone());
|
||||
let spam_peri: pac::UARTE1 = unsafe { mem::transmute(()) };
|
||||
let event = unsafe { Event::new_unchecked(NonNull::new_unchecked(&spam_peri.events_endtx as *const _ as _)) };
|
||||
let task = unsafe { Task::new_unchecked(NonNull::new_unchecked(&spam_peri.tasks_starttx as *const _ as _)) };
|
||||
let mut spam_ppi = Ppi::new_one_to_one(p.PPI_CH2, event, task);
|
||||
spam_ppi.enable();
|
||||
let p = unsafe { TX_BUF.as_mut_ptr() };
|
||||
spam_peri.txd.ptr.write(|w| unsafe { w.ptr().bits(p as u32) });
|
||||
spam_peri.txd.maxcnt.write(|w| unsafe { w.maxcnt().bits(NSPAM as _) });
|
||||
spam_peri.tasks_starttx.write(|w| unsafe { w.bits(1) });
|
||||
|
||||
let mut i = 0;
|
||||
let mut total = 0;
|
||||
while total < 256 * 1024 {
|
||||
let buf = unwrap!(u.fill_buf().await);
|
||||
//info!("rx {}", buf);
|
||||
|
||||
for &b in buf {
|
||||
assert_eq!(b, unsafe { TX_BUF[i] });
|
||||
|
||||
i = i + 1;
|
||||
if i == NSPAM {
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Read bytes have to be explicitly consumed, otherwise fill_buf() will return them again
|
||||
let n = buf.len();
|
||||
u.consume(n);
|
||||
total += n;
|
||||
}
|
||||
|
||||
info!("Test OK");
|
||||
cortex_m::asm::bkpt();
|
||||
}
|
Reference in New Issue
Block a user