From 4880fe19d33921616f9d32cc2dfe9c42e9150966 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Sun, 28 Apr 2013 00:37:52 +0200 Subject: digital/ucoolib/ucoolib/hal/gpio: add pull-up, pull-down and speed setting --- digital/ucoolib/ucoolib/hal/gpio/gpio.stm32f4.cc | 32 +++++++++++++++++++----- digital/ucoolib/ucoolib/hal/gpio/gpio.stm32f4.hh | 18 +++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) (limited to 'digital/ucoolib') diff --git a/digital/ucoolib/ucoolib/hal/gpio/gpio.stm32f4.cc b/digital/ucoolib/ucoolib/hal/gpio/gpio.stm32f4.cc index 60f540c8..db0b8857 100644 --- a/digital/ucoolib/ucoolib/hal/gpio/gpio.stm32f4.cc +++ b/digital/ucoolib/ucoolib/hal/gpio/gpio.stm32f4.cc @@ -66,20 +66,40 @@ Gpio::get () const return GPIO_IDR (port_) & mask_; } +/// Set two bits in a register for the corresponding one-bit mask. +static uint32_t +dmask_set (uint32_t mask, uint32_t reg, uint32_t bits) +{ + uint32_t dmask = mask * mask; + reg &= ~(dmask | dmask << 1); + reg |= bits * dmask; + return reg; +} + void Gpio::input () { - uint32_t mask = mask_; - uint32_t dmask = mask * mask; - GPIO_MODER (port_) &= ~(dmask | dmask << 1); + GPIO_MODER (port_) = dmask_set (mask_, GPIO_MODER (port_), + GPIO_MODE_INPUT); } void Gpio::output () { - uint32_t mask = mask_; - uint32_t dmask = mask * mask; - GPIO_MODER (port_) = (GPIO_MODER (port_) & ~(dmask << 1)) | dmask; + GPIO_MODER (port_) = dmask_set (mask_, GPIO_MODER (port_), + GPIO_MODE_OUTPUT); +} + +void +Gpio::pull (Pull dir) +{ + GPIO_PUPDR (port_) = dmask_set (mask_, GPIO_PUPDR (port_), dir); +} + +void +Gpio::speed (Speed s) +{ + GPIO_OSPEEDR (port_) = dmask_set (mask_, GPIO_OSPEEDR (port_), s); } } // namespace ucoo diff --git a/digital/ucoolib/ucoolib/hal/gpio/gpio.stm32f4.hh b/digital/ucoolib/ucoolib/hal/gpio/gpio.stm32f4.hh index 75727c34..24025a6c 100644 --- a/digital/ucoolib/ucoolib/hal/gpio/gpio.stm32f4.hh +++ b/digital/ucoolib/ucoolib/hal/gpio/gpio.stm32f4.hh @@ -32,6 +32,20 @@ namespace ucoo { /// General purpose input/output on STM32F4. class Gpio : public Io { + public: + enum Pull + { + PULL_NONE = GPIO_PUPD_NONE, + PULL_UP = GPIO_PUPD_PULLUP, + PULL_DOWN = GPIO_PUPD_PULLDOWN, + }; + enum Speed + { + SPEED_2MHZ = GPIO_OSPEED_2MHZ, + SPEED_25MHZ = GPIO_OSPEED_25MHZ, + SPEED_50MHZ = GPIO_OSPEED_50MHZ, + SPEED_100MHZ = GPIO_OSPEED_100MHZ, + }; public: /// Constructor, take the PORT base address, and pin BIT number. Gpio (uint32_t port, int bit); @@ -49,6 +63,10 @@ class Gpio : public Io void input (); /// See Io::output. void output (); + /// Set pull-up or pull-down. + void pull (Pull dir); + /// Set output speed. + void speed (Speed s); private: /// Port register base address. const uint32_t port_; -- cgit v1.2.3