summaryrefslogtreecommitdiff
path: root/ucoolib/hal
diff options
context:
space:
mode:
authorNicolas Schodet2013-04-28 00:37:52 +0200
committerNicolas Schodet2019-10-07 00:01:14 +0200
commite4fce6731441306aa09dfbfd02b9550c7e6c3b7f (patch)
treee0c69f37364e65090139d9b6431339b26d364762 /ucoolib/hal
parent55ae2f732eb0269b233dcc01ee3ae274bdacaec7 (diff)
ucoolib/hal/gpio: add pull-up, pull-down and speed setting
Diffstat (limited to 'ucoolib/hal')
-rw-r--r--ucoolib/hal/gpio/gpio.stm32f4.cc32
-rw-r--r--ucoolib/hal/gpio/gpio.stm32f4.hh18
2 files changed, 44 insertions, 6 deletions
diff --git a/ucoolib/hal/gpio/gpio.stm32f4.cc b/ucoolib/hal/gpio/gpio.stm32f4.cc
index 60f540c..db0b885 100644
--- a/ucoolib/hal/gpio/gpio.stm32f4.cc
+++ b/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/ucoolib/hal/gpio/gpio.stm32f4.hh b/ucoolib/hal/gpio/gpio.stm32f4.hh
index 75727c3..24025a6 100644
--- a/ucoolib/hal/gpio/gpio.stm32f4.hh
+++ b/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_;