VSF Documented
vsf_template_timer.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18#ifndef __VSF_TEMPLATE_TIMER_H__
19#define __VSF_TEMPLATE_TIMER_H__
20
21/*============================ INCLUDES ======================================*/
22
24#include "hal/arch/vsf_arch.h"
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30/*============================ MACROS ========================================*/
31
38#ifndef VSF_TIMER_CFG_MULTI_CLASS
39# define VSF_TIMER_CFG_MULTI_CLASS ENABLED
40#endif
41
50#if defined(VSF_HW_TIMER_COUNT) && !defined(VSF_HW_TIMER_MASK)
51# define VSF_HW_TIMER_MASK VSF_HAL_COUNT_TO_MASK(VSF_HW_TIMER_COUNT)
52#endif
53
54#if defined(VSF_HW_TIMER_MASK) && !defined(VSF_HW_TIMER_COUNT)
55# define VSF_HW_TIMER_COUNT VSF_HAL_MASK_TO_COUNT(VSF_HW_TIMER_MASK)
56#endif
57
64#ifndef VSF_TIMER_CFG_PREFIX
65# if VSF_TIMER_CFG_MULTI_CLASS == ENABLED
66# define VSF_TIMER_CFG_PREFIX vsf
67# elif defined(VSF_HW_TIMER_COUNT) && (VSF_HW_TIMER_COUNT != 0)
68# define VSF_TIMER_CFG_PREFIX vsf_hw
69# else
70# define VSF_TIMER_CFG_PREFIX vsf
71# endif
72#endif
73
80#ifndef VSF_TIMER_CFG_FUNCTION_RENAME
81# define VSF_TIMER_CFG_FUNCTION_RENAME ENABLED
82#endif
83
92#ifndef VSF_TIMER_CFG_REIMPLEMENT_TYPE_IRQ_MASK
93# define VSF_TIMER_CFG_REIMPLEMENT_TYPE_IRQ_MASK DISABLED
94#endif
95
106#ifndef VSF_TIMER_CFG_REIMPLEMENT_TYPE_CFG
107# define VSF_TIMER_CFG_REIMPLEMENT_TYPE_CFG DISABLED
108#endif
109
118#ifndef VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE
119# define VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE DISABLED
120#endif
121
131#ifndef VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG
132# define VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG DISABLED
133#endif
134
144#ifndef VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_REQUEST
145# define VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_REQUEST DISABLED
146#endif
147
156#ifndef VSF_TIMER_CFG_REIMPLEMENT_TYPE_STATUS
157# define VSF_TIMER_CFG_REIMPLEMENT_TYPE_STATUS DISABLED
158#endif
159
168#ifndef VSF_TIMER_CFG_REIMPLEMENT_TYPE_CTRL
169# define VSF_TIMER_CFG_REIMPLEMENT_TYPE_CTRL DISABLED
170#endif
171
180#ifndef VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_CTRL
181# define VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_CTRL DISABLED
182#endif
183
193#ifndef VSF_TIMER_CFG_REIMPLEMENT_TYPE_CAPABILITY
194# define VSF_TIMER_CFG_REIMPLEMENT_TYPE_CAPABILITY DISABLED
195#endif
196
204#ifndef VSF_TIMER_CFG_INHERIT_HAL_CAPABILITY
205# define VSF_TIMER_CFG_INHERIT_HAL_CAPABILITY ENABLED
206#endif
207
208/*============================ MACROFIED FUNCTIONS ===========================*/
209
216#define VSF_TIMER_APIS(__prefix_name) \
217 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, init, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, vsf_timer_cfg_t *cfg_ptr) \
218 __VSF_HAL_TEMPLATE_API(__prefix_name, void, timer, fini, VSF_MCONNECT(__prefix_name, _t) *timer_ptr) \
219 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, get_configuration, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, vsf_timer_cfg_t *cfg_ptr) \
220 __VSF_HAL_TEMPLATE_API(__prefix_name, fsm_rt_t, timer, enable, VSF_MCONNECT(__prefix_name, _t) *timer_ptr) \
221 __VSF_HAL_TEMPLATE_API(__prefix_name, fsm_rt_t, timer, disable, VSF_MCONNECT(__prefix_name, _t) *timer_ptr) \
222 __VSF_HAL_TEMPLATE_API(__prefix_name, void, timer, irq_enable, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, vsf_timer_irq_mask_t irq_mask) \
223 __VSF_HAL_TEMPLATE_API(__prefix_name, void, timer, irq_disable, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, vsf_timer_irq_mask_t irq_mask) \
224 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_timer_status_t, timer, status, VSF_MCONNECT(__prefix_name, _t) *timer_ptr) \
225 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_timer_capability_t, timer, capability, VSF_MCONNECT(__prefix_name, _t) *timer_ptr) \
226 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, set_period, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, uint32_t period) \
227 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, ctrl, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, vsf_timer_ctrl_t ctrl, void* param) \
228 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, channel_config, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, uint8_t channel, vsf_timer_channel_cfg_t *channel_cfg_ptr) \
229 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, channel_start, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, uint8_t channel) \
230 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, channel_stop, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, uint8_t channel) \
231 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, channel_request_start, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, uint8_t channel, vsf_timer_channel_request_t *request_ptr) \
232 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, channel_request_stop, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, uint8_t channel) \
233 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, channel_ctrl, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, uint8_t channel, vsf_timer_channel_ctrl_t ctrl, void* param)
234
235/*============================ TYPES =========================================*/
236
237#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE == DISABLED
239 // channel mode : different timer channel may support different mode
240 // Base Mode : The timer channel will be used as a base timer
242
243 /*
244 // \~english Some timer may support more mode like PWM, Output Compare etc.
245 // \~chinese 有些定时器可能支持更多的模式,如 PWM、输出比较等。
246
247 // \~english PWM(Pulse Width Modulation) Mode : The timer channel will be used as a
248 // PWM output, all channels's period should be the same
249 // \~chinese PWM(脉宽调制)模式:定时器通道将用作 PWM 输出,所有通道的周期应该相同
250 VSF_TIMER_CHANNEL_MODE_PWM = (0x01 << 0),
251 #define VSF_TIMER_CHANNEL_MODE_PWM VSF_TIMER_CHANNEL_MODE_PWM
252
253 // \~english Output Compare Mode: The timer channel will be used as a output compare,
254 // different channels can have different period (change pin level in interrupt)
255 // PWM mode can be seen as a special case of output compare mode, that is all
256 // channels have the same period.
257 // \~chinese 输出比较模式:定时器通道将用作输出比较,不同通道可以有不同的周期(在中断中改变引脚电平)。
258 // PWM 模式可以看作是输出比较模式的一种特殊情况,即所有通道的周期相同。
259 VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE = (0x02 << 0),
260 #define VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE
261
262 // \~english Input Capture Mode : The timer channel will be used as a input capture
263 // \~chinese 输入捕获模式:定时器通道将用作输入捕获
264 VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE = (0x03 << 0),
265 #define VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE
266
267 // \~english Encoder Mode : The timer channel will be used as a encoder
268 // \~chinese 编码器模式:定时器通道将用作编码器
269 VSF_TIMER_CHANNEL_MODE_ENCODER = (0x04 << 0),
270 #define VSF_TIMER_CHANNEL_MODE_ENCODER VSF_TIMER_CHANNEL_MODE_ENCODER
271
272 // \~english One Pulse Mode : The timer channel will be used as a one pulse mode
273 // \~chinese 单脉冲模式:定时器通道将用作单脉冲模式
274 VSF_TIMER_CHANNEL_MODE_ONE_PULSE = (0x05 << 0),
275 #define VSF_TIMER_CHANNEL_MODE_ONE_PULSE VSF_TIMER_CHANNEL_MODE_ONE_PULSE
276
277 // \~english Hall Sensor Mode : The timer channel will be used as a hall sensor
278 // \~chinese 霍尔传感器模式:定时器通道将用作霍尔传感器
279 VSF_TIMER_CHANNEL_MODE_HALL_SENSOR = (0x06 << 0),
280 #define VSF_TIMER_CHANNEL_MODE_HALL_SENSOR VSF_TIMER_CHANNEL_MODE_HALL_SENSOR
281 */
282
283 /********************************************************************************/
286
287 // Counter Mode
288 // Oneshot : The timer will stop after the first overflow
290 // Continues : The timer will continue to count after overflow
292 /*
293 // \~english Some timer may support more counter direction like center-aligned etc.
294 // The following mode only valid for VSF_TIMER_CHANNEL_MODE_BASE
295 // \~chinese 有些定时器可能支持更多的计数模式,如中心对齐等。以下模式仅适用于 VSF_TIMER_CHANNEL_MODE_BASE
296 VSF_TIMER_BASE_COUNTER_UP = (0x00 << 4),
297 VSF_TIMER_BASE_COUNTER_DOWN = (0x01 << 4),
298 VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED1 = (0x02 << 4),
299 VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED2 = (0x03 << 4),
300 VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED3 = (0x04 << 4),
301 #define VSF_TIMER_BASE_COUNTER_UP VSF_TIMER_BASE_COUNTER_UP
302 #define VSF_TIMER_BASE_COUNTER_DOWN VSF_TIMER_BASE_COUNTER_DOWN
303 #define VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED1 VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED1
304 #define VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED2 VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED2
305 #define VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED3 VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED3
306 */
307
308 /*
309 // \~english Some timer may support more clock division like 1, 2, 4 etc.
310 // \~chinese 有些定时器可能支持更多的时钟分频,如 1、2、4 等。
311 VSF_TIEMR_BASE_CLOCKDIVISION_DIV_1 = (0x00 << 8),
312 VSF_TIEMR_BASE_CLOCKDIVISION_DIV_2 = (0x01 << 8),
313 VSF_TIEMR_BASE_CLOCKDIVISION_DIV_4 = (0x02 << 8),
314 #define VSF_TIEMR_BASE_CLOCKDIVISION_DIV_1 VSF_TIEMR_BASE_CLOCKDIVISION_DIV_1
315 #define VSF_TIEMR_BASE_CLOCKDIVISION_DIV_2 VSF_TIEMR_BASE_CLOCKDIVISION_DIV_2
316 #define VSF_TIEMR_BASE_CLOCKDIVISION_DIV_4 VSF_TIEMR_BASE_CLOCKDIVISION_DIV_4
317 */
318
319 /********************************************************************************/
320 /*
321 // \~english The following mode only valid for VSF_TIMER_CHANNEL_MODE_PWM
322 // \~chinese 以下模式仅适用于 VSF_TIMER_CHANNEL_MODE_PWM
323 // Output Compare Mode
324 VSF_TIMER_OUTPUT_COMPARE_ACTIVE = (0x00 << 4),
325 VSF_TIMER_OUTPUT_COMPARE_INACTIVE = (0x01 << 4),
326 VSF_TIMER_OUTPUT_COMPARE_TOGGLE = (0x02 << 4),
327 VSF_TIMER_OUTPUT_COMPARE_PWM1 = (0x03 << 4),
328 VSF_TIMER_OUTPUT_COMPARE_PWM2 = (0x04 << 4),
329 VSF_TIMER_OUTPUT_COMPARE_FORCED_ACTIVE = (0x05 << 4),
330 VSF_TIMER_OUTPUT_COMPARE_FORCED_INACTIVE = (0x06 << 4),
331 #define VSF_TIMER_OUTPUT_COMPARE_ACTIVE VSF_TIMER_OUTPUT_COMPARE_ACTIVE
332 #define VSF_TIMER_OUTPUT_COMPARE_INACTIVE VSF_TIMER_OUTPUT_COMPARE_INACTIVE
333 #define VSF_TIMER_OUTPUT_COMPARE_TOGGLE VSF_TIMER_OUTPUT_COMPARE_TOGGLE
334 #define VSF_TIMER_OUTPUT_COMPARE_PWM1 VSF_TIMER_OUTPUT_COMPARE_PWM1
335 #define VSF_TIMER_OUTPUT_COMPARE_PWM2 VSF_TIMER_OUTPUT_COMPARE_PWM2
336 #define VSF_TIMER_OUTPUT_COMPARE_FORCED_ACTIVE VSF_TIMER_OUTPUT_COMPARE_FORCED_ACTIVE
337 #define VSF_TIMER_OUTPUT_COMPARE_FORCED_INACTIVE VSF_TIMER_OUTPUT_COMPARE_FORCED_INACTIVE
338 */
339
340 /********************************************************************************/
341 /*
342 // \~english The following mode only valid for VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE
343 // \~chinese 以下模式仅适用于 VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE
344
345 // \~english Output Compare Polarity and N Polarity
346 // \~chinese 输出比较极性和 N 极性
347 VSF_TIMER_OUTPUT_COMPARE_POLARITY_HIGH = (0x00 << 8),
348 VSF_TIMER_OUTPUT_COMPARE_POLARITY_LOW = (0x01 << 8),
349 VSF_TIMER_OUTPUT_COMPARE_N_POLARITY_HIGH = (0x00 << 8),
350 VSF_TIMER_OUTPUT_COMPARE_N_POLARITY_LOW = (0x01 << 8),
351 #define VSF_TIMER_OUTPUT_COMPARE_POLARITY_HIGH VSF_TIMER_OUTPUT_COMPARE_POLARITY_HIGH
352 #define VSF_TIMER_OUTPUT_COMPARE_POLARITY_LOW VSF_TIMER_OUTPUT_COMPARE_POLARITY_LOW
353 #define VSF_TIMER_OUTPUT_COMPARE_N_POLARITY_HIGH VSF_TIMER_OUTPUT_COMPARE_N_POLARITY_HIGH
354 #define VSF_TIMER_OUTPUT_COMPARE_N_POLARITY_LOW VSF_TIMER_OUTPUT_COMPARE_N_POLARITY_LOW
355 */
356
357 /********************************************************************************/
358 /*
359 // \~english The following mode only valid for VSF_TIMER_CHANNEL_MODE_PWM
360 // \~chinese 以下模式仅适用于 VSF_TIMER_CHANNEL_MODE_PWM
361
362 // \~english PWM Output Polarity
363 // \~chinese PWM 输出极性
364 VSF_TIMER_PWM_OUTPUT_POLARITY_HIGH = (0x00 << 4),
365 VSF_TIMER_PWM_OUTPUT_POLARITY_LOW = (0x01 << 4),
366 #define VSF_TIMER_PWM_OUTPUT_POLARITY_HIGH VSF_TIMER_PWM_OUTPUT_POLARITY_HIGH
367 #define VSF_TIMER_PWM_OUTPUT_POLARITY_LOW VSF_TIMER_PWM_OUTPUT_POLARITY_LOW
368 */
369
370 /********************************************************************************/
371 /*
372 // \~english The following mode only valid for VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE
373 // \~chinese 以下模式仅适用于 VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE
374
375 // \~english Input Capture Polarity
376 // \~chinese 输入捕获极性
377 VSF_TIMER_INPUT_CAPTURE_POLARITY_RISING = (0x00 << 4),
378 VSF_TIMER_INPUT_CAPTURE_POLARITY_FALLING = (0x01 << 4),
379 VSF_TIMER_INPUT_CAPTURE_POLARITY_BOTH = (0x02 << 4),
380 #define VSF_TIMER_INPUT_CAPTURE_POLARITY_RISING VSF_TIMER_INPUT_CAPTURE_POLARITY_RISING
381 #define VSF_TIMER_INPUT_CAPTURE_POLARITY_FALLING VSF_TIMER_INPUT_CAPTURE_POLARITY_FALLING
382 #define VSF_TIMER_INPUT_CAPTURE_POLARITY_BOTH VSF_TIMER_INPUT_CAPTURE_POLARITY_BOTH
383
384 // \~english Input Capture Filter
385 // \~chinese 输入捕获滤波
386 VSF_TIMER_INPUT_CAPTURE_FILTER_MASK = (0x0F << 4),
387 VSF_TIMER_INPUT_CAPTURE_FILTER_OFFSET = 4,
388 */
389
390 /********************************************************************************/
391 /*
392 // \~english The following mode only valid for VSF_TIMER_CHANNEL_MODE_ENCODER
393 // \~chinese 以下模式仅适用于 VSF_TIMER_CHANNEL_MODE_ENCODER
394
395 // \~english Encoder Mode
396 // \~chinese 编码器模式
397 VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_RISING = (0x00 << 4),
398 VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_FALLING = (0x01 << 4),
399 VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_BOTH = (0x02 << 4),
400 VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_RISING = (0x00 << 6),
401 VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_FALLING = (0x01 << 6),
402 VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_BOTH = (0x02 << 6),
403 #define VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_RISING VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_RISING
404 #define VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_FALLING VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_FALLING
405 #define VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_BOTH VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_BOTH
406 #define VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_RISING VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_RISING
407 #define VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_FALLING VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_FALLING
408 #define VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_BOTH VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_BOTH
409 */
411#endif
412
413enum {
414#ifndef VSF_TIMER_CHANNEL_MODE_MASK
416#ifdef VSF_TIMER_CHANNEL_MODE_PWM
417 | VSF_TIMER_CHANNEL_MODE_PWM
418#endif
419#ifdef VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE
420 | VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE
421#endif
422#ifdef VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE
423 | VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE
424#endif
425#ifdef VSF_TIMER_CHANNEL_MODE_ENCODER
426 | VSF_TIMER_CHANNEL_MODE_ENCODER
427#endif
428#ifdef VSF_TIMER_CHANNEL_MODE_ONE_PULSE
429 | VSF_TIMER_CHANNEL_MODE_ONE_PULSE
430#endif
431#ifdef VSF_TIMER_CHANNEL_MODE_HALL_SENSOR
432 | VSF_TIMER_CHANNEL_MODE_HALL_SENSOR
433#endif
435#endif
436
437#ifndef VSF_TIMER_BASE_COUNTER_MASK
440#endif
441
442#ifndef VSF_TIMER_CHANNEL_MODE_ALL_MASK
445#endif
447
448#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_IRQ_MASK == DISABLED
451
452 /*
453 // \~english We can define more channel irq mask here
454 // \~chinese 我们可以在这里定义更多的通道的不同模式的中断掩码
455
456 VSF_TIMER_IRQ_MASK_CHANNEL_0_INPUT_CAPTURE = (0x01 << 1),
457 VSF_TIMER_IRQ_MASK_CHANNEL_0_OUTPUT_COMPARE = (0x01 << 2),
458 VSF_TIMER_IRQ_MASK_CHANNEL_0_PWM = (0x01 << 3),
459
460 // We can define more channel irq mask here
461 VSF_TIMER_IRQ_MASK_CHANNEL_1_INPUT_CAPTURE = (0x01 << 3),
462 #define VSF_TIMER_IRQ_MASK_CHANNEL_1_INPUT_CAPTURE VSF_TIMER_IRQ_MASK_CHANNEL_1_INPUT_CAPTURE
463 VSF_TIMER_IRQ_MASK_CHANNEL_1_OUTPUT_COMPARE = (0x01 << 4),
464 #define VSF_TIMER_IRQ_MASK_CHANNEL_1_OUTPUT_COMPARE VSF_TIMER_IRQ_MASK_CHANNEL_1_OUTPUT_COMPARE
465 VSF_TIMER_IRQ_MASK_CHANNEL_2_INPUT_CAPTURE = (0x01 << 5),
466 #define VSF_TIMER_IRQ_MASK_CHANNEL_2_INPUT_CAPTURE VSF_TIMER_IRQ_MASK_CHANNEL_2_INPUT_CAPTURE
467 VSF_TIMER_IRQ_MASK_CHANNEL_2_OUTPUT_COMPARE = (0x01 << 6),
468 #define VSF_TIMER_IRQ_MASK_CHANNEL_2_OUTPUT_COMPARE VSF_TIMER_IRQ_MASK_CHANNEL_2_OUTPUT_COMPARE
469 */
471#endif
472
473enum {
476};
477
478#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CFG == DISABLED
480
481typedef void vsf_timer_isr_handler_t(void *target_ptr,
482 vsf_timer_t *timer_ptr,
484
485typedef struct vsf_timer_isr_t {
490
492
499typedef struct vsf_timer_cfg_t {
501 union {
504 };
507#endif
508
509#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG == DISABLED
514#endif
515
516
517#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CTRL == DISABLED
534typedef enum vsf_timer_ctrl_t {
537#endif
538
539#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_CTRL == DISABLED
559#endif
560
561#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG == DISABLED
564 union {
565 // for VSF_TIMER_CHANNEL_MODE_BASE mode
567 // for VSF_TIMER_CHANNEL_MODE_PWM mode and VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE mode
569 // for VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE mode
571 // for VSF_TIMER_CHANNEL_MODE_ENCODER mode
572 struct {
575 };
576 };
578#endif
579
588#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_STATUS == DISABLED
589typedef struct vsf_timer_status_t {
590 union {
593 };
595#endif
596
597
598#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CAPABILITY == DISABLED
600#if VSF_TIMER_CFG_INHERIT_HAL_CAPABILITY == ENABLED
602#endif
603 // support interrupt for timer
605
606 // timer bit length, like 16bit, 32bit etc.
608 // timer channel count, like 1, 2, 4 etc.
610
611 // support different channel mode
612 // we can redefine it if different channel support different mode.
618#endif
619
620typedef struct vsf_timer_op_t {
622#undef __VSF_HAL_TEMPLATE_API
623#define __VSF_HAL_TEMPLATE_API VSF_HAL_TEMPLATE_API_FP
625
626 VSF_TIMER_APIS(vsf_timer)
628
629#if VSF_TIMER_CFG_MULTI_CLASS == ENABLED
632};
633#endif
634
635/*============================ GLOBAL VARIABLES ==============================*/
636/*============================ PROTOTYPES ====================================*/
637
657extern vsf_err_t vsf_timer_init(vsf_timer_t *timer_ptr, vsf_timer_cfg_t *cfg_ptr);
658
670extern void vsf_timer_fini(vsf_timer_t *timer_ptr);
671
683extern fsm_rt_t vsf_timer_enable(vsf_timer_t *timer_ptr);
684
696extern fsm_rt_t vsf_timer_disable(vsf_timer_t *timer_ptr);
697
714
729
742
755
776
790extern vsf_err_t vsf_timer_set_period(vsf_timer_t *timer_ptr, uint32_t period);
791
814extern vsf_err_t vsf_timer_ctrl(vsf_timer_t *timer_ptr, vsf_timer_ctrl_t ctrl, void *param);
815
832 uint8_t channel,
833 vsf_timer_channel_cfg_t *channel_cfg_ptr);
834
848extern vsf_err_t vsf_timer_channel_start(vsf_timer_t *timer_ptr, uint8_t channel);
849
863extern vsf_err_t vsf_timer_channel_stop(vsf_timer_t *timer_ptr, uint8_t channel);
864
896
911
936extern vsf_err_t vsf_timer_channel_ctrl(vsf_timer_t *timer_ptr, uint8_t channel, vsf_timer_channel_ctrl_t ctrl, void *param);
937
938/*============================ MACROFIED FUNCTIONS ===========================*/
939
941#if VSF_TIMER_CFG_FUNCTION_RENAME == ENABLED
942# define __vsf_timer_t VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_t)
943# define vsf_timer_init(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_init) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
944# define vsf_timer_fini(__TIME) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_fini) ((__vsf_timer_t *)(__TIME))
945# define vsf_timer_enable(__TIME) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_enable) ((__vsf_timer_t *)(__TIME))
946# define vsf_timer_disable(__TIME) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_disable) ((__vsf_timer_t *)(__TIME))
947# define vsf_timer_status(__TIMER) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_status) ((__vsf_timer_t *)(__TIMER))
948# define vsf_timer_capability(__TIME) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_capability) ((__vsf_timer_t *)(__TIME))
949# define vsf_timer_get_configuration(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_get_configuration) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
950# define vsf_timer_irq_enable(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_irq_enable) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
951# define vsf_timer_irq_disable(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_irq_disable) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
952# define vsf_timer_set_period(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_set_period) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
953# define vsf_timer_ctrl(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_ctrl) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
954# define vsf_timer_channel_config(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_channel_config) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
955# define vsf_timer_channel_start(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_channel_start) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
956# define vsf_timer_channel_stop(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_channel_stop) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
957# define vsf_timer_channel_request_start(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_channel_request_start)((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
958# define vsf_timer_channel_request_stop(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_channel_request_stop) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
959# define vsf_timer_channel_ctrl(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_channel_ctrl) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
960#endif
962
963#ifdef __cplusplus
964}
965#endif
966
967#endif /*__VSF_TEMPLATE_TIMER_H__*/
vsf_err_t
Definition __type.h:42
vsf_arch_prio_t
Definition cortex_a_generic.h:88
vsf_timer_irq_mask_t
Definition timer.h:132
vsf_timer_channel_mode_t
Definition timer.h:122
void vsf_timer_isr_handler_t(void *target_ptr, vsf_timer_t *timer_ptr, vsf_timer_irq_mask_t irq_mask)
Definition timer.h:160
const i_spi_t vsf_spi_irq_mask_t irq_mask
Definition spi_interface.h:38
unsigned short uint16_t
Definition stdint.h:7
unsigned uint32_t
Definition stdint.h:9
unsigned char uint8_t
Definition stdint.h:5
Definition vsf_template_hal_driver.h:203
Definition vsf_template_hal_driver.h:196
Definition vsf_template_timer.h:599
uint8_t support_output_compare
Definition vsf_template_timer.h:614
uint8_t timer_bitlen
Definition vsf_template_timer.h:607
vsf_timer_irq_mask_t irq_mask
Definition timer.h:232
inherit(vsf_peripheral_capability_t) vsf_timer_irq_mask_t irq_mask
uint8_t support_one_pulse
Definition vsf_template_timer.h:616
uint8_t channel_cnt
Definition vsf_template_timer.h:609
uint8_t support_input_capture
Definition vsf_template_timer.h:615
uint8_t support_pwm
Definition vsf_template_timer.h:613
timer configuration
Definition vsf_template_timer.h:499
uint32_t freq
Definition vsf_template_timer.h:502
uint32_t min_freq
Definition vsf_template_timer.h:503
uint32_t period
Period in Tick.
Definition vsf_template_timer.h:500
vsf_timer_isr_t isr
ISR config.
Definition vsf_template_timer.h:505
Definition vsf_template_timer.h:510
vsf_timer_channel_mode_t mode
Definition vsf_template_timer.h:511
uint32_t pulse
Definition vsf_template_timer.h:512
Definition vsf_template_timer.h:562
uint16_t length
Definition vsf_template_timer.h:563
uint32_t * pulse_buffer
Definition vsf_template_timer.h:568
uint32_t * channel_a_buffer
Definition vsf_template_timer.h:573
uint32_t * input_capture_buffer
Definition vsf_template_timer.h:570
uint32_t * channel_b_buffer
Definition vsf_template_timer.h:574
uint32_t * period_buffer
Definition vsf_template_timer.h:566
Definition vsf_template_timer.h:485
vsf_arch_prio_t prio
Definition vsf_template_timer.h:488
vsf_timer_isr_handler_t * handler_fn
Definition vsf_template_timer.h:486
void * target_ptr
Definition vsf_template_timer.h:487
Definition vsf_template_timer.h:620
TIMER status information structure Contains the current status of TIMER operations.
Definition vsf_template_timer.h:589
uint32_t value
Definition timer.h:220
Definition vsf_template_timer.h:630
const vsf_timer_op_t * op
Definition vsf_template_timer.h:631
fsm_rt_t
Definition vsf_fsm.h:315
struct vsf_timer_capability_t vsf_timer_capability_t
#define VSF_TIMER_APIS(__prefix_name)
Timer API template macros for generating timer function declarations and implementations.
Definition vsf_template_timer.h:216
void vsf_timer_fini(vsf_timer_t *timer_ptr)
Finalize a TIMER instance.
Definition timer_common.c:45
vsf_timer_irq_mask_t
Definition vsf_template_timer.h:449
@ VSF_TIMER_IRQ_MASK_OVERFLOW
Definition vsf_template_timer.h:450
vsf_err_t vsf_timer_set_period(vsf_timer_t *timer_ptr, uint32_t period)
TIMER set period (maximum count), used for change the period of TIMER dynamically.
Definition timer_common.c:109
vsf_err_t vsf_timer_channel_stop(vsf_timer_t *timer_ptr, uint8_t channel)
stop a TIMER channel
Definition timer_common.c:146
vsf_timer_status_t vsf_timer_status(vsf_timer_t *timer_ptr)
Get the status of TIMER instance.
Definition timer_common.c:91
struct vsf_timer_channel_cfg_t vsf_timer_channel_cfg_t
struct vsf_timer_channel_request_t vsf_timer_channel_request_t
@ VSF_TIMER_IRQ_ALL_BITS_MASK
Definition vsf_template_timer.h:475
@ VSF_TIMER_IRQ_COUNT
Definition vsf_template_timer.h:474
vsf_timer_channel_mode_t
Definition vsf_template_timer.h:238
@ VSF_TIMER_CHANNEL_MODE_BASE
Definition vsf_template_timer.h:241
@ VSF_TIMER_BASE_ONESHOT
Definition vsf_template_timer.h:289
@ VSF_TIMER_BASE_CONTINUES
Definition vsf_template_timer.h:291
vsf_err_t vsf_timer_channel_request_stop(vsf_timer_t *timer_ptr, uint8_t channel)
stop a TIMER channel request.
vsf_timer_capability_t vsf_timer_capability(vsf_timer_t *timer_ptr)
get the capability of TIMER instance.
Definition timer_common.c:100
vsf_timer_ctrl_t
Predefined VSF TIMER control command that can be reimplemented in specific hal drivers....
Definition vsf_template_timer.h:534
@ __VSF_TIMER_CTRL_DUMMY
Dummy value for compilation.
Definition vsf_template_timer.h:535
struct vsf_timer_isr_t vsf_timer_isr_t
void vsf_timer_isr_handler_t(void *target_ptr, vsf_timer_t *timer_ptr, vsf_timer_irq_mask_t irq_mask)
Definition vsf_template_timer.h:481
void vsf_timer_irq_enable(vsf_timer_t *timer_ptr, vsf_timer_irq_mask_t irq_mask)
Enable interrupt masks of TIMER instance.
Definition timer_common.c:72
vsf_err_t vsf_timer_channel_ctrl(vsf_timer_t *timer_ptr, uint8_t channel, vsf_timer_channel_ctrl_t ctrl, void *param)
Execute a control command on the TIMER channel.
Definition timer_common.c:155
vsf_err_t vsf_timer_channel_request_start(vsf_timer_t *timer_ptr, uint8_t channel, vsf_timer_channel_request_t *request_ptr)
start a TIMER channel request (usually based on DMA)
vsf_err_t vsf_timer_get_configuration(vsf_timer_t *timer_ptr, vsf_timer_cfg_t *cfg_ptr)
Get the current configuration of a TIMER instance.
Definition timer_common.c:165
vsf_err_t vsf_timer_ctrl(vsf_timer_t *timer_ptr, vsf_timer_ctrl_t ctrl, void *param)
Execute a control command on the TIMER instance.
Definition timer_common.c:118
void vsf_timer_irq_disable(vsf_timer_t *timer_ptr, vsf_timer_irq_mask_t irq_mask)
Disable interrupt masks of TIMER instance.
Definition timer_common.c:81
struct vsf_timer_status_t vsf_timer_status_t
TIMER status information structure Contains the current status of TIMER operations.
@ VSF_TIMER_CHANNEL_MODE_ALL_MASK
Definition vsf_template_timer.h:443
@ VSF_TIMER_CHANNEL_MODE_MASK
Definition vsf_template_timer.h:415
@ VSF_TIMER_BASE_COUNTER_MASK
Definition vsf_template_timer.h:438
vsf_err_t vsf_timer_init(vsf_timer_t *timer_ptr, vsf_timer_cfg_t *cfg_ptr)
Initialize a Timer instance.
Definition timer_common.c:37
struct vsf_timer_cfg_t vsf_timer_cfg_t
timer configuration
fsm_rt_t vsf_timer_enable(vsf_timer_t *timer_ptr)
Enable a TIMER instance.
Definition timer_common.c:54
fsm_rt_t vsf_timer_disable(vsf_timer_t *timer_ptr)
Disable a TIMER instance.
Definition timer_common.c:63
vsf_timer_channel_ctrl_t
Predefined VSF TIMER control command that can be reimplemented in specific hal drivers....
Definition vsf_template_timer.h:556
@ __VSF_TIMER_CHANNEL_CTRL_DUMMY
Dummy value for compilation.
Definition vsf_template_timer.h:557
vsf_err_t vsf_timer_channel_config(vsf_timer_t *timer_ptr, uint8_t channel, vsf_timer_channel_cfg_t *channel_cfg_ptr)
TIMER set the period width and pulse width for a channel.
Definition timer_common.c:127
vsf_err_t vsf_timer_channel_start(vsf_timer_t *timer_ptr, uint8_t channel)
start a TIMER channel
Definition timer_common.c:137
Generated from commit: vsfteam/vsf@74aa6ce