Fork of the ruduino library from avr-rust: https://github.com/avr-rust/ruduino
Go to file
Dylan McKay d6ab7fafd2 Improve the core generator so that it doesn't generate broken modules
Now that the core generator is set to generate modules for all
microcontrollers, we need to blacklist the ones it cannot yet handle.
2021-01-29 20:44:08 +13:00
.github/workflows Add Docker based CI pipeline 2020-07-24 20:13:34 +12:00
core_generator Improve the core generator so that it doesn't generate broken modules 2021-01-29 20:44:08 +13:00
examples Add a UART example 2020-07-25 02:45:22 +12:00
src Stop autogenerating config.rs file 2021-01-29 20:44:08 +13:00
.dockerignore Add an empty whitespace line to test CI 2020-07-24 20:17:22 +12:00
.gitignore Initial commit 2016-07-06 19:59:51 -04:00
Cargo.toml Stop autogenerating config.rs file 2021-01-29 20:44:08 +13:00
Dockerfile.ci Add Docker based CI pipeline 2020-07-24 20:13:34 +12:00
LICENSE-APACHE Initial commit 2016-07-06 19:59:51 -04:00
LICENSE-MIT Initial commit 2016-07-06 19:59:51 -04:00
README.md Fully rename the crate 2018-11-02 21:41:57 -04:00
avr-atmega328p.json Add Docker based CI pipeline 2020-07-24 20:13:34 +12:00
regenerate-cores.sh Move the 'core_generator' from a build script to an in-repository tool 2021-01-29 20:44:08 +13:00

README.md

Ruduino

This library provides a set of reusable components for the Arduino Uno.

Overview

Register and bit definitions

use ruduino::PORTB; // Register
use ruduino::PORTB7; // Pin

Prelude

Disable interrupts.

without_interrupts(|| {
    unsafe { write_volatile(DDRB, 0xFF) }
})

Timers

Configure a timer.

const CPU_FREQUENCY_HZ: u64 = 16_000_000;
const DESIRED_HZ_TIM1: f64 = 2.0;
const TIM1_PRESCALER: u64 = 1024;
const INTERRUPT_EVERY_1_HZ_1024_PRESCALER: u16 =
    ((CPU_FREQUENCY_HZ as f64 / (DESIRED_HZ_TIM1 * TIM1_PRESCALER as f64)) as u64 - 1) as u16;

timer1::Timer::new()
    .waveform_generation_mode(timer1::WaveformGenerationMode::ClearOnTimerMatchOutputCompare)
    .clock_source(timer1::ClockSource::Prescale1024)
    .output_compare_1(Some(INTERRUPT_EVERY_1_HZ_1024_PRESCALER))
    .configure();

Set up an interrupt handler that will be called when the timer fires.

#[no_mangle]
pub unsafe extern "avr-interrupt" fn _ivr_timer1_compare_a() {
    let prev_value = read_volatile(PORTB);
    write_volatile(PORTB, prev_value ^ PINB5);
}

Hardware Serial Port

Configure the serial port.

const CPU_FREQUENCY_HZ: u64 = 16_000_000;
const BAUD: u64 = 9600;
const UBRR: u16 = (CPU_FREQUENCY_HZ / 16 / BAUD - 1) as u16;

serial::Serial::new(UBRR)
    .character_size(serial::CharacterSize::EightBits)
    .mode(serial::Mode::Asynchronous)
    .parity(serial::Parity::Disabled)
    .stop_bits(serial::StopBits::OneBit)
    .configure();

Transmit a sequence of bytes.

for &b in b"OK" {
    serial::transmit(b);
}

Read a byte if there's something available.

if let Some(b) = serial::try_receive() {
    serial::transmit(b);
    serial::transmit(b);
}