#delay #avr #routines #function #arduino #ms #cycle

nightly no-std avr_delay

为AVR提供基于软件的延迟函数的crate

5个版本

0.3.2 2021年2月13日
0.3.1 2020年7月25日
0.3.0 2020年7月25日
0.2.1 2020年7月24日
0.2.0 2020年7月24日

嵌入式开发 中排名第 1537

每月下载量 31
ruduino 中使用

MIT/Apache

9KB

avr-delay

Crates.io

API文档

该库的目的是提供类似于Arduino库提供的AVR特定延迟例程。公开函数有

$AVR_CPU_FREQUENCY_HZ

此crate使用avr-config crate来获取CPU频率。因此,在为AVR编译crate时需要设置AVR_CPU_FREQUENCY_HZ环境变量。

示例

export AVR_CPU_FREQUENCY_HZ=16000000
cargo build -Z build-std=core --target avr-atmega328p.json --release
delay(count: u32)

是一个原始延迟循环。每个循环为4个周期。asm部分可以循环65536次。初始开销约为13个周期。每个外部循环的开销约为11个周期。

delay_us(us: u32)

delay us 微秒

delay_ms(ms: u32)

delay ms 毫秒

以下是使用它的简单示例。

Cargo.toml

    [package]
    name = "dlyblink"
    version = "0.1.0"
    authors = ["John Jorgensen"]

    [dependencies]
    arduino = "0.1"
    avr_delay = { git = "https://github.com/avr-rust/delay" }

和你的main.rs

#![feature(asm, lang_items, unwind_attributes)]

#![no_std]
#![no_main]

extern crate arduino;
extern crate avr_delay;

use arduino::{DDRB, PORTB};
use core::ptr::write_volatile;
use avr_delay::{delay, delay_ms, delay_us};

#[no_mangle]
pub extern fn main() {
    let mut out: u8 = 0x00;
    unsafe { write_volatile(DDRB, 0xff) }
    loop {
        out = out ^ 0xff;
        unsafe { write_volatile(PORTB, out) }
        delay_ms(1000000);
    }
}

// These do not need to be in a module, but we group them here for clarity.
pub mod std {
    #[lang = "eh_personality"]
    #[no_mangle]
    pub unsafe extern "C" fn rust_eh_personality(_state: (), _exception_object: *mut (), _context: *mut ()) -> () {
    }
    
    #[lang = "panic_fmt"]
    #[unwind]
    pub extern fn rust_begin_panic(_msg: (), _file: &'static str, _line: u32) -> ! {
        loop { }
    }
}

没有尝试处理算术溢出。

依赖项

~1.5MB
~35K SLoC