summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVegard Storheil Eriksen <zyp@jvnv.net>2013-09-07 16:56:27 +0200
committerVegard Storheil Eriksen <zyp@jvnv.net>2013-09-07 16:56:27 +0200
commit7d2486346aa40160c5d03b217f58fac3875b64b3 (patch)
treec528c00722c379abcb2f3bdeb6c6e16bfde385da
parent75c06af86411da057d98d60d35405debf44a8f4f (diff)
Added PinArray class.
-rw-r--r--gpio/gpio.h42
1 files changed, 42 insertions, 0 deletions
diff --git a/gpio/gpio.h b/gpio/gpio.h
index 9d95b1d..705f3cf 100644
--- a/gpio/gpio.h
+++ b/gpio/gpio.h
@@ -143,14 +143,56 @@ class GPIO_t {
}
};
+ class PinArray {
+ private:
+ const GPIO_t& g;
+ int f;
+ int l;
+
+ constexpr uint32_t mask1() {
+ return ((2 << l) - 1) ^ ((1 << f) - 1);
+ }
+
+ constexpr uint32_t mask2() {
+ return ((4 << (l * 2)) - 1) ^ ((1 << (f * 2)) - 1);
+ }
+
+ public:
+ constexpr PinArray(const GPIO_t& gpio, int first, int last) : g(gpio), f(first), l(last) {}
+
+ #if defined(STM32F3) || defined(STM32F4)
+ void set_mode(Pin::Mode m) {
+ g.reg.MODER = (g.reg.MODER & ~mask2()) | ((0x55555555 * m) & mask2());
+ }
+
+ void set_pull(Pin::Pull p) {
+ g.reg.PUPDR = (g.reg.PUPDR & ~mask2()) | ((0x55555555 * p) & mask2());
+ }
+ #endif
+
+ void set(uint16_t value) {
+ value <<= f;
+ g.reg.BSRR = ((~value & mask1()) << 16) | (value & mask1());
+ }
+
+ uint16_t get() {
+ return g.reg.IDR & mask1();
+ }
+ };
+
constexpr GPIO_t(uint32_t reg_addr) : reg(*(GPIO_reg_t*)reg_addr) {}
constexpr Pin operator[](int pin) {
return Pin(*this, pin);
}
+
+ constexpr PinArray array(int first, int last) {
+ return PinArray(*this, first, last);
+ }
};
typedef GPIO_t::Pin Pin;
+typedef GPIO_t::PinArray PinArray;
#if defined(STM32F1)
static GPIO_t GPIOA(0x40010800);