Registers Module
We will create an enum to represent the registers of the DS3231 RTC:
#![allow(unused)] fn main() { #[repr(u8)] #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Register { /// Seconds register (0x00) - BCD format 00-59, bit 7 = Clock Halt Seconds = 0x00, /// Minutes register (0x01) - BCD format 00-59 Minutes = 0x01, /// Hours register (0x02) - BCD format, supports 12/24 hour mode Hours = 0x02, /// Day of week register (0x03) - 1-7 (Sunday=1) Day = 0x03, /// Date register (0x04) - BCD format 01-31 Date = 0x04, /// Month register (0x05) - BCD format 01-12 Month = 0x05, /// Year register (0x06) - BCD format 00-99 (2000-2099) Year = 0x06, /// Control register (0x0E) Control = 0x0E, } impl Register { pub const fn addr(self) -> u8 { self as u8 } } }
Next, we will define constants for the register bit flags:
#![allow(unused)] fn main() { /// Control register (0x0E) bit flags /// Enable Oscillator pub const EOSC_BIT: u8 = 1 << 7; /// Interrupt Control pub const INTCN_BIT: u8 = 1 << 2; /// Rate Select mask pub const RS_MASK: u8 = 0b0001_1000; }
EOSC_BIT controls the oscillator, INTCN_BIT controls whether the pin outputs interrupts or square waves, and RS_MASK selects which bits control the square wave frequency. When INTCN_BIT is 0, the pin outputs a square wave; when it's 1, the pin outputs interrupts from alarms.