diff l476rg-hal-test/src/main.cpp @ 5:0d3eea2dd7ea

working on devices and timers
author cin
date Fri, 20 Jan 2017 03:40:30 +0300
parents ca4f5b55b391
children ca42336826bd
line wrap: on
line diff
--- a/l476rg-hal-test/src/main.cpp	Wed Jan 18 03:27:00 2017 +0300
+++ b/l476rg-hal-test/src/main.cpp	Fri Jan 20 03:40:30 2017 +0300
@@ -45,51 +45,47 @@
 
 using namespace halpp;
 
-template <typename TDev> class TTimerTraits {
+template<typename TDev, typename TCounter = uint32_t> class TTimerBase {
 public:
-	static void SetPeriod(uint32_t period) {
+	typedef TCounter counter_t;
+
+	static void Init() {
+		TDev::instance()->EGR = TIM_EGR_UG;
+	}
+
+	static void period(counter_t value) {
+		TDev::instance()->ARR = value;
 	}
 
-	static void SetPrescaler(uint32_t prescaler) {
+	static counter_t period() {
+		return (counter_t) TDev::instance()->ARR;
 	}
-};
 
-template <typename TDev> class TGenTimerTraits : public TTimerTraits<TDev> {
-public:
-	static void SetDuty(uint32_t duty) {
-		TDev::instance().CCR1 = duty;
+	static void prescaler(counter_t value) {
+		TDev::instance()->PSC = value;
+	}
+
+	static counter_t prescaler() {
+		return TDev::instance()->PSC;
+	}
+
+	static uint32_t resolution() {
+		return TDev::frequency() / prescaler();
 	}
 };
 
-template <
-	typename TGpioDev,
-	unsigned short Pin,
-	typename TTimerDev,
-	unsigned short Ch,
-	typename TGpioTraits = TGpioTraits<TGpioDev>,
-	typename TTimerTraits = TGenTimerTraits<TTimerDev>
-> class TPwmOut {
-	static uint32_t pwmPeriod;
+template<typename TDev, typename TCounter = uint32_t> class TTimerChannel1 {
 public:
-	static void Init(uint32_t freq) {
-		pwmPeriod = TTimerDev::GetFreq()/freq - 1;
-		TTimerTraits::SetPeriod(pwmPeriod);
+	typedef TCounter counter_t;
+	static void duty(counter_t value) {
+		TDev::instance()->CCR1 = (uint32_t)value;
 	}
 
-	static void SetDutyFactor(float f) {
-		TTimerTraits::SetDuty(pwmPeriod*f);
+	static counter_t duty() {
+		return (counter_t)TDev::instance()->CCR1;
 	}
 };
 
-template <
-	typename TGpioDev,
-	unsigned short Pin,
-	typename TTimerDev,
-	unsigned short Ch,
-	typename TGpioTraits,
-	typename TTimerTraits
-> uint32_t TPwmOut<TGpioDev, Pin, TTimerDev, Ch, TGpioTraits, TTimerTraits>::pwmPeriod = 0;
-
 template<typename TDev, unsigned short PIN, typename TTraits = TGpioTraits<TDev> > class TLed {
 	TLed();
 	explicit TLed(const TLed&);
@@ -133,32 +129,25 @@
 	}
 };
 
-template<typename TBus, unsigned short ENF> class TDevice {
+template<typename TRegs, typename TBus, uint32_t BASE, uint32_t ENF> class TDevice {
 public:
+	static TRegs* instance() {
+		return (TRegs*) BASE;
+	}
+
 	static void Enable() {
 		TBus::Enable(ENF);
 	}
 
-	static uint32_t GetFreq() {
+	static uint32_t frequency() {
 		return 80000000;
 	}
 };
 
 class Hardware {
 public:
-	class GpioA: public TDevice<AHB2Bus, RCC_AHB2ENR_GPIOAEN> {
-	public:
-		static GPIO_TypeDef& instance() {
-			return *GPIOA;
-		}
-	};
-
-	class Tim3: public TDevice<APB1Bus, RCC_APB1ENR1_TIM3EN> {
-	public:
-		static TIM_TypeDef& instance() {
-			return *TIM3;
-		}
-	};
+	typedef TDevice<GPIO_TypeDef, GPIOA_BASE, AHB2Bus, RCC_AHB2ENR_GPIOAEN> GpioA;
+	typedef TDevice<TIM_TypeDef, TIM3_BASE, APB1Bus, RCC_APB1ENR1_TIM3EN> Tim3;
 
 	typedef TLed<GpioA, 5> GreenLed;
 	typedef TLed<GpioA, 6> Led2;
@@ -193,7 +182,7 @@
 
 		Hardware::PwmLed3::SetDutyFactor(ii / 10.f);
 
-		ii = (ii+1) % 11; // 0 .. 10
+		ii = (ii + 1) % 11; // 0 .. 10
 
 		for (int i = 0; i < 1000000; i++) {