27#ifndef HARDWARETIMER_H_
28#define HARDWARETIMER_H_
32#include "stm32yyxx_ll_tim.h"
34#if defined(HAL_TIM_MODULE_ENABLED) && !defined(HAL_TIM_MODULE_ONLY)
36#define TIMER_CHANNELS 4
42 TIMER_OUTPUT_COMPARE_ACTIVE,
43 TIMER_OUTPUT_COMPARE_INACTIVE,
44 TIMER_OUTPUT_COMPARE_TOGGLE,
45 TIMER_OUTPUT_COMPARE_PWM1,
46 TIMER_OUTPUT_COMPARE_PWM2,
47 TIMER_OUTPUT_COMPARE_FORCED_ACTIVE,
48 TIMER_OUTPUT_COMPARE_FORCED_INACTIVE,
51 TIMER_INPUT_CAPTURE_RISING,
52 TIMER_INPUT_CAPTURE_FALLING,
53 TIMER_INPUT_CAPTURE_BOTHEDGE,
58 TIMER_INPUT_FREQ_DUTY_MEASUREMENT,
60 TIMER_NOT_USED = 0xFFFF
70 RESOLUTION_1B_COMPARE_FORMAT = 1,
71 RESOLUTION_2B_COMPARE_FORMAT,
72 RESOLUTION_3B_COMPARE_FORMAT,
73 RESOLUTION_4B_COMPARE_FORMAT,
74 RESOLUTION_5B_COMPARE_FORMAT,
75 RESOLUTION_6B_COMPARE_FORMAT,
76 RESOLUTION_7B_COMPARE_FORMAT,
77 RESOLUTION_8B_COMPARE_FORMAT,
78 RESOLUTION_9B_COMPARE_FORMAT,
79 RESOLUTION_10B_COMPARE_FORMAT,
80 RESOLUTION_11B_COMPARE_FORMAT,
81 RESOLUTION_12B_COMPARE_FORMAT,
82 RESOLUTION_13B_COMPARE_FORMAT,
83 RESOLUTION_14B_COMPARE_FORMAT,
84 RESOLUTION_15B_COMPARE_FORMAT,
85 RESOLUTION_16B_COMPARE_FORMAT,
87 TICK_COMPARE_FORMAT = 0x80,
88 MICROSEC_COMPARE_FORMAT,
90 PERCENT_COMPARE_FORMAT,
91} TimerCompareFormat_t;
110} ChannelInputFilter_t;
115using callback_function_t = std::function<void(
void)>;
121 HardwareTimer(TIM_TypeDef *instance);
124 void setup(TIM_TypeDef *instance);
127 void pauseChannel(uint32_t channel);
129 void resumeChannel(uint32_t channel);
131 void setPrescaleFactor(uint32_t prescaler);
132 uint32_t getPrescaleFactor();
134 void setOverflow(uint32_t val, TimerFormat_t format = TICK_FORMAT);
135 uint32_t getOverflow(TimerFormat_t format = TICK_FORMAT);
137 void setPWM(uint32_t channel, PinName pin, uint32_t frequency, uint32_t dutycycle, callback_function_t PeriodCallback =
nullptr, callback_function_t CompareCallback =
nullptr);
138 void setPWM(uint32_t channel, uint32_t pin, uint32_t frequency, uint32_t dutycycle, callback_function_t PeriodCallback =
nullptr, callback_function_t CompareCallback =
nullptr);
140 void setCount(uint32_t val, TimerFormat_t format = TICK_FORMAT);
141 uint32_t getCount(TimerFormat_t format = TICK_FORMAT);
143 void setMode(uint32_t channel, TimerModes_t mode, PinName pin = NC, ChannelInputFilter_t filter = FILTER_NONE);
144 void setMode(uint32_t channel, TimerModes_t mode, uint32_t pin, ChannelInputFilter_t filter = FILTER_NONE);
146 TimerModes_t getMode(uint32_t channel);
148 void setPreloadEnable(
bool value);
150 uint32_t getCaptureCompare(uint32_t channel, TimerCompareFormat_t format = TICK_COMPARE_FORMAT);
151 void setCaptureCompare(uint32_t channel, uint32_t compare, TimerCompareFormat_t format = TICK_COMPARE_FORMAT);
153 void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority);
156 void attachInterrupt(callback_function_t callback);
157 void detachInterrupt();
160 void attachInterrupt(uint32_t channel, callback_function_t callback);
161 void detachInterrupt(uint32_t channel);
162 bool hasInterrupt(uint32_t channel);
163 void timerHandleDeinit();
168 uint32_t getTimerClkFreq();
170 static void captureCompareCallback(TIM_HandleTypeDef *htim);
171 static void updateCallback(TIM_HandleTypeDef *htim);
173 void updateRegistersIfNotRunning(TIM_TypeDef *TIMx);
176 bool isRunningChannel(uint32_t channel);
179 TIM_HandleTypeDef *getHandle();
180 int getChannel(uint32_t channel);
181 int getLLChannel(uint32_t channel);
182 int getIT(uint32_t channel);
183 int getAssociatedChannel(uint32_t channel);
184#if defined(TIM_CCER_CC1NE)
185 bool isComplementaryChannel[TIMER_CHANNELS];
188 TimerModes_t _ChannelMode[TIMER_CHANNELS];
189 timerObj_t _timerObj;
190 callback_function_t callbacks[1 + TIMER_CHANNELS];
193extern timerObj_t *HardwareTimer_Handle[TIMER_NUM];
195extern timer_index_t get_timer_index(TIM_TypeDef *htim);