@@ -13,13 +13,13 @@ extern crate panic_semihosting;
13
13
extern crate stm32f4xx_hal as hal;
14
14
15
15
use crate :: hal:: {
16
- prelude:: * ,
17
- spi:: Spi ,
18
- interrupt,
19
16
gpio:: { gpioa:: PA0 , Edge , ExtiPin , Input , PullDown } ,
20
- timer:: { Event , Timer } ,
17
+ interrupt,
18
+ prelude:: * ,
21
19
rcc:: { Clocks , Rcc } ,
20
+ spi:: Spi ,
22
21
stm32,
22
+ timer:: { Event , Timer } ,
23
23
} ;
24
24
25
25
use arrayvec:: ArrayString ;
@@ -30,21 +30,21 @@ use cortex_m::interrupt::{free, CriticalSection, Mutex};
30
30
31
31
use hal:: spi:: { Mode , Phase , Polarity } ;
32
32
33
- use micromath :: F32Ext ;
34
- use cortex_m_rt:: { ExceptionFrame , entry, exception} ;
33
+ use core :: f32 :: consts :: { FRAC_PI_2 , PI } ;
34
+ use cortex_m_rt:: { entry, exception, ExceptionFrame } ;
35
35
use embedded_graphics:: {
36
36
egcircle,
37
+ fonts:: { Font6x8 , Text } ,
38
+ pixelcolor:: BinaryColor ,
37
39
prelude:: * ,
38
- fonts:: { Font6x8 , Text } ,
39
40
primitive_style,
40
41
primitives:: { Circle , Line } ,
41
- pixelcolor:: BinaryColor ,
42
42
style:: TextStyleBuilder ,
43
43
style:: { PrimitiveStyle , PrimitiveStyleBuilder } ,
44
44
} ;
45
- use core :: f32 :: consts :: { FRAC_PI_2 , PI } ;
45
+ use micromath :: F32Ext ;
46
46
47
- use ssd1306:: { mode:: GraphicsMode , Builder as SSD1306Builder } ;
47
+ use ssd1306:: { mode:: GraphicsMode , Builder as SSD1306Builder } ;
48
48
use stm32f4:: stm32f429;
49
49
50
50
// Set up global state. It's all mutexed up for concurrency safety.
@@ -72,17 +72,16 @@ enum StopwatchState {
72
72
73
73
#[ entry]
74
74
fn main ( ) -> ! {
75
-
76
75
let mut dp = stm32f429:: Peripherals :: take ( ) . unwrap ( ) ;
77
- let cp = cortex_m:: peripheral:: Peripherals :: take ( ) . unwrap ( ) ;
76
+ let cp = cortex_m:: peripheral:: Peripherals :: take ( ) . unwrap ( ) ;
78
77
dp. RCC . apb2enr . write ( |w| w. syscfgen ( ) . enabled ( ) ) ;
79
78
80
79
let rcc = dp. RCC . constrain ( ) ;
81
80
82
81
let clocks = setup_clocks ( rcc) ;
83
82
84
83
let gpioa = dp. GPIOA . split ( ) ;
85
- let gpioe = dp. GPIOE . split ( ) ;
84
+ let gpioe = dp. GPIOE . split ( ) ;
86
85
87
86
let mut board_btn = gpioa. pa0 . into_pull_down_input ( ) ;
88
87
board_btn. make_interrupt_source ( & mut dp. SYSCFG ) ;
@@ -100,10 +99,16 @@ fn main() -> ! {
100
99
let miso = gpioe. pe5 . into_alternate_af5 ( ) ;
101
100
let mosi = gpioe. pe6 . into_alternate_af5 ( ) ;
102
101
103
- let spi = Spi :: spi4 ( dp. SPI4 , ( sck, miso, mosi) , Mode {
104
- polarity : Polarity :: IdleLow ,
105
- phase : Phase :: CaptureOnFirstTransition ,
106
- } , stm32f4xx_hal:: time:: KiloHertz ( 2000 ) . into ( ) , clocks) ;
102
+ let spi = Spi :: spi4 (
103
+ dp. SPI4 ,
104
+ ( sck, miso, mosi) ,
105
+ Mode {
106
+ polarity : Polarity :: IdleLow ,
107
+ phase : Phase :: CaptureOnFirstTransition ,
108
+ } ,
109
+ stm32f4xx_hal:: time:: KiloHertz ( 2000 ) . into ( ) ,
110
+ clocks,
111
+ ) ;
107
112
108
113
// Set up the LEDs. On the stm32f429i-disco they are connected to pin PG13 and PG14.
109
114
let gpiog = dp. GPIOG . split ( ) ;
@@ -123,25 +128,24 @@ fn main() -> ! {
123
128
disp. init ( ) . unwrap ( ) ;
124
129
disp. flush ( ) . unwrap ( ) ;
125
130
126
- // Create a 1ms periodic interrupt from TIM2
127
- let mut timer = Timer :: tim2 ( dp. TIM2 , 1 . khz ( ) , clocks) ;
128
- timer. listen ( Event :: TimeOut ) ;
131
+ // Create a 1ms periodic interrupt from TIM2
132
+ let mut timer = Timer :: tim2 ( dp. TIM2 , 1 . khz ( ) , clocks) ;
133
+ timer. listen ( Event :: TimeOut ) ;
129
134
130
- free ( |cs| {
131
- TIMER_TIM2 . borrow ( cs) . replace ( Some ( timer) ) ;
132
- BUTTON . borrow ( cs) . replace ( Some ( board_btn) ) ;
133
- } ) ;
135
+ free ( |cs| {
136
+ TIMER_TIM2 . borrow ( cs) . replace ( Some ( timer) ) ;
137
+ BUTTON . borrow ( cs) . replace ( Some ( board_btn) ) ;
138
+ } ) ;
134
139
135
- // Enable interrupts
136
- stm32:: NVIC :: unpend ( hal:: stm32:: Interrupt :: TIM2 ) ;
137
- stm32:: NVIC :: unpend ( hal:: stm32:: Interrupt :: EXTI0 ) ;
138
- unsafe {
139
- stm32:: NVIC :: unmask ( hal:: stm32:: Interrupt :: EXTI0 ) ;
140
- } ;
140
+ // Enable interrupts
141
+ stm32:: NVIC :: unpend ( hal:: stm32:: Interrupt :: TIM2 ) ;
142
+ stm32:: NVIC :: unpend ( hal:: stm32:: Interrupt :: EXTI0 ) ;
143
+ unsafe {
144
+ stm32:: NVIC :: unmask ( hal:: stm32:: Interrupt :: EXTI0 ) ;
145
+ } ;
141
146
142
147
let mut state_led = false ;
143
- loop {
144
-
148
+ loop {
145
149
let elapsed = free ( |cs| ELAPSED_MS . borrow ( cs) . get ( ) ) ;
146
150
147
151
let mut format_buf = ArrayString :: < [ u8 ; 10 ] > :: new ( ) ;
@@ -162,37 +166,41 @@ fn main() -> ! {
162
166
StopwatchState :: Ready => {
163
167
led3. set_high ( ) . unwrap ( ) ;
164
168
led4. set_low ( ) . unwrap ( ) ;
165
- } ,
169
+ }
166
170
StopwatchState :: Running => {
167
171
if state_led {
168
172
led4. set_low ( ) . unwrap ( ) ;
169
173
led3. set_high ( ) . unwrap ( ) ;
170
174
} else {
171
175
led4. set_low ( ) . unwrap ( ) ;
172
- led3. set_low ( ) . unwrap ( ) ;
176
+ led3. set_low ( ) . unwrap ( ) ;
173
177
}
174
- } ,
178
+ }
175
179
StopwatchState :: Stopped => {
176
180
led3. set_low ( ) . unwrap ( ) ;
177
181
led4. set_high ( ) . unwrap ( ) ;
178
- } ,
182
+ }
179
183
} ;
180
184
181
185
let text_style = TextStyleBuilder :: new ( Font6x8 )
182
186
. text_color ( BinaryColor :: On )
183
187
. build ( ) ;
184
-
188
+
185
189
Text :: new ( state_msg, Point :: new ( 0 , 0 ) )
186
190
. into_styled ( text_style)
187
- . draw ( & mut disp) . unwrap ( ) ;
188
-
189
- Text :: new ( format_buf. as_str ( ) , Point :: new ( ( 128 / 2 ) - 1 , 0 ) )
191
+ . draw ( & mut disp)
192
+ . unwrap ( ) ;
193
+
194
+ Text :: new ( format_buf. as_str ( ) , Point :: new ( ( 128 / 2 ) - 1 , 0 ) )
190
195
. into_styled ( text_style)
191
- . draw ( & mut disp) . unwrap ( ) ;
196
+ . draw ( & mut disp)
197
+ . unwrap ( ) ;
192
198
193
199
draw_face ( ) . draw ( & mut disp) . unwrap ( ) ;
194
- draw_seconds_hand ( elapsed_to_s ( elapsed) ) . draw ( & mut disp) . unwrap ( ) ;
195
-
200
+ draw_seconds_hand ( elapsed_to_s ( elapsed) )
201
+ . draw ( & mut disp)
202
+ . unwrap ( ) ;
203
+
196
204
disp. flush ( ) . unwrap ( ) ;
197
205
198
206
delay. delay_ms ( 100u32 ) ;
@@ -223,7 +231,7 @@ fn EXTI0() {
223
231
// cases but this one only starts and stops TIM2 interrupts
224
232
match state {
225
233
StopwatchState :: Ready => {
226
- ELAPSED_RESET_MS . borrow ( cs) . replace ( 0 ) ;
234
+ ELAPSED_RESET_MS . borrow ( cs) . replace ( 0 ) ;
227
235
stopwatch_start ( cs) ;
228
236
STATE . borrow ( cs) . replace ( StopwatchState :: Running ) ;
229
237
}
@@ -236,17 +244,17 @@ fn EXTI0() {
236
244
StopwatchState :: Stopped => {
237
245
let cell_reset = ELAPSED_RESET_MS . borrow ( cs) ;
238
246
let val_reset = cell_reset. get ( ) ;
239
-
240
- if val_reset > 500_u32 {
247
+
248
+ if val_reset > 500_u32 {
241
249
ELAPSED_MS . borrow ( cs) . replace ( 0 ) ;
242
250
stopwatch_reset_stop ( cs) ;
243
251
STATE . borrow ( cs) . replace ( StopwatchState :: Ready ) ;
244
- } else {
252
+ } else {
245
253
stopwatch_reset_stop ( cs) ;
246
254
stopwatch_continue ( cs) ;
247
255
STATE . borrow ( cs) . replace ( StopwatchState :: Running ) ;
248
- }
249
- }
256
+ }
257
+ }
250
258
}
251
259
}
252
260
} ) ;
@@ -261,22 +269,21 @@ fn TIM2() {
261
269
262
270
let cell = ELAPSED_MS . borrow ( cs) ;
263
271
let cell_reset = ELAPSED_RESET_MS . borrow ( cs) ;
264
- let val = cell. get ( ) ;
272
+ let val = cell. get ( ) ;
265
273
let val_reset = cell_reset. get ( ) ;
266
274
267
275
match STATE . borrow ( cs) . get ( ) {
268
- StopwatchState :: Ready => {
276
+ StopwatchState :: Ready => {
269
277
cell. replace ( val + 1 ) ;
270
278
}
271
279
StopwatchState :: Running => {
272
280
cell. replace ( val + 1 ) ;
273
281
}
274
282
StopwatchState :: Stopped => {
275
-
276
283
let mut btn_ref = BUTTON . borrow ( cs) . borrow_mut ( ) ;
277
284
if let Some ( ref mut btn) = btn_ref. deref_mut ( ) {
278
285
if btn. is_high ( ) . unwrap ( ) {
279
- cell_reset. replace ( val_reset + 1 ) ;
286
+ cell_reset. replace ( val_reset + 1 ) ;
280
287
}
281
288
}
282
289
}
@@ -403,4 +410,3 @@ fn draw_seconds_hand(seconds: u32) -> impl Iterator<Item = Pixel<BinaryColor>> {
403
410
fn HardFault ( ef : & ExceptionFrame ) -> ! {
404
411
panic ! ( "{:#?}" , ef) ;
405
412
}
406
-
0 commit comments