#avr #uno #component #reusable #serial #timer

nightly arduino

Arduino Uno 的可重用组件

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2017 年 8 月 21 日

#18#avr

MIT/Apache

26KB
569 代码行

Arduino

此库为 Arduino Uno 提供了一套可重用组件。

概述

寄存器和位定义

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

预序

禁用中断。

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

定时器

配置定时器。

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();

设置一个在定时器触发时将被调用的中断处理程序。

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

硬件串行端口

配置串行端口。

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();

发送一系列字节。

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

如果有内容可用,则读取一个字节。

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

无运行时依赖