HardwareTimer.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * HardwareTimer.h
8  *
9  * Created 23.11.2015 by johndoe
10  *
11  ****/
12 
13 #pragma once
14 
15 #include "CallbackTimer.h"
16 #include <Platform/Clocks.h>
17 
31 };
32 
37 template <hw_timer_clkdiv_t clkdiv, HardwareTimerMode mode>
38 class Timer1Api : public CallbackTimerApi<Timer1Api<clkdiv, mode>>
39 {
40 public:
42  using TickType = uint32_t;
43  using TimeType = uint32_t;
44 
45  static constexpr const char* typeName()
46  {
47  return "Timer1Api";
48  }
49 
50  static constexpr TickType minTicks()
51  {
52  return Clock::template TimeConst<NanoTime::Microseconds, MIN_HW_TIMER1_INTERVAL_US>::ticks();
53  }
54 
55  static constexpr TickType maxTicks()
56  {
57  return Clock::maxTicks();
58  }
59 
60  static TickType ticks()
61  {
62  return Clock::ticks();
63  }
64 
66  {
67  assert(state == eTS_CallbackNotSet);
68  }
69 
71  {
72  detach_interrupt();
73  }
74 
75  __forceinline static void IRAM_ATTR setCallback(TimerCallback callback, void* arg)
76  {
77  if(callback == nullptr) {
78  detach_interrupt();
79  } else {
80  assert(state <= eTS_Disarmed);
82  reinterpret_cast<hw_timer_callback_t>(callback), arg);
83  state = eTS_Disarmed;
84  }
85  }
86 
87  __forceinline static void IRAM_ATTR setInterval(TickType interval)
88  {
89  Timer1Api::interval = interval;
90  }
91 
92  __forceinline static TickType IRAM_ATTR getInterval()
93  {
94  return interval;
95  }
96 
97  __forceinline static bool IRAM_ATTR isArmed()
98  {
99  return state >= eTS_Armed;
100  }
101 
102  __forceinline static void IRAM_ATTR arm(bool repeating)
103  {
104  State newState = repeating ? eTS_ArmedAutoLoad : eTS_Armed;
105  if(state != newState) {
106  hw_timer1_enable(clkdiv, TIMER_EDGE_INT, repeating);
107  state = newState;
108  }
109  hw_timer1_write(interval);
110  }
111 
112  __forceinline static void IRAM_ATTR disarm()
113  {
114  if(isArmed()) {
116  state = eTS_Disarmed;
117  }
118  }
119 
120 private:
121  __forceinline static void detach_interrupt()
122  {
123  disarm();
124  if(state > eTS_CallbackNotSet) {
126  state = eTS_CallbackNotSet;
127  }
128  }
129 
130 private:
131  enum State {
132  eTS_CallbackNotSet,
133  eTS_Disarmed,
134  eTS_Armed,
135  eTS_ArmedAutoLoad,
136  };
137  static uint8_t state;
138  static TickType interval;
139 };
140 
141 template <hw_timer_clkdiv_t clkdiv, HardwareTimerMode mode> uint8_t Timer1Api<clkdiv, mode>::state;
142 template <hw_timer_clkdiv_t clkdiv, HardwareTimerMode mode> uint32_t Timer1Api<clkdiv, mode>::interval;
143 
147 template <hw_timer_clkdiv_t clkdiv = TIMER_CLKDIV_16, HardwareTimerMode mode = eHWT_NonMaskable>
149 
154 
Callback timer class template.
Definition: CallbackTimer.h:76
Class template for Timer1 API.
Definition: HardwareTimer.h:39
uint32_t TimeType
Definition: HardwareTimer.h:43
static TickType ticks()
Definition: HardwareTimer.h:60
Timer1Api()
Definition: HardwareTimer.h:65
static constexpr TickType minTicks()
Definition: HardwareTimer.h:50
static void arm(bool repeating)
Definition: HardwareTimer.h:102
uint32_t TickType
Definition: HardwareTimer.h:42
static constexpr const char * typeName()
Definition: HardwareTimer.h:45
static void disarm()
Definition: HardwareTimer.h:112
~Timer1Api()
Definition: HardwareTimer.h:70
static bool isArmed()
Definition: HardwareTimer.h:97
static void setCallback(TimerCallback callback, void *arg)
Definition: HardwareTimer.h:75
static void setInterval(TickType interval)
Definition: HardwareTimer.h:87
static constexpr TickType maxTicks()
Definition: HardwareTimer.h:55
static TickType getInterval()
Definition: HardwareTimer.h:92
void(*)(void *arg) TimerCallback
Interrupt-compatible C callback function pointer.
Definition: CallbackTimer.h:23
HardwareTimerMode
Hardware Timer interrupt mode.
Definition: HardwareTimer.h:28
@ eHWT_Maskable
Definition: HardwareTimer.h:29
@ eHWT_NonMaskable
Definition: HardwareTimer.h:30
void hw_timer1_attach_interrupt(hw_timer_source_type_t source_type, hw_timer_callback_t callback, void *arg)
Attach an interrupt for the timer.
void hw_timer1_detach_interrupt(void)
Detach interrupt from the timer.
Definition: Esp8266/Components/driver/include/driver/hw_timer.h:126
void hw_timer1_disable(void)
Disable the timer.
Definition: Esp8266/Components/driver/include/driver/hw_timer.h:117
void hw_timer1_enable(hw_timer_clkdiv_t div, hw_timer_intr_type_t intr_type, bool auto_load)
Enable the timer.
Definition: Esp8266/Components/driver/include/driver/hw_timer.h:90
void hw_timer1_write(uint32_t ticks)
Set the timer interval.
Definition: Esp8266/Components/driver/include/driver/hw_timer.h:109
void(* hw_timer_callback_t)(void *arg)
Definition: Esp32/Components/driver/include/driver/hw_timer.h:69
@ TIMER_EDGE_INT
Definition: Esp32/Components/driver/include/driver/hw_timer.h:78
@ TIMER_FRC1_SOURCE
Definition: Esp32/Components/driver/include/driver/hw_timer.h:83
@ TIMER_NMI_SOURCE
Definition: Esp32/Components/driver/include/driver/hw_timer.h:84
Callback timer API class template.
Definition: CallbackTimer.h:30
Clock implementation for Hardware Timer 1.
Definition: Clocks.h:30
static uint32_t ticks()
Definition: Clocks.h:44