13次发布
0.3.2 | 2021年2月1日 |
---|---|
0.3.1 | 2021年1月29日 |
0.2.7 | 2020年10月29日 |
0.2.6 | 2020年8月24日 |
0.1.2 | 2018年11月5日 |
#140 in 嵌入式开发
每月49次下载
1MB
20K SLoC
Ruduino
此库为Arduino Uno提供了一组可重用组件。
概述
寄存器和位定义
use ruduino::PORTB; // Register
use ruduino::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);
}
依赖项
~1.3–2MB
~38K SLoC