Mercurial > pub > halpp
comparison l476rg-hal-test/src/main.cpp @ 3:3d9705e842f8
working on rcc and bus
author | cin |
---|---|
date | Wed, 18 Jan 2017 01:07:59 +0300 |
parents | 0c59e7a7782a |
children | ca4f5b55b391 |
comparison
equal
deleted
inserted
replaced
2:0c59e7a7782a | 3:3d9705e842f8 |
---|---|
43 **=========================================================================== | 43 **=========================================================================== |
44 */ | 44 */ |
45 | 45 |
46 using namespace halpp; | 46 using namespace halpp; |
47 | 47 |
48 template<typename TDev, unsigned short PIN> class TLed { | 48 template<typename TDev, unsigned short PIN, typename TTraits = TGpioTraits<TDev> > class TLed { |
49 TDev& m_dev; | 49 TLed(); |
50 explicit TLed(const TLed&); | |
50 public: | 51 public: |
51 TLed(TDev& dev) : | 52 static void Init() { |
52 m_dev(dev) { | 53 TTraits::SetPinMode(PIN, GpioModeOutput); |
53 | 54 TTraits::SetPinOutputType(PIN, GpioPushPull); |
55 TTraits::SetPinPullMode(PIN, GpioNoPull); | |
54 } | 56 } |
55 | 57 |
58 static void Set() { | |
59 TTraits::WritePin(PIN, 1); | |
60 } | |
61 | |
62 static void Reset() { | |
63 TTraits::WritePin(PIN, 0); | |
64 } | |
65 | |
66 static void Toogle() { | |
67 TTraits::TooglePin(PIN); | |
68 } | |
69 }; | |
70 | |
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 } | |
56 void Init() const { | 78 void Init() const { |
57 m_dev.SetPinMode(5, halpp::GpioModeOutput); | 79 TTraits::SetPinMode(m_ledNo, GpioModeOutput); |
58 m_dev.SetPinOutputType(5, halpp::GpioOutputType::GpioPushPull); | 80 TTraits::SetPinOutputType(m_ledNo, GpioPushPull); |
59 m_dev.SetPinPullMode(5, halpp::GpioPullMode::GpioNoPull); | 81 TTraits::SetPinPullMode(m_ledNo, GpioNoPull); |
60 } | 82 } |
61 | 83 |
62 void Set() const { | 84 void Set() const { |
63 m_dev.WritePin(PIN, 1); | 85 TTraits::WritePin(m_ledNo, 1); |
64 } | 86 } |
65 | 87 |
66 void Reset() const { | 88 void Reset() const { |
67 m_dev.WritePin(PIN, 0); | 89 TTraits::WritePin(m_ledNo, 0); |
68 } | 90 } |
69 | 91 |
70 void Toogle() const { | 92 void Toogle() const { |
71 m_dev.TooglePin(PIN); | 93 TTraits::TooglePin(m_ledNo); |
72 } | 94 } |
73 }; | 95 }; |
74 | 96 |
75 class AHB2Bus { | 97 class AHB2Bus { |
76 public: | 98 public: |
77 static void Enable(unsigned int flag) { | 99 static void Enable(unsigned int flag) { |
78 RCC->AHB2ENR |= flag; | 100 RCC->AHB2ENR |= flag; |
79 } | 101 } |
80 }; | 102 }; |
81 | 103 |
104 class APB1Bus { | |
105 public: | |
106 static void Enable(unsigned int flag) { | |
107 RCC->APB1ENR1 |= flag; | |
108 } | |
109 }; | |
110 | |
111 class APB1Bus2 { | |
112 static void Enable(uint32_t flag) { | |
113 RCC->APB1ENR2 |= flag; | |
114 } | |
115 }; | |
116 | |
82 template<typename TBus, unsigned short ENF> class TDevice { | 117 template<typename TBus, unsigned short ENF> class TDevice { |
83 public: | 118 public: |
84 static void Enable() { | 119 static void Enable() { |
85 TBus::Enable(ENF); | 120 TBus::Enable(ENF); |
86 } | 121 } |
87 }; | 122 }; |
88 | 123 |
89 class GpioA : public TGpio<GPIO_TypeDef>, public TDevice<AHB2Bus, RCC_AHB2ENR_GPIOAEN> { | 124 class Hardware { |
90 static GpioA m_instance; | |
91 typedef TGpio<GPIO_TypeDef> GpioBase; | |
92 public: | 125 public: |
126 class GpioA: public TDevice<AHB2Bus, RCC_AHB2ENR_GPIOAEN> { | |
127 public: | |
128 static GPIO_TypeDef& instance() { | |
129 return *GPIOA; | |
130 } | |
131 }; | |
93 | 132 |
94 GpioA(GPIO_TypeDef& dev) : GpioBase(dev) { | 133 class Tim3: public TDevice<AHB1Bus, RCC_APB1ENR1_TIM3EN> { |
134 public: | |
135 static TIM_TypeDef& instance() { | |
136 return *TIM3; | |
137 } | |
138 }; | |
95 | 139 |
96 } | 140 static const TLedInst<GpioA> greenLed; |
141 static const TLedInst<GpioA> led2; | |
97 | 142 |
98 static GpioA& instance() { | |
99 return m_instance; | |
100 } | |
101 }; | 143 }; |
102 | 144 |
103 GpioA GpioA::m_instance(*GPIOA); | 145 const TLedInst<Hardware::GpioA> Hardware::greenLed(5); |
146 const TLedInst<Hardware::GpioA> Hardware::led2(5); | |
104 | 147 |
105 int main(void) { | 148 int main(void) { |
106 | 149 |
107 /** | 150 /** |
108 * IMPORTANT NOTE! | 151 * IMPORTANT NOTE! |
114 * E.g. SCB->VTOR = 0x20000000; | 157 * E.g. SCB->VTOR = 0x20000000; |
115 */ | 158 */ |
116 | 159 |
117 /* TODO - Add your application code here */ | 160 /* TODO - Add your application code here */ |
118 | 161 |
119 GpioA::Enable(); | 162 Hardware::GpioA::Enable(); |
120 | 163 Hardware::greenLed.Init(); |
121 TLed<halpp::TGpio<GPIO_TypeDef>, 5> led1(GpioA::instance()); | 164 Hardware::led2.Init(); |
122 led1.Init(); | |
123 | 165 |
124 /* Infinite loop */ | 166 /* Infinite loop */ |
125 while (1) { | 167 while (1) { |
126 led1.Toogle(); | 168 Hardware::greenLed.Toogle(); |
169 Hardware::led2.Toogle(); | |
127 | 170 |
128 for (int i = 0; i < 1000000; i++) { | 171 for (int i = 0; i < 1000000; i++) { |
129 } | 172 } |
130 } | 173 } |
131 } | 174 } |