diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2ae73e9..48ad357 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
## [Unreleased]
+### Changed
+
+- Extract register block address only once
+
## [v0.15.1] - 2019-08-11
### Fixed
diff --git a/src/gpio.rs b/src/gpio.rs
index eb569df..65081d2 100644
--- a/src/gpio.rs
+++ b/src/gpio.rs
@@ -204,17 +204,18 @@ macro_rules! gpio {
let offset = 2 * index;
let offset2 = 4 * index;
unsafe {
+ let reg = &(*$GPIOX::ptr());
if offset2 < 32 {
- &(*$GPIOX::ptr()).afrl.modify(|r, w| {
+ reg.afrl.modify(|r, w| {
w.bits((r.bits() & !(0b1111 << offset2)) | (mode << offset2))
});
} else {
let offset2 = offset2 - 32;
- &(*$GPIOX::ptr()).afrh.modify(|r, w| {
+ reg.afrh.modify(|r, w| {
w.bits((r.bits() & !(0b1111 << offset2)) | (mode << offset2))
});
}
- &(*$GPIOX::ptr()).moder.modify(|r, w| {
+ reg.moder.modify(|r, w| {
w.bits((r.bits() & !(0b11 << offset)) | (0b10 << offset))
});
}
@@ -297,10 +298,11 @@ macro_rules! gpio {
) -> $PXi> {
let offset = 2 * $i;
unsafe {
- &(*$GPIOX::ptr()).pupdr.modify(|r, w| {
+ let reg = &(*$GPIOX::ptr());
+ reg.pupdr.modify(|r, w| {
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
});
- &(*$GPIOX::ptr()).moder.modify(|r, w| {
+ reg.moder.modify(|r, w| {
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
});
}
@@ -313,10 +315,11 @@ macro_rules! gpio {
) -> $PXi> {
let offset = 2 * $i;
unsafe {
- &(*$GPIOX::ptr()).pupdr.modify(|r, w| {
+ let reg = &(*$GPIOX::ptr());
+ reg.pupdr.modify(|r, w| {
w.bits((r.bits() & !(0b11 << offset)) | (0b10 << offset))
});
- &(*$GPIOX::ptr()).moder.modify(|r, w| {
+ reg.moder.modify(|r, w| {
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
});
}
@@ -329,10 +332,11 @@ macro_rules! gpio {
) -> $PXi> {
let offset = 2 * $i;
unsafe {
- &(*$GPIOX::ptr()).pupdr.modify(|r, w| {
+ let reg = &(*$GPIOX::ptr());
+ reg.pupdr.modify(|r, w| {
w.bits((r.bits() & !(0b11 << offset)) | (0b01 << offset))
});
- &(*$GPIOX::ptr()).moder.modify(|r, w| {
+ reg.moder.modify(|r, w| {
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
});
}
@@ -345,10 +349,11 @@ macro_rules! gpio {
) -> $PXi {
let offset = 2 * $i;
unsafe {
- &(*$GPIOX::ptr()).pupdr.modify(|r, w| {
+ let reg = &(*$GPIOX::ptr());
+ reg.pupdr.modify(|r, w| {
w.bits((r.bits() & !(0b11 << offset)) | (0b00 << offset))
});
- &(*$GPIOX::ptr()).moder.modify(|r, w| {
+ reg.moder.modify(|r, w| {
w.bits((r.bits() & !(0b11 << offset)) | (0b11 << offset))
});
}
@@ -361,13 +366,14 @@ macro_rules! gpio {
) -> $PXi