From 4695b47da68a5b2f75270bea21e15b8f1b9fd6ff Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Mon, 25 Jul 2016 15:18:40 +0200 Subject: Switch to CMSIS --- ucoo/hal/adc/adc_hard.stm32f4.hh | 67 ++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 19 deletions(-) (limited to 'ucoo/hal/adc/adc_hard.stm32f4.hh') 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 -- cgit v1.2.3