#raspberry-pi #uart #bare-metal #ruspiro #debug-information #debugging

no-std ruspiro-uart

Simple and convinient access API to the Raspberry Pi 3 UART0 (PL011) and UART1 (miniUART) peripherals

6 releases (breaking)

0.4.0 Sep 7, 2021
0.3.1 Sep 13, 2020
0.3.0 Dec 14, 2019
0.2.0 Aug 31, 2019
0.0.3 Jul 30, 2019

#1998 in Embedded development

Download history 12/week @ 2024-09-30

61 downloads per month
Used in ruspiro-sdk

MIT/Apache

34KB
445 lines

UART RusPiRo crate

This crate provides access to the Uart0(Pl011) and Uart1 (miniUART) peripheral of the Raspberry Pi. This is quite helpful during bare metal development to use a terminal console connected to the miniUART of the Raspberry Pi to get some debug information printed while the program is executed on the device. Especialy if the program is in a state where there is no other output option and blinking LEDs are not sufficient.

CI Latest Version Documentation License

Usage

To use the crate just add the following dependency to your Cargo.toml file:

[dependencies]
ruspiro-uart = "0.4.0"

Once done the access to the UART abstraction is available in your rust files like so:

use ruspiro_uart::Uart1;

fn demo() {
    let mut uart = Uart1::new();
    if uart.initialize(250_000_000, 115_200).is_ok() {
        uart.send_string("This is some string");
    }
}

In this example the Uart1 will be no longer be available once it goes out of scope. Whichs makes it a bit cumbersome to use it in a real world example. Therefore the proposed usage of the UART is to use it as a generic console output channel. To do so, please refer to the ruspiro-console crate. But in case you would like to use the uart without the console abstraction it is recommended to wrap it into a singleton to guaranty safe cross core access and only one-time initialization. In the example we pass a fixed core clock rate to the initialization function. However, the real core clock rate could be optained with a call to the mailbox property tag interface of the Raspberry Pi (see ruspiro-mailbox for details.). This mailbox crate is not linked into the Uart crate to ensure usability of this crate with as less dependencies as possible.

use ruspiro_singleton::Singleton;
use ruspiro_uart::Uart1;

static UART: Singleton<Uart1> = Singleton::new(Uart1::new());

fn demo() {
    let _ = UART.with_mut(|uart| uart.initialize(250_000_000, 115_200)).expect("unable to init uart1");

    print_something("Hello Uart...");
}

fn print_something(s: &str) {
    UART.with_ref(|uart| uart.send_string(s));
}

License

Licensed under Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0) or MIT (LICENSE-MIT or http://opensource.org/licenses/MIT)) at your choice.

Dependencies

~2MB
~42K SLoC