aboutsummaryrefslogtreecommitdiff
path: root/tests/nrf/src/bin/buffered_uart_spam.rs
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-06-25 22:27:56 +0200
committerDario Nieuwenhuis <[email protected]>2024-06-25 22:29:07 +0200
commitcab17434d5411558e7fb9f260665ec8da88118a9 (patch)
tree4494cfc59064cfa896e3f9ce530d6fd4ccbcfcd9 /tests/nrf/src/bin/buffered_uart_spam.rs
parent3ae2f140f9c794577b5bc10c43c21b9824dc3b9a (diff)
tests/nrf: unify, add nrf52832, nrf52833, nrf5340, nrf9160
Diffstat (limited to 'tests/nrf/src/bin/buffered_uart_spam.rs')
-rw-r--r--tests/nrf/src/bin/buffered_uart_spam.rs92
1 files changed, 92 insertions, 0 deletions
diff --git a/tests/nrf/src/bin/buffered_uart_spam.rs b/tests/nrf/src/bin/buffered_uart_spam.rs
new file mode 100644
index 000000000..906723229
--- /dev/null
+++ b/tests/nrf/src/bin/buffered_uart_spam.rs
@@ -0,0 +1,92 @@
1// required-features: nrf52840
2#![no_std]
3#![no_main]
4teleprobe_meta::target!(b"nrf52840-dk");
5
6use core::mem;
7use core::ptr::NonNull;
8
9use defmt::{assert_eq, *};
10use embassy_executor::Spawner;
11use embassy_nrf::buffered_uarte::{self, BufferedUarte};
12use embassy_nrf::gpio::{Level, Output, OutputDrive};
13use embassy_nrf::ppi::{Event, Ppi, Task};
14use embassy_nrf::uarte::Uarte;
15use embassy_nrf::{bind_interrupts, pac, peripherals, uarte};
16use embassy_time::Timer;
17use {defmt_rtt as _, panic_probe as _};
18
19bind_interrupts!(struct Irqs {
20 UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>;
21 UARTE1 => uarte::InterruptHandler<peripherals::UARTE1>;
22});
23
24#[embassy_executor::main]
25async fn main(_spawner: Spawner) {
26 let mut p = embassy_nrf::init(Default::default());
27 let mut config = uarte::Config::default();
28 config.parity = uarte::Parity::EXCLUDED;
29 config.baudrate = uarte::Baudrate::BAUD1M;
30
31 let mut tx_buffer = [0u8; 1024];
32 let mut rx_buffer = [0u8; 1024];
33
34 mem::forget(Output::new(&mut p.P1_02, Level::High, OutputDrive::Standard));
35
36 let mut u = BufferedUarte::new(
37 p.UARTE0,
38 p.TIMER0,
39 p.PPI_CH0,
40 p.PPI_CH1,
41 p.PPI_GROUP0,
42 Irqs,
43 p.P1_03,
44 p.P1_04,
45 config.clone(),
46 &mut rx_buffer,
47 &mut tx_buffer,
48 );
49
50 info!("uarte initialized!");
51
52 // uarte needs some quiet time to start rxing properly.
53 Timer::after_millis(10).await;
54
55 // Tx spam in a loop.
56 const NSPAM: usize = 17;
57 static mut TX_BUF: [u8; NSPAM] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
58 let _spam = Uarte::new(p.UARTE1, Irqs, p.P1_01, p.P1_02, config.clone());
59 let spam_peri: pac::UARTE1 = unsafe { mem::transmute(()) };
60 let event = unsafe { Event::new_unchecked(NonNull::new_unchecked(&spam_peri.events_endtx as *const _ as _)) };
61 let task = unsafe { Task::new_unchecked(NonNull::new_unchecked(&spam_peri.tasks_starttx as *const _ as _)) };
62 let mut spam_ppi = Ppi::new_one_to_one(p.PPI_CH2, event, task);
63 spam_ppi.enable();
64 let p = unsafe { TX_BUF.as_mut_ptr() };
65 spam_peri.txd.ptr.write(|w| unsafe { w.ptr().bits(p as u32) });
66 spam_peri.txd.maxcnt.write(|w| unsafe { w.maxcnt().bits(NSPAM as _) });
67 spam_peri.tasks_starttx.write(|w| unsafe { w.bits(1) });
68
69 let mut i = 0;
70 let mut total = 0;
71 while total < 256 * 1024 {
72 let buf = unwrap!(u.fill_buf().await);
73 //info!("rx {}", buf);
74
75 for &b in buf {
76 assert_eq!(b, unsafe { TX_BUF[i] });
77
78 i = i + 1;
79 if i == NSPAM {
80 i = 0;
81 }
82 }
83
84 // Read bytes have to be explicitly consumed, otherwise fill_buf() will return them again
85 let n = buf.len();
86 u.consume(n);
87 total += n;
88 }
89
90 info!("Test OK");
91 cortex_m::asm::bkpt();
92}