Skip to content

Commit a2eb8af

Browse files
committed
Added impl for get & set time. Started testing, init is failing will need to expore this further
1 parent b4cce23 commit a2eb8af

File tree

4 files changed

+179
-41
lines changed

4 files changed

+179
-41
lines changed

.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"debugger_args": [
1414
"-nx" // dont use the .gdbinit file
1515
],
16-
"executable": "./target/thumbv7em-none-eabi/debug/examples/serial_dma_partial_peek",
16+
"executable": "./target/thumbv7em-none-eabi/debug/examples/rtc",
1717
"remote": true,
1818
"target": ":3333",
1919
"cwd": "${workspaceRoot}",

examples/rtc.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
//! Blinks an LED
2+
3+
#![deny(unsafe_code)]
4+
// #![deny(warnings)]
5+
#![no_std]
6+
#![no_main]
7+
8+
extern crate cortex_m;
9+
#[macro_use]
10+
extern crate cortex_m_rt as rt;
11+
extern crate cortex_m_semihosting as sh;
12+
extern crate panic_semihosting;
13+
extern crate stm32l432xx_hal as hal;
14+
// #[macro_use(block)]
15+
// extern crate nb;
16+
17+
use hal::prelude::*;
18+
use hal::stm32l4::stm32l4x2;
19+
20+
use hal::delay::Delay;
21+
use hal::rtc::Rtc;
22+
use hal::rtc::Time;
23+
use hal::datetime::*;
24+
use rt::ExceptionFrame;
25+
26+
use core::fmt::Write;
27+
use sh::hio;
28+
29+
entry!(main);
30+
31+
fn main() -> ! {
32+
33+
let mut hstdout = hio::hstdout().unwrap();
34+
35+
writeln!(hstdout, "Hello, world!").unwrap();
36+
37+
let cp = cortex_m::Peripherals::take().unwrap();
38+
let dp = stm32l4x2::Peripherals::take().unwrap();
39+
40+
let mut flash = dp.FLASH.constrain(); // .constrain();
41+
let mut rcc = dp.RCC.constrain();
42+
43+
// Try a different clock configuration
44+
let clocks = rcc.cfgr.freeze(&mut flash.acr);
45+
// let clocks = rcc.cfgr
46+
// .sysclk(64.mhz())
47+
// .pclk1(32.mhz())
48+
// .freeze(&mut flash.acr);
49+
let mut timer = Delay::new(cp.SYST, clocks);
50+
51+
let rtc = Rtc::init(dp.RTC, &mut rcc.bdcr);
52+
let time = Time::new(0, 0, 19, false);
53+
rtc.set_time(&time);
54+
55+
timer.delay_ms(1000_u32);
56+
timer.delay_ms(1000_u32);
57+
timer.delay_ms(1000_u32);
58+
59+
let _time = rtc.get_time();
60+
61+
62+
writeln!(hstdout, "Good bye!").unwrap();
63+
loop {}
64+
}
65+
66+
exception!(HardFault, hard_fault);
67+
68+
fn hard_fault(ef: &ExceptionFrame) -> ! {
69+
panic!("{:#?}", ef);
70+
}
71+
72+
exception!(*, default_handler);
73+
74+
fn default_handler(irqn: i16) {
75+
panic!("Unhandled exception (IRQn = {})", irqn);
76+
}

src/datetime.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,21 @@ impl Into<Seconds> for Hours {
9191
Seconds(self.0 * 3600)
9292
}
9393
}
94+
95+
impl From <u32> for Seconds {
96+
fn from(inner: u32) -> Seconds {
97+
Seconds(inner)
98+
}
99+
}
100+
101+
impl From <u32> for Minutes {
102+
fn from(inner: u32) -> Minutes {
103+
Minutes(inner)
104+
}
105+
}
106+
107+
impl From <u32> for Hours {
108+
fn from(inner: u32) -> Hours {
109+
Hours(inner)
110+
}
111+
}

src/rtc.rs

Lines changed: 84 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,35 @@
11
/// RTC peripheral abstraction
22
33
use datetime::*;
4-
use rcc::{BDCR, Clocks};
5-
use stm32l4::stm32l4x2::{RTC, rtc};
4+
use rcc::{BDCR};
5+
use stm32l4::stm32l4x2::{RTC};
66

7+
#[derive(Clone,Copy,Debug)]
78
pub struct Time {
8-
seconds: Seconds,
9-
minutes: Minutes,
10-
hours: Hours,
9+
seconds: u8,
10+
minutes: u8,
11+
hours: u8,
1112
daylight_savings: bool
1213
}
1314

15+
impl Time {
16+
pub fn new(hours: u8, minutes: u8, seconds: u8, daylight_savings: bool) -> Self {
17+
Self {
18+
seconds: seconds,
19+
minutes: minutes,
20+
hours: hours,
21+
daylight_savings: daylight_savings
22+
}
23+
}
24+
}
25+
1426
/// RTC Abstraction
1527
pub struct Rtc {
1628
rtc: RTC
1729
}
1830

1931
impl Rtc {
20-
pub fn init(&self, rtc: RTC, bdcr: &mut BDCR) -> Self {
32+
pub fn init(rtc: RTC, bdcr: &mut BDCR) -> Self {
2133
bdcr.enr().modify(|_, w| unsafe {
2234
w.rtcsel()
2335
/*
@@ -31,9 +43,9 @@ impl Rtc {
3143
.set_bit()
3244
});
3345

34-
self.write_protection(&rtc, false);
46+
write_protection(&rtc, false);
3547
{
36-
self.init_mode(&rtc, true);
48+
init_mode(&rtc, true);
3749
{
3850
rtc.cr.modify(|_, w| unsafe {
3951
w.fmt()
@@ -57,7 +69,7 @@ impl Rtc {
5769
.bits(127)
5870
});
5971
}
60-
self.init_mode(&rtc, false);
72+
init_mode(&rtc, false);
6173

6274
rtc.or.modify(|_, w| {
6375
w.rtc_alarm_type()
@@ -67,61 +79,93 @@ impl Rtc {
6779
});
6880

6981
}
70-
self.write_protection(&rtc, true);
82+
write_protection(&rtc, true);
7183

7284
Self {
7385
rtc: rtc
7486
}
7587
}
7688

77-
fn init_mode(&self, rtc: &RTC, enabled: bool) {
78-
if enabled {
79-
rtc.isr.write(|w| unsafe { w.bits(0xFFFFFFFF) }); // Sets init mode
80-
while rtc.isr.read().initf().bit_is_clear() {} // wait to return to init state
81-
} else {
82-
rtc.isr.write(|w| { w.init().clear_bit() }); // Exits init mode
89+
pub fn set_time(&self, time: &Time){
90+
write_protection(&self.rtc, false);
91+
{
92+
init_mode(&self.rtc, true);
93+
{
94+
self.rtc.tr.write(|w| unsafe {
95+
w.pm()
96+
.clear_bit()
97+
.hu()
98+
.bits(byte_to_bcd2(time.hours as u8))
99+
.mnu()
100+
.bits(byte_to_bcd2(time.minutes as u8))
101+
.su()
102+
.bits(byte_to_bcd2(time.seconds as u8))
103+
104+
});
105+
106+
self.rtc.cr.modify(|_, w| {
107+
w.fmt()
108+
.bit(time.daylight_savings)
109+
110+
});
111+
}
112+
init_mode(&self.rtc, false);
83113
}
84-
114+
write_protection(&self.rtc, true);
85115
}
86116

87-
pub fn set_time(&self, time: Time){
88-
self.write_protection(&self.rtc, false);
117+
pub fn get_time(&self) -> Time {
118+
let time;
119+
write_protection(&self.rtc, false);
89120
{
90-
self.init_mode(&self.rtc, true);
121+
init_mode(&self.rtc, true);
91122
{
92-
self.rtc.tr.write(|w| {
93-
w.pm()
94-
.clear_bit()
95-
//TODO set time!
96-
})
123+
let timer = self.rtc.tr.read();
124+
let cr = self.rtc.cr.read();
125+
time = Time::new(timer.su().bits(), timer.mnu().bits(), timer.hu().bits(), cr.fmt().bit());
97126
}
98-
self.init_mode(&self.rtc, false);
127+
init_mode(&self.rtc, false);
99128
}
100-
self.write_protection(&self.rtc, true);
129+
write_protection(&self.rtc, true);
130+
time
101131
}
132+
133+
}
102134

103-
fn write_protection(&self, rtc: &RTC, enable: bool){
104-
if enable {
105-
rtc.wpr.write(|w| unsafe {
135+
fn write_protection(rtc: &RTC, enable: bool){
136+
if enable {
137+
rtc.wpr.write(|w| unsafe {
106138
w.bits(0xFF)
107-
});
108-
} else {
109-
rtc.wpr.write(|w| unsafe {
110-
w.bits(0xCA)
111-
});
139+
});
140+
} else {
141+
rtc.wpr.write(|w| unsafe {
142+
w.bits(0xCA)
143+
});
112144

113-
rtc.wpr.write(|w| unsafe {
114-
w.bits(0x53)
115-
});
116-
}
145+
rtc.wpr.write(|w| unsafe {
146+
w.bits(0x53)
147+
});
148+
}
149+
}
150+
151+
fn init_mode(rtc: &RTC, enabled: bool) {
152+
if enabled {
153+
let isr = rtc.isr.read();
154+
if isr.initf().bit_is_clear() {
155+
rtc.isr.write(|w| unsafe { w.bits(0xFFFFFFFF) }); // Sets init mode
156+
while rtc.isr.read().initf().bit_is_clear() {} // wait to return to init state
157+
}
158+
} else {
159+
rtc.isr.write(|w| { w.init().clear_bit() }); // Exits init mode
117160
}
161+
118162
}
119163

120164
fn byte_to_bcd2(byte: u8) -> u8{
121165
let mut bcd_high: u8 = 0;
122166
let mut value = byte;
123167

124-
while byte >= 10 {
168+
while value >= 10 {
125169
bcd_high += 1;
126170
value -= 10;
127171
}

0 commit comments

Comments
 (0)