Skip to content

Commit 9a1ba72

Browse files
committed
Extract the GPIO RegisterBlock address only once per function call
This improves code clarity and slightly reduces dev mode build sizes Signed-off-by: Daniel Egger <[email protected]>
1 parent a34f6c8 commit 9a1ba72

File tree

2 files changed

+39
-24
lines changed

2 files changed

+39
-24
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
77

88
## [Unreleased]
99

10+
### Changed
11+
12+
- Extract register block address only once
13+
1014
## [v0.15.1] - 2019-08-11
1115

1216
### Fixed

src/gpio.rs

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -204,17 +204,18 @@ macro_rules! gpio {
204204
let offset = 2 * index;
205205
let offset2 = 4 * index;
206206
unsafe {
207+
let reg = &(*$GPIOX::ptr());
207208
if offset2 < 32 {
208-
&(*$GPIOX::ptr()).afrl.modify(|r, w| {
209+
reg.afrl.modify(|r, w| {
209210
w.bits((r.bits() & !(0b1111 << offset2)) | (mode << offset2))
210211
});
211212
} else {
212213
let offset2 = offset2 - 32;
213-
&(*$GPIOX::ptr()).afrh.modify(|r, w| {
214+
reg.afrh.modify(|r, w| {
214215
w.bits((r.bits() & !(0b1111 << offset2)) | (mode << offset2))
215216
});
216217
}
217-
&(*$GPIOX::ptr()).moder.modify(|r, w| {
218+
reg.moder.modify(|r, w| {
218219
w.bits((r.bits() & !(0b11 << offset)) | (0b10 << offset))
219220
});
220221
}
@@ -297,10 +298,11 @@ macro_rules! gpio {
297298
) -> $PXi<Input<Floating>> {
298299
let offset = 2 * $i;
299300
unsafe {
300-
&(*$GPIOX::ptr()).pupdr.modify(|r, w| {
301+
let reg = &(*$GPIOX::ptr());
302+
reg.pupdr.modify(|r, w| {
301303
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
302304
});
303-
&(*$GPIOX::ptr()).moder.modify(|r, w| {
305+
reg.moder.modify(|r, w| {
304306
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
305307
});
306308
}
@@ -313,10 +315,11 @@ macro_rules! gpio {
313315
) -> $PXi<Input<PullDown>> {
314316
let offset = 2 * $i;
315317
unsafe {
316-
&(*$GPIOX::ptr()).pupdr.modify(|r, w| {
318+
let reg = &(*$GPIOX::ptr());
319+
reg.pupdr.modify(|r, w| {
317320
w.bits((r.bits() & !(0b11 << offset)) | (0b10 << offset))
318321
});
319-
&(*$GPIOX::ptr()).moder.modify(|r, w| {
322+
reg.moder.modify(|r, w| {
320323
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
321324
});
322325
}
@@ -329,10 +332,11 @@ macro_rules! gpio {
329332
) -> $PXi<Input<PullUp>> {
330333
let offset = 2 * $i;
331334
unsafe {
332-
&(*$GPIOX::ptr()).pupdr.modify(|r, w| {
335+
let reg = &(*$GPIOX::ptr());
336+
reg.pupdr.modify(|r, w| {
333337
w.bits((r.bits() & !(0b11 << offset)) | (0b01 << offset))
334338
});
335-
&(*$GPIOX::ptr()).moder.modify(|r, w| {
339+
reg.moder.modify(|r, w| {
336340
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
337341
});
338342
}
@@ -345,10 +349,11 @@ macro_rules! gpio {
345349
) -> $PXi<Analog> {
346350
let offset = 2 * $i;
347351
unsafe {
348-
&(*$GPIOX::ptr()).pupdr.modify(|r, w| {
352+
let reg = &(*$GPIOX::ptr());
353+
reg.pupdr.modify(|r, w| {
349354
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
350355
});
351-
&(*$GPIOX::ptr()).moder.modify(|r, w| {
356+
reg.moder.modify(|r, w| {
352357
w.bits((r.bits() & !(0b11 << offset)) | (0b11 << offset))
353358
});
354359
}
@@ -361,13 +366,14 @@ macro_rules! gpio {
361366
) -> $PXi<Output<OpenDrain>> {
362367
let offset = 2 * $i;
363368
unsafe {
364-
&(*$GPIOX::ptr()).pupdr.modify(|r, w| {
369+
let reg = &(*$GPIOX::ptr());
370+
reg.pupdr.modify(|r, w| {
365371
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
366372
});
367-
&(*$GPIOX::ptr()).otyper.modify(|r, w| {
373+
reg.otyper.modify(|r, w| {
368374
w.bits(r.bits() | (0b1 << $i))
369375
});
370-
&(*$GPIOX::ptr()).moder.modify(|r, w| {
376+
reg.moder.modify(|r, w| {
371377
w.bits((r.bits() & !(0b11 << offset)) | (0b01 << offset))
372378
});
373379
}
@@ -380,13 +386,14 @@ macro_rules! gpio {
380386
) -> $PXi<Output<PushPull>> {
381387
let offset = 2 * $i;
382388
unsafe {
383-
&(*$GPIOX::ptr()).pupdr.modify(|r, w| {
389+
let reg = &(*$GPIOX::ptr());
390+
reg.pupdr.modify(|r, w| {
384391
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
385392
});
386-
&(*$GPIOX::ptr()).otyper.modify(|r, w| {
393+
reg.otyper.modify(|r, w| {
387394
w.bits(r.bits() & !(0b1 << $i))
388395
});
389-
&(*$GPIOX::ptr()).moder.modify(|r, w| {
396+
reg.moder.modify(|r, w| {
390397
w.bits((r.bits() & !(0b11 << offset)) | (0b01 << offset))
391398
});
392399
}
@@ -400,16 +407,17 @@ macro_rules! gpio {
400407
) -> $PXi<Output<PushPull>> {
401408
let offset = 2 * $i;
402409
unsafe {
403-
&(*$GPIOX::ptr()).pupdr.modify(|r, w| {
410+
let reg = &(*$GPIOX::ptr());
411+
reg.pupdr.modify(|r, w| {
404412
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
405413
});
406-
&(*$GPIOX::ptr()).otyper.modify(|r, w| {
414+
reg.otyper.modify(|r, w| {
407415
w.bits(r.bits() & !(0b1 << $i))
408416
});
409-
&(*$GPIOX::ptr()).ospeedr.modify(|r, w| {
417+
reg.ospeedr.modify(|r, w| {
410418
w.bits(r.bits() & !(0b1 << $i))
411419
});
412-
&(*$GPIOX::ptr()).moder.modify(|r, w| {
420+
reg.moder.modify(|r, w| {
413421
w.bits((r.bits() & !(0b11 << offset)) | (0b01 << offset))
414422
});
415423
}
@@ -423,7 +431,8 @@ macro_rules! gpio {
423431
let offset = 2 * $i;
424432
let value = if on { 0b01 } else { 0b00 };
425433
unsafe {
426-
&(*$GPIOX::ptr()).pupdr.modify(|r, w| {
434+
let reg = &(*$GPIOX::ptr());
435+
reg.pupdr.modify(|r, w| {
427436
w.bits((r.bits() & !(0b11 << offset)) | (value << offset))
428437
});
429438
}
@@ -436,7 +445,8 @@ macro_rules! gpio {
436445
let offset = 2 * $i;
437446
let value = if on { 0b01 } else { 0b00 };
438447
unsafe {
439-
&(*$GPIOX::ptr()).pupdr.modify(|r, w| {
448+
let reg = &(*$GPIOX::ptr());
449+
reg.pupdr.modify(|r, w| {
440450
w.bits((r.bits() & !(0b11 << offset)) | (value << offset))
441451
});
442452
}
@@ -449,7 +459,8 @@ macro_rules! gpio {
449459
pub fn set_open_drain(self, _cs: &CriticalSection) -> Self {
450460
let offset = $i;
451461
unsafe {
452-
&(*$GPIOX::ptr()).otyper.modify(|r, w| {
462+
let reg = &(*$GPIOX::ptr());
463+
reg.otyper.modify(|r, w| {
453464
w.bits(r.bits() | (1 << offset))
454465
});
455466
}

0 commit comments

Comments
 (0)