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
241#ifndef __VSF_TIMER_CFG_SUPPORT_STANDARD_OPTIONAL
242# define __VSF_TIMER_CFG_SUPPORT_STANDARD_OPTIONAL DISABLED
243#endif
244
245/*============================ MACROFIED FUNCTIONS ===========================*/
246
253#define VSF_TIMER_APIS(__prefix_name) \
254 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, init, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, vsf_timer_cfg_t *cfg_ptr) \
255 __VSF_HAL_TEMPLATE_API(__prefix_name, void, timer, fini, VSF_MCONNECT(__prefix_name, _t) *timer_ptr) \
256 __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) \
257 __VSF_HAL_TEMPLATE_API(__prefix_name, fsm_rt_t, timer, enable, VSF_MCONNECT(__prefix_name, _t) *timer_ptr) \
258 __VSF_HAL_TEMPLATE_API(__prefix_name, fsm_rt_t, timer, disable, VSF_MCONNECT(__prefix_name, _t) *timer_ptr) \
259 __VSF_HAL_TEMPLATE_API(__prefix_name, void, timer, irq_enable, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, vsf_timer_irq_mask_t irq_mask) \
260 __VSF_HAL_TEMPLATE_API(__prefix_name, void, timer, irq_disable, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, vsf_timer_irq_mask_t irq_mask) \
261 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_timer_irq_mask_t, timer, irq_clear, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, vsf_timer_irq_mask_t irq_mask) \
262 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_timer_status_t, timer, status, VSF_MCONNECT(__prefix_name, _t) *timer_ptr) \
263 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_timer_capability_t, timer, capability, VSF_MCONNECT(__prefix_name, _t) *timer_ptr) \
264 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, set_period, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, uint32_t period) \
265 __VSF_HAL_TEMPLATE_API(__prefix_name, uint32_t, timer, get_counter, VSF_MCONNECT(__prefix_name, _t) *timer_ptr) \
266 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, set_counter, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, uint32_t value, vsf_timer_set_counter_mode_t mode) \
267 __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) \
268 __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) \
269 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, channel_start, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, uint8_t channel) \
270 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, channel_stop, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, uint8_t channel) \
271 __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) \
272 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, timer, channel_request_stop, VSF_MCONNECT(__prefix_name, _t) *timer_ptr, uint8_t channel) \
273 __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)
274
275/*============================ TYPES =========================================*/
276
277#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE == DISABLED
306 // channel mode : different timer channel may support different mode
307 // Base Mode : The timer channel will be used as a base timer
309
319 // \~english Some timer may support more mode like PWM, Output Compare etc.
320 // \~chinese 有些定时器可能支持更多的模式,如 PWM、输出比较等。
321
322 // \~english PWM(Pulse Width Modulation) Mode : The timer channel will be used as a
323 // PWM output, all channels's period should be the same
324 // \~chinese PWM(脉宽调制)模式:定时器通道将用作 PWM 输出,所有通道的周期应该相同
325 VSF_TIMER_CHANNEL_MODE_PWM = (0x01 << 0),
326# define VSF_TIMER_CHANNEL_MODE_PWM VSF_TIMER_CHANNEL_MODE_PWM
327
328 // \~english Output Compare Mode: The timer channel will be used as a output compare,
329 // different channels can have different period (change pin level in interrupt)
330 // PWM mode can be seen as a special case of output compare mode, that is all
331 // channels have the same period.
332 // \~chinese 输出比较模式:定时器通道将用作输出比较,不同通道可以有不同的周期(在中断中改变引脚电平)。
333 // PWM 模式可以看作是输出比较模式的一种特殊情况,即所有通道的周期相同。
334 VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE = (0x02 << 0),
335# define VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE
336
337 // \~english Input Capture Mode : The timer channel will be used as a input capture
338 // \~chinese 输入捕获模式:定时器通道将用作输入捕获
339 VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE = (0x03 << 0),
340# define VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE
341
342 // \~english Encoder Mode : The timer channel will be used as a encoder
343 // \~chinese 编码器模式:定时器通道将用作编码器
344 VSF_TIMER_CHANNEL_MODE_ENCODER = (0x04 << 0),
345# define VSF_TIMER_CHANNEL_MODE_ENCODER VSF_TIMER_CHANNEL_MODE_ENCODER
346
347 // \~english One Pulse Mode : The timer channel will be used as a one pulse mode
348 // \~chinese 单脉冲模式:定时器通道将用作单脉冲模式
349 VSF_TIMER_CHANNEL_MODE_ONE_PULSE = (0x05 << 0),
350# define VSF_TIMER_CHANNEL_MODE_ONE_PULSE VSF_TIMER_CHANNEL_MODE_ONE_PULSE
351
352 // \~english Hall Sensor Mode : The timer channel will be used as a hall sensor
353 // \~chinese 霍尔传感器模式:定时器通道将用作霍尔传感器
354 VSF_TIMER_CHANNEL_MODE_HALL_SENSOR = (0x06 << 0),
355# define VSF_TIMER_CHANNEL_MODE_HALL_SENSOR VSF_TIMER_CHANNEL_MODE_HALL_SENSOR
356#endif
357
358 /********************************************************************************/
361
362 // Counter Mode
363 // Oneshot : The timer will stop after the first overflow
365 // Continues : The timer will continue to count after overflow
368 // \~english Some timer may support more counter direction like center-aligned etc.
369 // The following mode only valid for VSF_TIMER_CHANNEL_MODE_BASE
370 // \~chinese 有些定时器可能支持更多的计数模式,如中心对齐等。以下模式仅适用于 VSF_TIMER_CHANNEL_MODE_BASE
371 VSF_TIMER_BASE_COUNTER_UP = (0x00 << 4),
372# define VSF_TIMER_BASE_COUNTER_UP VSF_TIMER_BASE_COUNTER_UP
373 VSF_TIMER_BASE_COUNTER_DOWN = (0x01 << 4),
374# define VSF_TIMER_BASE_COUNTER_DOWN VSF_TIMER_BASE_COUNTER_DOWN
375 VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED1 = (0x02 << 4),
376# define VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED1 VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED1
377 VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED2 = (0x03 << 4),
378# define VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED2 VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED2
379 VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED3 = (0x04 << 4),
380# define VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED3 VSF_TIMER_BASE_COUNTER_CENTER_ALIGNED3
381
382 // \~english Some timer may support more clock division like 1, 2, 4 etc.
383 // \~chinese 有些定时器可能支持更多的时钟分频,如 1、2、4 等。
384 VSF_TIEMR_BASE_CLOCKDIVISION_DIV_1 = (0x00 << 8),
385# define VSF_TIEMR_BASE_CLOCKDIVISION_DIV_1 VSF_TIEMR_BASE_CLOCKDIVISION_DIV_1
386 VSF_TIEMR_BASE_CLOCKDIVISION_DIV_2 = (0x01 << 8),
387# define VSF_TIEMR_BASE_CLOCKDIVISION_DIV_2 VSF_TIEMR_BASE_CLOCKDIVISION_DIV_2
388 VSF_TIEMR_BASE_CLOCKDIVISION_DIV_4 = (0x02 << 8),
389# define VSF_TIEMR_BASE_CLOCKDIVISION_DIV_4 VSF_TIEMR_BASE_CLOCKDIVISION_DIV_4
390#endif
391
393 /********************************************************************************/
394 // \~english The following mode only valid for VSF_TIMER_CHANNEL_MODE_PWM
395 // \~chinese 以下模式仅适用于 VSF_TIMER_CHANNEL_MODE_PWM
396 // Output Compare Mode
397 VSF_TIMER_OUTPUT_COMPARE_ACTIVE = (0x00 << 4),
398# define VSF_TIMER_OUTPUT_COMPARE_ACTIVE VSF_TIMER_OUTPUT_COMPARE_ACTIVE
399 VSF_TIMER_OUTPUT_COMPARE_INACTIVE = (0x01 << 4),
400# define VSF_TIMER_OUTPUT_COMPARE_INACTIVE VSF_TIMER_OUTPUT_COMPARE_INACTIVE
401 VSF_TIMER_OUTPUT_COMPARE_TOGGLE = (0x02 << 4),
402# define VSF_TIMER_OUTPUT_COMPARE_TOGGLE VSF_TIMER_OUTPUT_COMPARE_TOGGLE
403 VSF_TIMER_OUTPUT_COMPARE_PWM1 = (0x03 << 4),
404# define VSF_TIMER_OUTPUT_COMPARE_PWM1 VSF_TIMER_OUTPUT_COMPARE_PWM1
405 VSF_TIMER_OUTPUT_COMPARE_PWM2 = (0x04 << 4),
406# define VSF_TIMER_OUTPUT_COMPARE_PWM2 VSF_TIMER_OUTPUT_COMPARE_PWM2
407 VSF_TIMER_OUTPUT_COMPARE_FORCED_ACTIVE = (0x05 << 4),
408# define VSF_TIMER_OUTPUT_COMPARE_FORCED_ACTIVE VSF_TIMER_OUTPUT_COMPARE_FORCED_ACTIVE
409 VSF_TIMER_OUTPUT_COMPARE_FORCED_INACTIVE = (0x06 << 4),
410# define VSF_TIMER_OUTPUT_COMPARE_FORCED_INACTIVE VSF_TIMER_OUTPUT_COMPARE_FORCED_INACTIVE
411
412 /********************************************************************************/
413 // \~english The following mode only valid for VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE
414 // \~chinese 以下模式仅适用于 VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE
415
416 // \~english Output Compare Polarity and N Polarity
417 // \~chinese 输出比较极性和 N 极性
418 VSF_TIMER_OUTPUT_COMPARE_POLARITY_HIGH = (0x00 << 8),
419# define VSF_TIMER_OUTPUT_COMPARE_POLARITY_HIGH VSF_TIMER_OUTPUT_COMPARE_POLARITY_HIGH
420 VSF_TIMER_OUTPUT_COMPARE_POLARITY_LOW = (0x01 << 8),
421# define VSF_TIMER_OUTPUT_COMPARE_POLARITY_LOW VSF_TIMER_OUTPUT_COMPARE_POLARITY_LOW
422 VSF_TIMER_OUTPUT_COMPARE_N_POLARITY_HIGH = (0x00 << 8),
423# define VSF_TIMER_OUTPUT_COMPARE_N_POLARITY_HIGH VSF_TIMER_OUTPUT_COMPARE_N_POLARITY_HIGH
424 VSF_TIMER_OUTPUT_COMPARE_N_POLARITY_LOW = (0x01 << 8),
425# define VSF_TIMER_OUTPUT_COMPARE_N_POLARITY_LOW VSF_TIMER_OUTPUT_COMPARE_N_POLARITY_LOW
426
427 /********************************************************************************/
428 // \~english The following mode only valid for VSF_TIMER_CHANNEL_MODE_PWM
429 // \~chinese 以下模式仅适用于 VSF_TIMER_CHANNEL_MODE_PWM
430
431 // \~english PWM Output Polarity
432 // \~chinese PWM 输出极性
433 VSF_TIMER_PWM_OUTPUT_POLARITY_HIGH = (0x00 << 4),
434# define VSF_TIMER_PWM_OUTPUT_POLARITY_HIGH VSF_TIMER_PWM_OUTPUT_POLARITY_HIGH
435 VSF_TIMER_PWM_OUTPUT_POLARITY_LOW = (0x01 << 4),
436# define VSF_TIMER_PWM_OUTPUT_POLARITY_LOW VSF_TIMER_PWM_OUTPUT_POLARITY_LOW
437
438 /********************************************************************************/
439 // \~english The following mode only valid for VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE
440 // \~chinese 以下模式仅适用于 VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE
441
442 // \~english Input Capture Polarity
443 // \~chinese 输入捕获极性
444 VSF_TIMER_INPUT_CAPTURE_POLARITY_RISING = (0x00 << 4),
445# define VSF_TIMER_INPUT_CAPTURE_POLARITY_RISING VSF_TIMER_INPUT_CAPTURE_POLARITY_RISING
446 VSF_TIMER_INPUT_CAPTURE_POLARITY_FALLING = (0x01 << 4),
447# define VSF_TIMER_INPUT_CAPTURE_POLARITY_FALLING VSF_TIMER_INPUT_CAPTURE_POLARITY_FALLING
448 VSF_TIMER_INPUT_CAPTURE_POLARITY_BOTH = (0x02 << 4),
449# define VSF_TIMER_INPUT_CAPTURE_POLARITY_BOTH VSF_TIMER_INPUT_CAPTURE_POLARITY_BOTH
450
451 // \~english Input Capture Filter
452 // \~chinese 输入捕获滤波
453 VSF_TIMER_INPUT_CAPTURE_FILTER_MASK = (0x0F << 4),
454 VSF_TIMER_INPUT_CAPTURE_FILTER_OFFSET = 4,
455#endif
456
457#if __VSF_TIMER_CFG_SUPPORT_STANDARD_OPTIONAL
458 /********************************************************************************/
459 // \~english The following mode only valid for VSF_TIMER_CHANNEL_MODE_ENCODER
460 // \~chinese 以下模式仅适用于 VSF_TIMER_CHANNEL_MODE_ENCODER
461
462 // \~english Encoder Mode
463 // \~chinese 编码器模式
464 VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_RISING = (0x00 << 4),
465# define VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_RISING VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_RISING
466 VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_FALLING = (0x01 << 4),
467# define VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_FALLING VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_FALLING
468 VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_BOTH = (0x02 << 4),
469# define VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_BOTH VSF_TIMER_ENCODER_CHANNEL_A_POLARITY_BOTH
470 VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_RISING = (0x00 << 6),
471# define VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_RISING VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_RISING
472 VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_FALLING = (0x01 << 6),
473# define VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_FALLING VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_FALLING
474 VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_BOTH = (0x02 << 6),
475# define VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_BOTH VSF_TIMER_ENCODER_CHANNEL_B_POLARITY_BOTH
476#endif
478#endif
479
480enum {
481#ifndef VSF_TIMER_CHANNEL_MODE_MASK
483#ifdef VSF_TIMER_CHANNEL_MODE_PWM
484 | VSF_TIMER_CHANNEL_MODE_PWM
485#endif
486#ifdef VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE
487 | VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE
488#endif
489#ifdef VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE
490 | VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE
491#endif
492#ifdef VSF_TIMER_CHANNEL_MODE_ENCODER
493 | VSF_TIMER_CHANNEL_MODE_ENCODER
494#endif
495#ifdef VSF_TIMER_CHANNEL_MODE_ONE_PULSE
496 | VSF_TIMER_CHANNEL_MODE_ONE_PULSE
497#endif
498#ifdef VSF_TIMER_CHANNEL_MODE_HALL_SENSOR
499 | VSF_TIMER_CHANNEL_MODE_HALL_SENSOR
500#endif
502#endif
503
504#ifndef VSF_TIMER_BASE_COUNTER_MASK
507#endif
508
509#ifndef VSF_TIMER_CHANNEL_MODE_ALL_MASK
512#endif
514
515#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_IRQ_MASK == DISABLED
518
519 /*
520 // \~english We can define more channel irq mask here
521 // \~chinese 我们可以在这里定义更多的通道的不同模式的中断掩码
522
523 VSF_TIMER_IRQ_MASK_CHANNEL_0_INPUT_CAPTURE = (0x01 << 1),
524 VSF_TIMER_IRQ_MASK_CHANNEL_0_OUTPUT_COMPARE = (0x01 << 2),
525 VSF_TIMER_IRQ_MASK_CHANNEL_0_PWM = (0x01 << 3),
526
527 // We can define more channel irq mask here
528 VSF_TIMER_IRQ_MASK_CHANNEL_1_INPUT_CAPTURE = (0x01 << 3),
529 #define VSF_TIMER_IRQ_MASK_CHANNEL_1_INPUT_CAPTURE VSF_TIMER_IRQ_MASK_CHANNEL_1_INPUT_CAPTURE
530 VSF_TIMER_IRQ_MASK_CHANNEL_1_OUTPUT_COMPARE = (0x01 << 4),
531 #define VSF_TIMER_IRQ_MASK_CHANNEL_1_OUTPUT_COMPARE VSF_TIMER_IRQ_MASK_CHANNEL_1_OUTPUT_COMPARE
532 VSF_TIMER_IRQ_MASK_CHANNEL_2_INPUT_CAPTURE = (0x01 << 5),
533 #define VSF_TIMER_IRQ_MASK_CHANNEL_2_INPUT_CAPTURE VSF_TIMER_IRQ_MASK_CHANNEL_2_INPUT_CAPTURE
534 VSF_TIMER_IRQ_MASK_CHANNEL_2_OUTPUT_COMPARE = (0x01 << 6),
535 #define VSF_TIMER_IRQ_MASK_CHANNEL_2_OUTPUT_COMPARE VSF_TIMER_IRQ_MASK_CHANNEL_2_OUTPUT_COMPARE
536 */
538#endif
539
540enum {
543};
544
545#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CFG == DISABLED
547
548typedef void vsf_timer_isr_handler_t(void *target_ptr,
549 vsf_timer_t *timer_ptr,
551
552typedef struct vsf_timer_isr_t {
557
559
566typedef struct vsf_timer_cfg_t {
568 union {
571 };
574#endif
575
576#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG == DISABLED
581#endif
582
583
584#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CTRL == DISABLED
601typedef enum vsf_timer_ctrl_t {
620
621 // ------------------------------------------------------------------------
622 // Optional members (documented only, not defined here).
623 // Concrete hardware drivers may add the following commands by enabling
624 // VSF_TIMER_CFG_REIMPLEMENT_TYPE_CTRL and redefining vsf_timer_ctrl_t,
625 // together with a same-name macro so callers can probe support via #ifdef.
626 // They are optional because each command is only meaningful when the
627 // underlying hardware exhibits a specific constraint; drivers without
628 // that constraint should simply omit the command.
629 //
630 // VSF_TIMER_CTRL_GET_FREQ
631 // Purpose : return the actual tick frequency chosen by
632 // vsf_timer_init when the divider is discrete and
633 // cannot exactly honour the requested min_freq.
634 // Param : uint32_t * (out) - receives the actual tick freq in Hz.
635 // Returns : VSF_ERR_NONE on success;
636 // VSF_ERR_NOT_READY if init has not been called;
637 // VSF_ERR_NOT_SUPPORT when the driver does not
638 // implement the command.
639 // Applicability : timer/PWM drivers whose picked tick may overshoot
640 // min_freq due to non-continuous divider steps;
641 // drivers that can always match min_freq exactly
642 // do not need this command.
643 //
644 // 可选成员(仅文档化,这里不定义)。
645 // 具体硬件驱动可通过启用 VSF_TIMER_CFG_REIMPLEMENT_TYPE_CTRL 并重新
646 // 定义 vsf_timer_ctrl_t 来增加以下命令,并提供同名宏以便调用方通过
647 // #ifdef 在编译期探测是否支持。之所以为可选,是因为每条命令仅在
648 // 底层硬件存在特定约束时才有意义;不具备该约束的驱动直接省略即可。
649 //
650 // VSF_TIMER_CTRL_GET_FREQ
651 // 用途 : 当分频器档位离散、无法精确命中调用方请求的
652 // min_freq 时,返回 vsf_timer_init 实际选中的
653 // tick 频率。
654 // 参数 : uint32_t *(输出) - 接收实际 tick 频率(单位 Hz)。
655 // 返回值 : 成功返回 VSF_ERR_NONE;
656 // 未初始化返回 VSF_ERR_NOT_READY;
657 // 驱动未实现此命令时返回 VSF_ERR_NOT_SUPPORT。
658 // 适用场景 : 由于分频档位非连续、实际 tick 可能高于 min_freq
659 // 的 timer/PWM 驱动;能精确命中 min_freq 的驱动
660 // 无需实现此命令。
661 // ------------------------------------------------------------------------
663#endif
664
665#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_CTRL == DISABLED
685#endif
686
687#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG == DISABLED
690 union {
691 // for VSF_TIMER_CHANNEL_MODE_BASE mode
693 // for VSF_TIMER_CHANNEL_MODE_PWM mode and VSF_TIMER_CHANNEL_MODE_OUTPUT_COMPARE mode
695 // for VSF_TIMER_CHANNEL_MODE_INPUT_CAPTURE mode
697 // for VSF_TIMER_CHANNEL_MODE_ENCODER mode
698 struct {
701 };
702 };
704#endif
705
706#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_SET_COUNTER_MODE == DISABLED
728#endif
729
738#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_STATUS == DISABLED
739typedef struct vsf_timer_status_t {
740 union {
743 };
745#endif
746
747
748#if VSF_TIMER_CFG_REIMPLEMENT_TYPE_CAPABILITY == DISABLED
750#if VSF_TIMER_CFG_INHERIT_HAL_CAPABILITY == ENABLED
752#endif
753 // support interrupt for timer
755
756 // timer bit length, like 16bit, 32bit etc.
758 // timer channel count, like 1, 2, 4 etc.
760
761 // support different channel mode
762 // we can redefine it if different channel support different mode.
768#endif
769
770typedef struct vsf_timer_op_t {
772#undef __VSF_HAL_TEMPLATE_API
773#define __VSF_HAL_TEMPLATE_API VSF_HAL_TEMPLATE_API_FP
775
776 VSF_TIMER_APIS(vsf_timer)
778
779#if VSF_TIMER_CFG_MULTI_CLASS == ENABLED
782};
783#endif
784
785/*============================ GLOBAL VARIABLES ==============================*/
786/*============================ PROTOTYPES ====================================*/
787
807extern vsf_err_t vsf_timer_init(vsf_timer_t *timer_ptr, vsf_timer_cfg_t *cfg_ptr);
808
820extern void vsf_timer_fini(vsf_timer_t *timer_ptr);
821
833extern fsm_rt_t vsf_timer_enable(vsf_timer_t *timer_ptr);
834
846extern fsm_rt_t vsf_timer_disable(vsf_timer_t *timer_ptr);
847
864
879
906
919
932
953
967extern vsf_err_t vsf_timer_set_period(vsf_timer_t *timer_ptr, uint32_t period);
968
981
1006
1029extern vsf_err_t vsf_timer_ctrl(vsf_timer_t *timer_ptr, vsf_timer_ctrl_t ctrl, void *param);
1030
1047 uint8_t channel,
1048 vsf_timer_channel_cfg_t *channel_cfg_ptr);
1049
1063extern vsf_err_t vsf_timer_channel_start(vsf_timer_t *timer_ptr, uint8_t channel);
1064
1078extern vsf_err_t vsf_timer_channel_stop(vsf_timer_t *timer_ptr, uint8_t channel);
1079
1111
1126
1151extern vsf_err_t vsf_timer_channel_ctrl(vsf_timer_t *timer_ptr, uint8_t channel, vsf_timer_channel_ctrl_t ctrl, void *param);
1152
1153/*============================ MACROFIED FUNCTIONS ===========================*/
1154
1156#if VSF_TIMER_CFG_FUNCTION_RENAME == ENABLED
1157# define __vsf_timer_t VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_t)
1158# define vsf_timer_init(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_init) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1159# define vsf_timer_fini(__TIME) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_fini) ((__vsf_timer_t *)(__TIME))
1160# define vsf_timer_enable(__TIME) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_enable) ((__vsf_timer_t *)(__TIME))
1161# define vsf_timer_disable(__TIME) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_disable) ((__vsf_timer_t *)(__TIME))
1162# define vsf_timer_status(__TIMER) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_status) ((__vsf_timer_t *)(__TIMER))
1163# define vsf_timer_capability(__TIME) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_capability) ((__vsf_timer_t *)(__TIME))
1164# define vsf_timer_get_configuration(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_get_configuration) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1165# define vsf_timer_irq_enable(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_irq_enable) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1166# define vsf_timer_irq_disable(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_irq_disable) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1167# define vsf_timer_irq_clear(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_irq_clear) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1168# define vsf_timer_set_period(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_set_period) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1169# define vsf_timer_get_counter(__TIME) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_get_counter) ((__vsf_timer_t *)(__TIME))
1170# define vsf_timer_set_counter(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_set_counter) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1171# define vsf_timer_ctrl(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_ctrl) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1172# define vsf_timer_channel_config(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_channel_config) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1173# define vsf_timer_channel_start(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_channel_start) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1174# define vsf_timer_channel_stop(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_channel_stop) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1175# define vsf_timer_channel_request_start(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_channel_request_start)((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1176# define vsf_timer_channel_request_stop(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_channel_request_stop) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1177# define vsf_timer_channel_ctrl(__TIME, ...) VSF_MCONNECT(VSF_TIMER_CFG_PREFIX, _timer_channel_ctrl) ((__vsf_timer_t *)(__TIME), ##__VA_ARGS__)
1178#endif
1180
1181#ifdef __cplusplus
1182}
1183#endif
1184
1185#endif /*__VSF_TEMPLATE_TIMER_H__*/
vsf_err_t
Definition __type.h:42
vsf_arch_prio_t
Definition cortex_a_generic.h:85
vsf_timer_irq_mask_t
Definition timer.h:131
vsf_timer_channel_mode_t
Definition timer.h:121
void vsf_timer_isr_handler_t(void *target_ptr, vsf_timer_t *timer_ptr, vsf_timer_irq_mask_t irq_mask)
Definition timer.h:159
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:204
Definition vsf_template_hal_driver.h:197
Definition vsf_template_timer.h:749
uint8_t support_output_compare
Definition vsf_template_timer.h:764
uint8_t timer_bitlen
Definition vsf_template_timer.h:757
vsf_timer_irq_mask_t irq_mask
Definition timer.h:231
inherit(vsf_peripheral_capability_t) vsf_timer_irq_mask_t irq_mask
uint8_t support_one_pulse
Definition vsf_template_timer.h:766
uint8_t channel_cnt
Definition vsf_template_timer.h:759
uint8_t support_input_capture
Definition vsf_template_timer.h:765
uint8_t support_pwm
Definition vsf_template_timer.h:763
timer configuration
Definition vsf_template_timer.h:566
uint32_t freq
Definition vsf_template_timer.h:569
uint32_t min_freq
Definition vsf_template_timer.h:570
uint32_t period
Period in Tick.
Definition vsf_template_timer.h:567
vsf_timer_isr_t isr
ISR config.
Definition vsf_template_timer.h:572
Definition vsf_template_timer.h:577
vsf_timer_channel_mode_t mode
Definition vsf_template_timer.h:578
uint32_t pulse
Definition vsf_template_timer.h:579
Definition vsf_template_timer.h:688
uint16_t length
Definition vsf_template_timer.h:689
uint32_t * pulse_buffer
Definition vsf_template_timer.h:694
uint32_t * channel_a_buffer
Definition vsf_template_timer.h:699
uint32_t * input_capture_buffer
Definition vsf_template_timer.h:696
uint32_t * channel_b_buffer
Definition vsf_template_timer.h:700
uint32_t * period_buffer
Definition vsf_template_timer.h:692
Definition vsf_template_timer.h:552
vsf_arch_prio_t prio
Definition vsf_template_timer.h:555
vsf_timer_isr_handler_t * handler_fn
Definition vsf_template_timer.h:553
void * target_ptr
Definition vsf_template_timer.h:554
Definition vsf_template_timer.h:770
TIMER status information structure Contains the current status of TIMER operations.
Definition vsf_template_timer.h:739
uint32_t value
Definition timer.h:219
Definition vsf_template_timer.h:780
const vsf_timer_op_t * op
Definition vsf_template_timer.h:781
vk_av_control_value_t value
Definition vsf_audio.h:171
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:253
void vsf_timer_fini(vsf_timer_t *timer_ptr)
Finalize a TIMER instance.
Definition timer_common.c:45
#define __VSF_TIMER_CFG_SUPPORT_STANDARD_OPTIONAL
Enable standard optional features support.
Definition vsf_template_timer.h:242
vsf_timer_irq_mask_t
Definition vsf_template_timer.h:516
@ VSF_TIMER_IRQ_MASK_OVERFLOW
Definition vsf_template_timer.h:517
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:118
vsf_err_t vsf_timer_channel_stop(vsf_timer_t *timer_ptr, uint8_t channel)
stop a TIMER channel
Definition timer_common.c:174
vsf_timer_status_t vsf_timer_status(vsf_timer_t *timer_ptr)
Get the status of TIMER instance.
Definition timer_common.c:100
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_mask_t vsf_timer_irq_clear(vsf_timer_t *timer_ptr, vsf_timer_irq_mask_t irq_mask)
Clear interrupt flags of TIMER instance and return previous state.
Definition timer_common.c:91
vsf_timer_channel_mode_t
Predefined VSF Timer channel modes that can be reimplemented in specific HAL drivers.
Definition vsf_template_timer.h:305
@ VSF_TIMER_CHANNEL_MODE_BASE
Definition vsf_template_timer.h:308
@ VSF_TIMER_BASE_ONESHOT
Standard optional channel modes Note: These are standard optional features. This macro should NOT be ...
Definition vsf_template_timer.h:364
@ VSF_TIMER_BASE_CONTINUES
Definition vsf_template_timer.h:366
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:109
vsf_timer_ctrl_t
Predefined VSF TIMER control command that can be reimplemented in specific hal drivers....
Definition vsf_template_timer.h:601
@ __VSF_TIMER_CTRL_DUMMY
Dummy value for compilation, required when no actual control commands are defined.
Definition vsf_template_timer.h:619
struct vsf_timer_isr_t vsf_timer_isr_t
@ VSF_TIMER_IRQ_ALL_BITS_MASK
Definition vsf_template_timer.h:542
@ VSF_TIMER_IRQ_COUNT
Definition vsf_template_timer.h:541
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:548
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:183
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:193
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:146
@ VSF_TIMER_CHANNEL_MODE_ALL_MASK
Definition vsf_template_timer.h:510
@ VSF_TIMER_CHANNEL_MODE_MASK
Definition vsf_template_timer.h:482
@ VSF_TIMER_BASE_COUNTER_MASK
Definition vsf_template_timer.h:505
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_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
uint32_t vsf_timer_get_counter(vsf_timer_t *timer_ptr)
Read the current counter value from the running timer.
Definition timer_common.c:127
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_set_counter_mode_t
Counter write mode for vsf_timer_set_counter().
Definition vsf_template_timer.h:725
@ __VSF_TIMER_SET_COUNTER_MODE_DUMMY
Definition vsf_template_timer.h:726
vsf_timer_channel_ctrl_t
Predefined VSF TIMER control command that can be reimplemented in specific hal drivers....
Definition vsf_template_timer.h:682
@ __VSF_TIMER_CHANNEL_CTRL_DUMMY
Dummy value for compilation.
Definition vsf_template_timer.h:683
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:155
vsf_err_t vsf_timer_channel_start(vsf_timer_t *timer_ptr, uint8_t channel)
start a TIMER channel
Definition timer_common.c:165
vsf_err_t vsf_timer_set_counter(vsf_timer_t *timer_ptr, uint32_t value, vsf_timer_set_counter_mode_t mode)
Write a value into the running timer's counter register.
Definition timer_common.c:136
Generated from commit: vsfteam/vsf@c3767bf