summaryrefslogtreecommitdiffhomepage
path: root/digital/ucoolib
diff options
context:
space:
mode:
Diffstat (limited to 'digital/ucoolib')
-rw-r--r--digital/ucoolib/ucoolib/hal/gpio/gpio.stm32f4.cc32
-rw-r--r--digital/ucoolib/ucoolib/hal/gpio/gpio.stm32f4.hh18
2 files changed, 44 insertions, 6 deletions
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
@@ -33,6 +33,20 @@ namespace ucoo {
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);
/// See Io::set.
@@ -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_;