Changed: - Move most library components to new [`vorago-shared-periphs`](https://egit.irs.uni-stuttgart.de/rust/vorago-shared-periphs) which is mostly re-exported in this crate. - Overhaul and simplification of several HAL APIs. The system configuration and IRQ router peripheral instance generally does not need to be passed to HAL API anymore. - All HAL drivers are now type erased. The constructors will still expect and consume the PAC singleton component for resource management purposes, but are not cached anymore. - Refactoring of GPIO library to be more inline with embassy GPIO API. Added: - I2C clock timeout feature support.
89 lines
2.6 KiB
Rust
89 lines
2.6 KiB
Rust
//! Asynchronous UART transmission example application.
|
|
//!
|
|
//! This application receives sends 4 strings with different sizes permanently.
|
|
//! It uses PORTG0 as TX pin and PORTG1 as RX pin, which is the UART0 on the PEB1 board.
|
|
//!
|
|
//! Instructions:
|
|
//!
|
|
//! 1. Tie a USB to UART converter with RX to PORTG0 and TX to PORTG1.
|
|
//! 2. Connect to the serial interface by using an application like Putty or picocom. You can
|
|
//! type something in the terminal and check if the data is echoed back. You can also check the
|
|
//! RTT logs to see received data.
|
|
#![no_std]
|
|
#![no_main]
|
|
// Import panic provider.
|
|
use panic_probe as _;
|
|
// Import logger.
|
|
use defmt_rtt as _;
|
|
|
|
use embassy_example::EXTCLK_FREQ;
|
|
use embassy_executor::Spawner;
|
|
use embassy_time::{Duration, Instant, Ticker};
|
|
use embedded_io_async::Write;
|
|
use va416xx_hal::{
|
|
clock::ClockConfigurator,
|
|
gpio::{Output, PinState},
|
|
pac::{self, interrupt},
|
|
pins::PinsG,
|
|
prelude::*,
|
|
time::Hertz,
|
|
uart::{
|
|
self,
|
|
tx_asynch::{on_interrupt_tx, TxAsync},
|
|
Bank,
|
|
},
|
|
};
|
|
|
|
const STR_LIST: &[&str] = &[
|
|
"Hello World\r\n",
|
|
"Smoll\r\n",
|
|
"A string which is larger than the FIFO size\r\n",
|
|
"A really large string which is significantly larger than the FIFO size\r\n",
|
|
];
|
|
|
|
// main is itself an async function.
|
|
#[embassy_executor::main]
|
|
async fn main(_spawner: Spawner) {
|
|
defmt::println!("-- VA108xx Async UART TX Demo --");
|
|
|
|
let dp = pac::Peripherals::take().unwrap();
|
|
|
|
// Initialize the systick interrupt & obtain the token to prove that we did
|
|
// Use the external clock connected to XTAL_N.
|
|
let clocks = ClockConfigurator::new(dp.clkgen)
|
|
.xtal_n_clk_with_src_freq(Hertz::from_raw(EXTCLK_FREQ))
|
|
.freeze()
|
|
.unwrap();
|
|
// Safety: Only called once here.
|
|
va416xx_embassy::init(dp.tim15, dp.tim14, &clocks);
|
|
|
|
let pinsg = PinsG::new(dp.portg);
|
|
let mut led = Output::new(pinsg.pg5, PinState::Low);
|
|
|
|
let uarta =
|
|
uart::Uart::new(dp.uart0, pinsg.pg0, pinsg.pg1, &clocks, 115200.Hz().into()).unwrap();
|
|
let (tx, _rx) = uarta.split();
|
|
let mut async_tx = TxAsync::new(tx);
|
|
let mut ticker = Ticker::every(Duration::from_secs(1));
|
|
let mut idx = 0;
|
|
loop {
|
|
defmt::println!("Current time: {}", Instant::now().as_secs());
|
|
led.toggle();
|
|
let _written = async_tx
|
|
.write(STR_LIST[idx].as_bytes())
|
|
.await
|
|
.expect("writing failed");
|
|
idx += 1;
|
|
if idx == STR_LIST.len() {
|
|
idx = 0;
|
|
}
|
|
ticker.next().await;
|
|
}
|
|
}
|
|
|
|
#[interrupt]
|
|
#[allow(non_snake_case)]
|
|
fn UART0_TX() {
|
|
on_interrupt_tx(Bank::Uart0);
|
|
}
|