Mercurial > pub > halpp
comparison l476rg-hal-test/src/main.cpp @ 4:ca4f5b55b391
working on pwm
| author | cin | 
|---|---|
| date | Wed, 18 Jan 2017 03:27:00 +0300 | 
| parents | 3d9705e842f8 | 
| children | 0d3eea2dd7ea | 
   comparison
  equal
  deleted
  inserted
  replaced
| 3:3d9705e842f8 | 4:ca4f5b55b391 | 
|---|---|
| 43 **=========================================================================== | 43 **=========================================================================== | 
| 44 */ | 44 */ | 
| 45 | 45 | 
| 46 using namespace halpp; | 46 using namespace halpp; | 
| 47 | 47 | 
| 48 template <typename TDev> class TTimerTraits { | |
| 49 public: | |
| 50 static void SetPeriod(uint32_t period) { | |
| 51 } | |
| 52 | |
| 53 static void SetPrescaler(uint32_t prescaler) { | |
| 54 } | |
| 55 }; | |
| 56 | |
| 57 template <typename TDev> class TGenTimerTraits : public TTimerTraits<TDev> { | |
| 58 public: | |
| 59 static void SetDuty(uint32_t duty) { | |
| 60 TDev::instance().CCR1 = duty; | |
| 61 } | |
| 62 }; | |
| 63 | |
| 64 template < | |
| 65 typename TGpioDev, | |
| 66 unsigned short Pin, | |
| 67 typename TTimerDev, | |
| 68 unsigned short Ch, | |
| 69 typename TGpioTraits = TGpioTraits<TGpioDev>, | |
| 70 typename TTimerTraits = TGenTimerTraits<TTimerDev> | |
| 71 > class TPwmOut { | |
| 72 static uint32_t pwmPeriod; | |
| 73 public: | |
| 74 static void Init(uint32_t freq) { | |
| 75 pwmPeriod = TTimerDev::GetFreq()/freq - 1; | |
| 76 TTimerTraits::SetPeriod(pwmPeriod); | |
| 77 } | |
| 78 | |
| 79 static void SetDutyFactor(float f) { | |
| 80 TTimerTraits::SetDuty(pwmPeriod*f); | |
| 81 } | |
| 82 }; | |
| 83 | |
| 84 template < | |
| 85 typename TGpioDev, | |
| 86 unsigned short Pin, | |
| 87 typename TTimerDev, | |
| 88 unsigned short Ch, | |
| 89 typename TGpioTraits, | |
| 90 typename TTimerTraits | |
| 91 > uint32_t TPwmOut<TGpioDev, Pin, TTimerDev, Ch, TGpioTraits, TTimerTraits>::pwmPeriod = 0; | |
| 92 | |
| 48 template<typename TDev, unsigned short PIN, typename TTraits = TGpioTraits<TDev> > class TLed { | 93 template<typename TDev, unsigned short PIN, typename TTraits = TGpioTraits<TDev> > class TLed { | 
| 49 TLed(); | 94 TLed(); | 
| 50 explicit TLed(const TLed&); | 95 explicit TLed(const TLed&); | 
| 51 public: | 96 public: | 
| 52 static void Init() { | 97 static void Init() { | 
| 66 static void Toogle() { | 111 static void Toogle() { | 
| 67 TTraits::TooglePin(PIN); | 112 TTraits::TooglePin(PIN); | 
| 68 } | 113 } | 
| 69 }; | 114 }; | 
| 70 | 115 | 
| 71 template<typename TDev, typename TTraits = TGpioTraits<TDev> > class TLedInst { | |
| 72 const unsigned short m_ledNo; | |
| 73 | |
| 74 explicit TLedInst(const TLedInst&); | |
| 75 public: | |
| 76 TLedInst(unsigned short led) : m_ledNo(led) { | |
| 77 } | |
| 78 void Init() const { | |
| 79 TTraits::SetPinMode(m_ledNo, GpioModeOutput); | |
| 80 TTraits::SetPinOutputType(m_ledNo, GpioPushPull); | |
| 81 TTraits::SetPinPullMode(m_ledNo, GpioNoPull); | |
| 82 } | |
| 83 | |
| 84 void Set() const { | |
| 85 TTraits::WritePin(m_ledNo, 1); | |
| 86 } | |
| 87 | |
| 88 void Reset() const { | |
| 89 TTraits::WritePin(m_ledNo, 0); | |
| 90 } | |
| 91 | |
| 92 void Toogle() const { | |
| 93 TTraits::TooglePin(m_ledNo); | |
| 94 } | |
| 95 }; | |
| 96 | |
| 97 class AHB2Bus { | 116 class AHB2Bus { | 
| 98 public: | 117 public: | 
| 99 static void Enable(unsigned int flag) { | 118 static void Enable(unsigned int flag) { | 
| 100 RCC->AHB2ENR |= flag; | 119 RCC->AHB2ENR |= flag; | 
| 101 } | 120 } | 
| 116 | 135 | 
| 117 template<typename TBus, unsigned short ENF> class TDevice { | 136 template<typename TBus, unsigned short ENF> class TDevice { | 
| 118 public: | 137 public: | 
| 119 static void Enable() { | 138 static void Enable() { | 
| 120 TBus::Enable(ENF); | 139 TBus::Enable(ENF); | 
| 140 } | |
| 141 | |
| 142 static uint32_t GetFreq() { | |
| 143 return 80000000; | |
| 121 } | 144 } | 
| 122 }; | 145 }; | 
| 123 | 146 | 
| 124 class Hardware { | 147 class Hardware { | 
| 125 public: | 148 public: | 
| 128 static GPIO_TypeDef& instance() { | 151 static GPIO_TypeDef& instance() { | 
| 129 return *GPIOA; | 152 return *GPIOA; | 
| 130 } | 153 } | 
| 131 }; | 154 }; | 
| 132 | 155 | 
| 133 class Tim3: public TDevice<AHB1Bus, RCC_APB1ENR1_TIM3EN> { | 156 class Tim3: public TDevice<APB1Bus, RCC_APB1ENR1_TIM3EN> { | 
| 134 public: | 157 public: | 
| 135 static TIM_TypeDef& instance() { | 158 static TIM_TypeDef& instance() { | 
| 136 return *TIM3; | 159 return *TIM3; | 
| 137 } | 160 } | 
| 138 }; | 161 }; | 
| 139 | 162 | 
| 140 static const TLedInst<GpioA> greenLed; | 163 typedef TLed<GpioA, 5> GreenLed; | 
| 141 static const TLedInst<GpioA> led2; | 164 typedef TLed<GpioA, 6> Led2; | 
| 142 | 165 typedef TPwmOut<GpioA, 7, Tim3, 2> PwmLed3; | 
| 143 }; | 166 }; | 
| 144 | |
| 145 const TLedInst<Hardware::GpioA> Hardware::greenLed(5); | |
| 146 const TLedInst<Hardware::GpioA> Hardware::led2(5); | |
| 147 | 167 | 
| 148 int main(void) { | 168 int main(void) { | 
| 149 | 169 | 
| 150 /** | 170 /** | 
| 151 * IMPORTANT NOTE! | 171 * IMPORTANT NOTE! | 
| 158 */ | 178 */ | 
| 159 | 179 | 
| 160 /* TODO - Add your application code here */ | 180 /* TODO - Add your application code here */ | 
| 161 | 181 | 
| 162 Hardware::GpioA::Enable(); | 182 Hardware::GpioA::Enable(); | 
| 163 Hardware::greenLed.Init(); | 183 Hardware::Tim3::Enable(); | 
| 164 Hardware::led2.Init(); | 184 Hardware::GreenLed::Init(); | 
| 165 | 185 Hardware::Led2::Init(); | 
| 186 Hardware::PwmLed3::Init(1000); | |
| 187 | |
| 188 int ii = 0; | |
| 166 /* Infinite loop */ | 189 /* Infinite loop */ | 
| 167 while (1) { | 190 while (1) { | 
| 168 Hardware::greenLed.Toogle(); | 191 Hardware::GreenLed::Toogle(); | 
| 169 Hardware::led2.Toogle(); | 192 Hardware::Led2::Toogle(); | 
| 193 | |
| 194 Hardware::PwmLed3::SetDutyFactor(ii / 10.f); | |
| 195 | |
| 196 ii = (ii+1) % 11; // 0 .. 10 | |
| 170 | 197 | 
| 171 for (int i = 0; i < 1000000; i++) { | 198 for (int i = 0; i < 1000000; i++) { | 
| 199 | |
| 172 } | 200 } | 
| 173 } | 201 } | 
| 174 } | 202 } | 
