summaryrefslogtreecommitdiff
path: root/ucoo/hal/adc/adc_hard.stm32f4.hh
diff options
context:
space:
mode:
authorNicolas Schodet2016-07-25 15:18:40 +0200
committerNicolas Schodet2019-10-09 23:05:44 +0200
commit4695b47da68a5b2f75270bea21e15b8f1b9fd6ff (patch)
tree6e5ef4d34ee69bcd6c6627f25a0ca3aa902d47e3 /ucoo/hal/adc/adc_hard.stm32f4.hh
parentd7df91926bdb529e68eff9a215aef72072803b6e (diff)
Switch to CMSIS
Diffstat (limited to 'ucoo/hal/adc/adc_hard.stm32f4.hh')
-rw-r--r--ucoo/hal/adc/adc_hard.stm32f4.hh67
1 files changed, 48 insertions, 19 deletions
diff --git a/ucoo/hal/adc/adc_hard.stm32f4.hh b/ucoo/hal/adc/adc_hard.stm32f4.hh
index 7ab0d7f..3947b7c 100644
--- a/ucoo/hal/adc/adc_hard.stm32f4.hh
+++ b/ucoo/hal/adc/adc_hard.stm32f4.hh
@@ -26,17 +26,47 @@
#include "ucoo/intf/adc.hh"
#include "ucoo/common.hh"
+#include "ucoo/arch/reg.hh"
+#include "ucoo/arch/rcc.stm32.hh"
+
namespace ucoo {
+class AdcHard;
+
+/// Single ADC channel.
+class AdcHardChannel : public Adc
+{
+ public:
+ /// See Adc::read.
+ inline int read ();
+ /// See Adc::get_resolution.
+ inline int get_resolution () const;
+ private:
+ /// Constructor.
+ AdcHardChannel (AdcHard &adc, int channel)
+ : adc_ (adc), channel_ (channel) { }
+ friend AdcHard;
+ private:
+ AdcHard &adc_;
+ int channel_;
+};
+
/// ADC interface. This control a full ADC, use AdcHardChannel for a single
/// channel.
class AdcHard
{
public:
static const int resolution = 1 << 12;
+ /// Available ADC.
+ enum class Instance
+ {
+ ADC1,
+ ADC2,
+ ADC3,
+ };
public:
- /// Constructor for the Nth ADC.
- AdcHard (int n);
+ /// Constructor for an ADC instance.
+ AdcHard (Instance inst);
/// Shutdown.
~AdcHard ();
/// Enable, power on.
@@ -45,28 +75,27 @@ class AdcHard
void disable ();
/// Make a single measure.
int read (int channel);
+ /// Return an ADC channel.
+ AdcHardChannel operator[] (int channel)
+ { return AdcHardChannel (*this, channel); }
private:
- /// ADC index.
- int n_;
/// ADC base address.
- uint32_t base_;
+ ADC_TypeDef * const base_;
+ /// ADC RCC identifier.
+ const Rcc rcc_;
};
-/// Single ADC channel.
-class AdcHardChannel : public Adc
+inline int
+AdcHardChannel::read ()
{
- public:
- /// Constructor.
- AdcHardChannel (AdcHard &adc, int channel)
- : adc_ (adc), channel_ (channel) { }
- /// See Adc::read.
- int read () { return adc_.read (channel_); }
- /// See Adc::get_resolution.
- int get_resolution () const { return AdcHard::resolution; }
- private:
- AdcHard &adc_;
- int channel_;
-};
+ return adc_.read (channel_);
+}
+
+inline int
+AdcHardChannel::get_resolution () const
+{
+ return AdcHard::resolution;
+}
} // namespace ucoo