11/// RTC peripheral abstraction
22
33use 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 ) ]
78pub 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
1527pub struct Rtc {
1628 rtc : RTC
1729}
1830
1931impl 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
120164fn 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