Firmware SDK
twr_timer.c
1 #include <twr_timer.h>
2 #include <twr_error.h>
3 
4 typedef struct twr_timer_irq_t
5 {
6  void (*irq_handler)(void *);
7  void *irq_param;
9 
10 twr_timer_irq_t twr_timer_tim2_irq;
11 twr_timer_irq_t twr_timer_tim3_irq;
12 twr_timer_irq_t twr_timer_tim6_irq;
13 
14 const uint16_t _twr_timer_prescaler_lut[3] =
15 {
16  2,
17  15,
18  31,
19 };
20 
21 static int _twr_timer_lock_count = 0;
22 
23 inline void twr_timer_init(void)
24 {
25  RCC->APB2ENR |= RCC_APB2ENR_TIM22EN;
26 }
27 
28 inline void twr_timer_start(void)
29 {
30  if (_twr_timer_lock_count++ == 0)
31  {
32  TIM22->PSC = _twr_timer_prescaler_lut[twr_system_clock_get()]; // 7 instructions
33 
34  TIM22->CNT = 0;
35 
36  TIM22->EGR = TIM_EGR_UG;
37 
38  TIM22->CR1 |= TIM_CR1_CEN;
39  }
40 }
41 
42 inline void twr_timer_stop(void)
43 {
44  if (_twr_timer_lock_count < 1) twr_error(TWR_ERROR_ERROR_UNLOCK);
45 
46  if (_twr_timer_lock_count == 1)
47  {
48  TIM22->CR1 &= ~TIM_CR1_CEN;
49  }
50 
51  _twr_timer_lock_count--;
52 }
53 
54 inline uint16_t twr_timer_get_microseconds(void)
55 {
56  return TIM22->CNT;
57 }
58 
59 inline void twr_timer_delay(uint16_t microseconds)
60 {
61  uint16_t t = twr_timer_get_microseconds() + microseconds;
62 
63  while (twr_timer_get_microseconds() < t)
64  {
65  continue;
66  }
67 }
68 
69 inline void twr_timer_clear(void)
70 {
71  TIM22->CNT = 0;
72 }
73 
74 void twr_timer_clear_irq_handler(TIM_TypeDef *tim)
75 {
76  if (tim == TIM3)
77  {
78  twr_timer_tim3_irq.irq_handler = NULL;
79  }
80  if (tim == TIM6)
81  {
82  twr_timer_tim6_irq.irq_handler = NULL;
83  }
84 }
85 
86 bool twr_timer_set_irq_handler(TIM_TypeDef *tim, void (*irq_handler)(void *), void *irq_param)
87 {
88  if (tim == TIM3)
89  {
90  if (twr_timer_tim3_irq.irq_handler == NULL)
91  {
92  twr_timer_tim3_irq.irq_handler = irq_handler;
93  twr_timer_tim3_irq.irq_param = irq_param;
94  return true;
95  }
96  }
97  if (tim == TIM6)
98  {
99  if (twr_timer_tim6_irq.irq_handler == NULL)
100  {
101  twr_timer_tim6_irq.irq_handler = irq_handler;
102  twr_timer_tim6_irq.irq_param = irq_param;
103  return true;
104  }
105  }
106 
107  if (tim == TIM2)
108  {
109  if (twr_timer_tim2_irq.irq_handler == NULL)
110  {
111  twr_timer_tim2_irq.irq_handler = irq_handler;
112  twr_timer_tim2_irq.irq_param = irq_param;
113  return true;
114  }
115  }
116 
117  return false;
118 }
119 
120 void TIM3_IRQHandler(void)
121 {
122  if (twr_timer_tim3_irq.irq_handler)
123  {
124  twr_timer_tim3_irq.irq_handler(twr_timer_tim3_irq.irq_param);
125  }
126 }
127 
128 void TIM2_IRQHandler(void)
129 {
130  if (twr_timer_tim2_irq.irq_handler)
131  {
132  twr_timer_tim2_irq.irq_handler(twr_timer_tim2_irq.irq_param);
133  }
134 }
135 
136 void TIM6_IRQHandler()
137 {
138  if (twr_timer_tim6_irq.irq_handler)
139  {
140  twr_timer_tim6_irq.irq_handler(twr_timer_tim6_irq.irq_param);
141  }
142 }
void twr_timer_clear(void)
Clear timer counter.
Definition: twr_timer.c:69
uint16_t twr_timer_get_microseconds(void)
Get actual tick of timer.
Definition: twr_timer.c:54
void twr_timer_stop(void)
Stop timer.
Definition: twr_timer.c:42
bool twr_timer_set_irq_handler(TIM_TypeDef *tim, void(*irq_handler)(void *), void *irq_param)
Register timer IRQ handler.
Definition: twr_timer.c:86
void twr_timer_clear_irq_handler(TIM_TypeDef *tim)
Unregister timer IRQ handler.
Definition: twr_timer.c:74
void twr_timer_init(void)
Initialize timer.
Definition: twr_timer.c:23
void twr_timer_delay(uint16_t microseconds)
Relative delay.
Definition: twr_timer.c:59
void twr_timer_start(void)
Start timer.
Definition: twr_timer.c:28