Skyward boardcore
Loading...
Searching...
No Matches
BasicTimer.h
Go to the documentation of this file.
1/* Copyright (c) 2021 Skyward Experimental Rocketry
2 * Author: Alberto Nidasio
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 * THE SOFTWARE.
21 */
22
23#pragma once
24
25#include <utils/ClockUtils.h>
26
27#include "TimerUtils.h"
28
29namespace Boardcore
30{
31
79{
80public:
85 explicit BasicTimer(TIM_TypeDef* timer);
86
91
92 TIM_TypeDef* getTimer();
93
94 uint8_t getTimerNumber();
95
111 virtual void reset();
112
113 virtual void enable();
114
115 virtual void disable();
116
117 virtual bool isEnabled() final;
118
125 virtual void enableAutoReloadPreload() final;
126
133 virtual void disableAutoReloadPreload() final;
134
139 virtual void enableUpdateEventGeneration() final;
140
146 virtual void disableUpdateEventGeneration() final;
147
152 virtual void generateUpdate() final;
153
154 uint16_t readCounter();
155
156 void setCounter(uint16_t counterValue);
157
158 virtual uint16_t readPrescaler() final;
159
168 virtual void setPrescaler(uint16_t prescalerValue) final;
169
170 virtual int getFrequency() final;
171
177 virtual void setFrequency(int frequency) final;
178
179 uint16_t readAutoReloadRegister();
180
181 void setAutoReloadRegister(uint16_t autoReloadValue);
182
183 virtual void enableUpdateInterrupt() final;
184
185 virtual void disableUpdateInterrupt() final;
186
187 virtual void enableUpdateDMARequest() final;
188
189 virtual void disableUpdateDMARequest() final;
190
191 virtual void enableOnePulseMode() final;
192
193 virtual void disableOnePulseMode() final;
194
195 virtual void enableUGInterruptAndDMA() final;
196
197 virtual void disableUGInterruptAndDMA() final;
198
199 virtual void setMasterMode(TimerUtils::MasterMode masterMode);
200
201 static void clearUpdateInterruptFlag(TIM_TypeDef* timer);
202
203protected:
204 TIM_TypeDef* timer;
205};
206
207inline BasicTimer::BasicTimer(TIM_TypeDef* timer) : timer(timer)
208{
210}
211
213
214inline TIM_TypeDef* BasicTimer::getTimer() { return timer; }
215
217{
218 if (timer == TIM1)
219 return 1;
220 else if (timer == TIM2)
221 return 2;
222 else if (timer == TIM3)
223 return 3;
224 else if (timer == TIM4)
225 return 4;
226 else if (timer == TIM5)
227 return 5;
228 else if (timer == TIM6)
229 return 6;
230 else if (timer == TIM7)
231 return 7;
232 else if (timer == TIM8)
233 return 8;
234 else if (timer == TIM9)
235 return 9;
236 else if (timer == TIM10)
237 return 10;
238 else if (timer == TIM11)
239 return 11;
240 else if (timer == TIM12)
241 return 12;
242 else if (timer == TIM13)
243 return 13;
244 else if (timer == TIM14)
245 return 14;
246 else
247 return 0;
248}
249
250inline void BasicTimer::reset()
251{
252 timer->CR1 = 0;
253 timer->CR2 = 0;
254 timer->DIER = 0;
255 timer->CNT = 0;
256 timer->PSC = 0;
257 timer->ARR = 0xFFFF;
258}
259
260inline void BasicTimer::enable() { timer->CR1 |= TIM_CR1_CEN; }
261
262inline void BasicTimer::disable() { timer->CR1 &= ~TIM_CR1_CEN; }
263
264inline bool BasicTimer::isEnabled() { return timer->CR1 & TIM_CR1_CEN; }
265
267{
268 timer->CR1 |= TIM_CR1_ARPE;
269}
270
272{
273 timer->CR1 &= ~TIM_CR1_ARPE;
274}
275
277{
278 timer->CR1 &= ~TIM_CR1_UDIS;
279}
280
282{
283 timer->CR1 |= TIM_CR1_UDIS;
284}
285
286inline void BasicTimer::generateUpdate() { timer->EGR |= TIM_EGR_UG; }
287
288inline uint16_t BasicTimer::readCounter() { return timer->CNT; }
289
290inline void BasicTimer::setCounter(uint16_t counterValue)
291{
292 timer->CNT = counterValue;
293}
294
295inline uint16_t BasicTimer::readPrescaler() { return timer->PSC; }
296
297inline void BasicTimer::setPrescaler(uint16_t prescalerValue)
298{
299 timer->PSC = prescalerValue;
300}
301
303{
305}
306
307inline void BasicTimer::setFrequency(int frequency)
308{
310}
311
312inline uint16_t BasicTimer::readAutoReloadRegister() { return timer->ARR; }
313
314inline void BasicTimer::setAutoReloadRegister(uint16_t autoReloadValue)
315{
316 timer->ARR = autoReloadValue;
317}
318
319inline void BasicTimer::enableUpdateInterrupt() { timer->DIER |= TIM_DIER_UIE; }
320
322{
323 timer->DIER &= ~TIM_DIER_UIE;
324}
325
327{
328 timer->DIER |= TIM_DIER_UDE;
329}
330
332{
333 timer->DIER &= ~TIM_DIER_UDE;
334}
335
336inline void BasicTimer::enableOnePulseMode() { timer->CR1 |= TIM_CR1_OPM; }
337
338inline void BasicTimer::disableOnePulseMode() { timer->CR1 &= ~TIM_CR1_OPM; }
339
341{
342 timer->CR1 &= ~TIM_CR1_URS;
343}
344
346{
347 timer->CR1 |= TIM_CR1_URS;
348}
349
351{
352 // Only RESET, ENABLE, UPDATE are available on basic timers
353 if (masterMode > TimerUtils::MasterMode::UPDATE)
354 return;
355
356 // First clear the configuration
357 timer->CR2 &= ~TIM_CR2_MMS;
358
359 // Set the new value
360 timer->CR2 |= static_cast<uint32_t>(masterMode);
361}
362
363inline void BasicTimer::clearUpdateInterruptFlag(TIM_TypeDef* timer)
364{
365 timer->SR &= ~TIM_SR_UIF;
366}
367
368} // namespace Boardcore
Driver for STM32 basic timers.
Definition BasicTimer.h:79
BasicTimer(TIM_TypeDef *timer)
Create a BasicTimer object. Note that this does not resets the timer configuration but automatically ...
Definition BasicTimer.h:207
virtual bool isEnabled() final
Definition BasicTimer.h:264
virtual void setMasterMode(TimerUtils::MasterMode masterMode)
Definition BasicTimer.h:350
virtual void enableAutoReloadPreload() final
The auto reload register is buffered.
Definition BasicTimer.h:266
virtual void enableUpdateInterrupt() final
Definition BasicTimer.h:319
virtual void disableUpdateInterrupt() final
Definition BasicTimer.h:321
virtual void enableUpdateDMARequest() final
Definition BasicTimer.h:326
virtual void disableAutoReloadPreload() final
Tha auto reload register is not buffered.
Definition BasicTimer.h:271
virtual void disable()
Definition BasicTimer.h:262
~BasicTimer()
Disables the peripheral clock.
Definition BasicTimer.h:212
virtual uint16_t readPrescaler() final
Definition BasicTimer.h:295
static void clearUpdateInterruptFlag(TIM_TypeDef *timer)
Definition BasicTimer.h:363
virtual void generateUpdate() final
Re-initializes the timer counter and generate an update of the registers (the prescaler is cleared to...
Definition BasicTimer.h:286
TIM_TypeDef * timer
Definition BasicTimer.h:204
virtual void setPrescaler(uint16_t prescalerValue) final
Updated the prescaler value.
Definition BasicTimer.h:297
virtual void disableUGInterruptAndDMA() final
Definition BasicTimer.h:345
uint16_t readAutoReloadRegister()
Definition BasicTimer.h:312
virtual void disableOnePulseMode() final
Definition BasicTimer.h:338
virtual void enableUGInterruptAndDMA() final
Definition BasicTimer.h:340
TIM_TypeDef * getTimer()
Definition BasicTimer.h:214
virtual void setFrequency(int frequency) final
Allows to set directly the frequency of the timer's clock.
Definition BasicTimer.h:307
virtual void disableUpdateEventGeneration() final
The UEV is disabled.
Definition BasicTimer.h:281
virtual void enable()
Definition BasicTimer.h:260
virtual void enableUpdateEventGeneration() final
When enabled, the UEV is generated by the counter overflow and software UEV generation.
Definition BasicTimer.h:276
virtual void reset()
Resets the timer configuration to the default state.
Definition BasicTimer.h:250
void setAutoReloadRegister(uint16_t autoReloadValue)
Definition BasicTimer.h:314
virtual int getFrequency() final
Definition BasicTimer.h:302
virtual void disableUpdateDMARequest() final
Definition BasicTimer.h:331
void setCounter(uint16_t counterValue)
Definition BasicTimer.h:290
virtual void enableOnePulseMode() final
Definition BasicTimer.h:336
bool disablePeripheralClock(void *peripheral)
Disables a peripheral clock source from the APB1 and APB2 peripheral buses.
Definition ClockUtils.h:531
bool enablePeripheralClock(void *peripheral)
Enables a peripheral clock source from the APB1 and APB2 peripheral buses.
Definition ClockUtils.h:155
@ UPDATE
The UEV is selected as trigger output.
uint32_t getFrequency(TIM_TypeDef *timer)
Return the timer clock frequency.
Definition TimerUtils.h:392
uint16_t computePrescalerValue(TIM_TypeDef *timer, int targetFrequency)
Compute the prescaler value for the specified target frequency.
Definition TimerUtils.h:448
Driver for the VN100S IMU.