#rtc #嵌入式-hal驱动 #无std

无std pcf85063a

pcf85063a RTC的嵌入式-hal驱动

2个版本

0.1.1 2024年6月27日
0.1.0 2023年9月19日

#454嵌入式开发

Download history 17/week @ 2024-05-03 5/week @ 2024-05-10 3/week @ 2024-05-17 1/week @ 2024-05-24 12/week @ 2024-05-31 29/week @ 2024-06-07 23/week @ 2024-06-14 77/week @ 2024-06-21 40/week @ 2024-06-28 14/week @ 2024-07-05 33/week @ 2024-07-19 45/week @ 2024-07-26 3/week @ 2024-08-02 27/week @ 2024-08-09 15/week @ 2024-08-16

每月 95次下载

MIT/Apache

27KB
518 代码行

pcf85063a

为pcf85063a实时时钟编写的rust驱动。

主要是pcf8563-rs的移植,但适用于略微不同的RTC。

示例

使用我们的nrf9160-rust-starter项目的示例

#![no_main]
#![no_std]

use hal::Twim;
use nrf9160_rust_starter as _; // global logger + panicking-behavior + memory layout
use pcf85063a::{self, Control, DateTime};

use nrf9160_hal as hal;
use nrf9160_hal::pac;

#[cortex_m_rt::entry]
fn main() -> ! {
    defmt::println!("Hello, world!");

    let ahb_frequency = 32_768u32;

    let p = cortex_m::peripheral::Peripherals::take().unwrap();

    let mut delay = cortex_m::delay::Delay::new(p.SYST, ahb_frequency);

    let p = pac::Peripherals::take().unwrap();
    let pins0 = hal::gpio::p0::Parts::new(p.P0_NS);

    let sda = pins0.p0_26.into_floating_input().degrade();
    let scl = pins0.p0_27.into_floating_input().degrade();

    let twim = Twim::new(
        p.TWIM2_NS,
        hal::twim::Pins { scl, sda },
        hal::twim::Frequency::K100,
    );

    // set up the PCF8563 device
    let mut rtc = pcf85063a::PCF85063::new(twim);

    // prepare date and time to be set
    let now = DateTime {
        year: 21,   // 2021
        month: 4,   // April
        weekday: 0, // Sunday
        day: 4,
        hours: 16,
        minutes: 52,
        seconds: 00,
    };

    // set date and time in one go
    rtc.set_datetime(&now).unwrap();

    rtc.set_alarm_seconds(10).unwrap();
    rtc.set_alarm_minutes(52).unwrap();

    rtc.control_alarm_seconds(Control::On).unwrap();
    rtc.control_alarm_minutes(Control::On).unwrap();
    rtc.control_alarm_interrupt(Control::On).unwrap();

    loop {
        delay.delay_ms(500 as u32);

        //get date and time in one go
        let time = rtc.get_datetime().unwrap();

        defmt::println!(
            "{:02}/{:02}/{:02} {:02}:{:02}:{:02} day {}\r",
            time.year,
            time.month,
            time.day,
            time.hours,
            time.minutes,
            time.seconds,
            time.weekday
        );

        if rtc.get_alarm_flag().unwrap() {
            rtc.clear_alarm_flag().unwrap();
            defmt::println!("----------------------- ALARM");
            break;
        }

        delay.delay_ms(500 as u32);
    }

    nrf9160_rust_starter::exit()
}

依赖项

~1MB
~17K SLoC