Skip to content

Commit c7bc404

Browse files
committed
Added set_date & get_date for the RTC, now work on an ergonomic API for setting and getting time
1 parent 59c44fe commit c7bc404

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

examples/rtc.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use hal::stm32l4::stm32l4x2;
2020
use hal::delay::Delay;
2121
use hal::rtc::Rtc;
2222
use hal::rtc::Time;
23+
use hal::rtc::Date;
2324
use hal::pwr::Pwr;
2425
use hal::datetime::*;
2526
use rt::ExceptionFrame;
@@ -51,13 +52,16 @@ fn main() -> ! {
5152
let mut pwr = Pwr::pwr(&mut rcc.apb1r1);
5253
let rtc = Rtc::rtc(dp.RTC, &mut rcc.apb1r1, &mut rcc.bdcr, &mut pwr.cr1);
5354
let time = Time::new(21, 57, 32, false);
55+
let date = Date::new(1, 24, 4, 2018);
5456
rtc.set_time(&time);
57+
rtc.set_date(&date);
5558

5659
timer.delay_ms(1000_u32);
5760
timer.delay_ms(1000_u32);
5861
timer.delay_ms(1000_u32);
5962

6063
let _time = rtc.get_time();
64+
let _date = rtc.get_date();
6165

6266

6367
writeln!(hstdout, "Good bye!").unwrap();

src/rtc.rs

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,25 @@ impl Time {
2424
}
2525
}
2626

27+
#[derive(Clone,Copy,Debug)]
28+
pub struct Date {
29+
day: u8,
30+
date: u8,
31+
month: u8,
32+
year: u16,
33+
}
34+
35+
impl Date {
36+
pub fn new(day: u8, date: u8, month: u8, year: u16) -> Self {
37+
Self {
38+
day: day,
39+
date: date,
40+
month: month,
41+
year: year
42+
}
43+
}
44+
}
45+
2746
/// RTC Abstraction
2847
pub struct Rtc {
2948
rtc: RTC
@@ -84,6 +103,7 @@ impl Rtc {
84103
}
85104
init_mode(&rtc, false);
86105

106+
// TODO configuration for output pins
87107
rtc.or.modify(|_, w| {
88108
w.rtc_alarm_type()
89109
.clear_bit()
@@ -138,7 +158,6 @@ impl Rtc {
138158
{
139159
let timer = self.rtc.tr.read();
140160
let cr = self.rtc.cr.read();
141-
let ht = timer.ht().bits();
142161
time = Time::new(bcd2_to_byte((timer.ht().bits(), timer.hu().bits())),
143162
bcd2_to_byte((timer.mnt().bits(), timer.mnu().bits())),
144163
bcd2_to_byte((timer.st().bits(), timer.su().bits())),
@@ -150,6 +169,53 @@ impl Rtc {
150169

151170
time
152171
}
172+
173+
pub fn set_date(&self, date: &Date){
174+
write_protection(&self.rtc, false);
175+
{
176+
init_mode(&self.rtc, true);
177+
{
178+
let (dt, du) = byte_to_bcd2(date.date);
179+
let (mt, mu) = byte_to_bcd2(date.month);
180+
let (yt, yu) = byte_to_bcd2((date.year - 1970_u16) as u8);
181+
182+
self.rtc.dr.write(|w| unsafe {
183+
w.dt().bits(dt)
184+
.du().bits(du)
185+
.mt().bit(mt > 0)
186+
.mu().bits(mu)
187+
.yt().bits(yt)
188+
.yu().bits(yu)
189+
.wdu().bits(date.day)
190+
});
191+
192+
193+
}
194+
init_mode(&self.rtc, false);
195+
}
196+
write_protection(&self.rtc, true);
197+
}
198+
199+
pub fn get_date(&self) -> Date {
200+
let date;
201+
write_protection(&self.rtc, false);
202+
{
203+
init_mode(&self.rtc, true);
204+
{
205+
let dater = self.rtc.dr.read();
206+
let (yt, yu) = (dater.yt().bits(), dater.yu().bits());
207+
date = Date::new(dater.wdu().bits(),
208+
bcd2_to_byte((dater.dt().bits(), dater.du().bits())),
209+
bcd2_to_byte((dater.mt().bit() as u8, dater.mu().bits())),
210+
(bcd2_to_byte((dater.yt().bits(), dater.yu().bits())) as u16 + 1970_u16) as u16,
211+
);
212+
}
213+
init_mode(&self.rtc, false);
214+
}
215+
write_protection(&self.rtc, true);
216+
217+
date
218+
}
153219

154220
}
155221

0 commit comments

Comments
 (0)