meh

Fork of mbed by mbed official

Revision:
82:6473597d706e
Child:
90:cb3d968589d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TARGET_K64F/TARGET_Freescale/TARGET_KPSDK_MCUS/TARGET_KPSDK_CODE/hal/flextimer/fsl_ftm_hal.h	Mon Apr 07 18:28:36 2014 +0100
@@ -0,0 +1,1216 @@
+/*
+ * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * o Redistributions of source code must retain the above copyright notice, this list
+ *   of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright notice, this
+ *   list of conditions and the following disclaimer in the documentation and/or
+ *   other materials provided with the distribution.
+ *
+ * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
+ *   contributors may be used to endorse or promote products derived from this
+ *   software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#if !defined(__FSL_FTM_HAL_H__)
+#define __FSL_FTM_HAL_H__
+
+#include "fsl_device_registers.h"
+#include "fsl_ftm_features.h"
+#include <stdbool.h>
+#include <assert.h>
+
+/*!
+ * @addtogroup ftm_hal
+ * @{
+ */
+
+/*******************************************************************************
+ * Definitions
+ ******************************************************************************/
+#define HW_FTM_CHANNEL_COUNT (8U) /*!< Number of channels for one FTM instance.*/
+#define HW_FTM_CHANNEL_PAIR_COUNT (4U) /*!< Number of combined channel of one FTM instance.*/
+#define HW_CHAN0 (0U) /*!< Channel number for CHAN0.*/
+#define HW_CHAN1 (1U) /*!< Channel number for CHAN1.*/
+#define HW_CHAN2 (2U) /*!< Channel number for CHAN2.*/
+#define HW_CHAN3 (3U) /*!< Channel number for CHAN3.*/
+#define HW_CHAN4 (4U) /*!< Channel number for CHAN4.*/
+#define HW_CHAN5 (5U) /*!< Channel number for CHAN5.*/
+#define HW_CHAN6 (6U) /*!< Channel number for CHAN6.*/
+#define HW_CHAN7 (7U) /*!< Channel number for CHAN7.*/
+
+#define FTM_COMBINE_CHAN_CTRL_WIDTH  (8U)
+/*! @brief FlexTimer clock source selection*/
+typedef enum _ftm_clock_source
+{
+     kClock_source_FTM_None = 0,
+     kClock_source_FTM_SystemClk,
+     kClock_source_FTM_FixedClk,
+     kClock_source_FTM_ExternalClk
+}ftm_clock_source_t;
+
+/*! @brief FlexTimer counting mode, up-down*/
+typedef enum _ftm_counting_mode
+{
+     kCounting_FTM_UP = 0,
+     kCounting_FTM_Down
+}ftm_counting_mode_t;
+
+/*! @brief FlexTimer pre-scaler factor selection for the clock source*/
+typedef enum _ftm_clock_ps
+{
+     kFtmDividedBy1 = 0,
+     kFtmDividedBy2 ,
+     kFtmDividedBy4 ,
+     kFtmDividedBy8,
+     kFtmDividedBy16,
+     kFtmDividedBy32,
+     kFtmDividedBy64,
+     kFtmDividedBy128
+}ftm_clock_ps_t;
+
+/*! @brief FlexTimer phase for the quadrature*/
+typedef enum _ftm_phase_t
+{
+    kFtmPhaseA = 0,
+    kFtmPhaseB
+}ftm_phase_t;
+
+
+/*! @brief FlexTimer pre-scaler factor for the deadtime insertion*/
+typedef enum _ftm_deadtime_ps
+{
+     kFtmDivided0 = 0,
+     kFtmDivided1 = 1,
+     kFtmDivided4  = 2,
+     kFtmDivided16 = 3,
+}ftm_deadtime_ps_t;
+
+/*! @brief FlexTimer operation mode, capture, output, dual, or quad*/
+ typedef enum _ftm_config_mode_t
+ {
+    kFtmInputCapture,
+    kFtmOutputCompare,
+    kFtmEdgeAlignedPWM,
+    kFtmCenterAlignedPWM,
+    kFtmCombinedPWM,
+    kFtmDualEdgeCapture,
+    kFtmQuadCapture
+ }ftm_config_mode_t;
+
+/*! @brief FlexTimer input capture edge mode, rising edge, or falling edge */
+ typedef enum _ftm_input_capture_edge_mode_t
+ {
+   kFtmRisingEdge = 0,
+   kFtmFallingEdge,
+   kFtmRisingAndFalling
+ }ftm_input_capture_edge_mode_t;
+
+/*! @brief FlexTimer output compare edge mode. Toggle, clear or set.*/
+ typedef enum _ftm_output_compare_edge_mode_t
+ {
+   kFtmToggleOnMatch = 0,
+   kFtmClearOnMatch,
+   kFtmSetOnMatch
+ }ftm_output_compare_edge_mode_t;
+
+/*! @brief FlexTimer PWM output pulse mode, high-true or low-true on match up */
+ typedef enum _ftm_pwm_edge_mode_t
+ {
+   kFtmHighTrue = 0,
+   kFtmLowTrue
+ }ftm_pwm_edge_mode_t;
+
+ /*! @brief FlexTimer dual capture edge mode, one shot or continuous */
+ typedef enum _ftm_dual_capture_edge_mode_t
+ {
+   kFtmOneShout = 0,
+   kFtmContinuous
+ }ftm_dual_capture_edge_mode_t;
+
+/*! @brief FlexTimer edge mode*/
+ typedef union _ftm_edge_mode_t
+ {
+    ftm_input_capture_edge_mode_t  input_capture_edge_mode;
+    ftm_output_compare_edge_mode_t output_compare_edge_mode;
+    ftm_pwm_edge_mode_t            ftm_pwm_edge_mode;
+    ftm_dual_capture_edge_mode_t   ftm_dual_capture_edge_mode;
+ }ftm_edge_mode_t;
+/*! @brief FlexTimer module configuration*/
+typedef struct FTMConfig {
+  ftm_config_mode_t   mode;
+  uint8_t             channel;   /*channel or channel pair in combine mode*/
+  ftm_edge_mode_t     edge_mode;
+
+}ftm_config_t;
+/*FTM timer control*/
+/*!
+ * @brief Sets the FTM clock source.
+ * @param instance The FTM peripheral instance number
+ * @param clock  The FTM peripheral clock selection
+ * bits:00: No clock  01: system clock  10 :fixed clock 11:External clock
+ */
+static inline void ftm_hal_set_clock_source(uint8_t instance, ftm_clock_source_t clock)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT);
+    BW_FTM_SC_CLKS(instance, clock);
+}
+
+/*!
+ * @brief Sets the FTM clock divider.
+ * @param instance The FTM peripheral instance number
+ * @param ps  The FTM peripheral clock pre-scale divider
+ */
+static inline void ftm_hal_set_clock_ps(uint8_t instance, ftm_clock_ps_t ps)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT);
+    BW_FTM_SC_PS(instance, ps);
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer overflow interrupt.
+ * @param instance The FTM peripheral instance number
+ */
+static inline void ftm_hal_enable_timer_overflow_interrupt(uint8_t instance)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT);
+    HW_FTM_SC_SET(instance, BM_FTM_SC_TOIE);
+}
+
+/*!
+ * @brief Disables the FTM peripheral timer overflow interrupt.
+ * @param instance The FTM peripheral instance number
+ */
+static inline void ftm_hal_disable_timer_overflow_interrupt(uint8_t instance)
+{
+     assert(instance <HW_FTM_INSTANCE_COUNT);
+     HW_FTM_SC_CLR(instance, BM_FTM_SC_TOIE);
+}
+
+/*!
+ * @brief Returns the FTM peripheral timer overflow interrupt flag.
+ * @param instance The FTM peripheral instance number
+ * @retval true if overflow, false if not
+ */
+static inline bool ftm_is_timer_overflow(uint8_t instance)
+{
+     assert(instance <HW_FTM_INSTANCE_COUNT);
+     return BR_FTM_SC_TOF(instance);
+}
+
+/*!
+ * @brief Sets the FTM center-aligned PWM select.
+ * @param instance The FTM peripheral instance number
+ * @param mode 1:upcounting mode 0:up_down counting mode
+ */
+static inline void ftm_hal_set_cpwms(uint8_t instance, uint8_t mode)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT && mode<2);
+    BW_FTM_SC_CPWMS(instance, mode);
+}
+
+/*!
+ * @brief Sets the FTM peripheral current counter value.
+ * @param instance The FTM peripheral instance number
+ * @param val  FTM timer counter value to be set
+ */
+static inline void  ftm_hal_set_counter(uint8_t instance,uint16_t val)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT);
+    BW_FTM_CNT_COUNT(instance, val);
+}
+
+/*!
+ * @brief Returns the FTM peripheral current counter value.
+ * @param instance The FTM peripheral instance number
+ * @retval current FTM timer counter value
+ */
+static inline uint16_t  ftm_hal_get_counter(uint8_t instance)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT);
+    return BR_FTM_CNT_COUNT(instance);
+}
+
+/*!
+ * @brief Sets the FTM peripheral timer modulo value.
+ * @param instance The FTM peripheral instance number
+ * @param val The value to be set to the timer modulo
+ */
+static inline void ftm_hal_set_mod(uint8_t instance, uint16_t val)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT);
+    BW_FTM_MOD_MOD(instance, val);
+}
+
+/*!
+ * @brief Returns the FTM peripheral counter modulo value.
+ * @param instance The FTM peripheral instance number
+ * @retval FTM timer modulo value
+ */
+static inline uint16_t  ftm_hal_get_mod(uint8_t instance)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT);
+    return BR_FTM_MOD_MOD(instance);
+}
+
+/*!
+ * @brief Sets the FTM peripheral timer counter initial value.
+ * @param instance The FTM peripheral instance number
+ * @param val initial value to be set
+ */
+static inline void ftm_hal_set_counter_init_val(uint8_t instance, uint16_t val)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT);
+    BW_FTM_CNTIN_INIT(instance, val&BM_FTM_CNTIN_INIT);
+}
+
+/*!
+ * @brief Returns the FTM peripheral counter initial value.
+ * @param instance The FTM peripheral instance number
+ * @retval FTM timer counter initial value
+ */
+static inline uint16_t  ftm_hal_get_counter_init_val(uint8_t instance)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT);
+    return BR_FTM_CNTIN_INIT(instance);
+}
+
+/*FTM channel operating mode (Mode, edge and level selection) for capture, output, PWM, combine, dual or quad*/
+/*!
+ * @brief Sets the FTM peripheral timer channel mode.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+* @param selection The mode to be set valid value MSnB:MSnA :00,01, 10, 11
+ */
+static inline void ftm_hal_set_channel_MSnBA_mode(uint8_t instance, uint8_t channel, uint8_t selection)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+    BW_FTM_CnSC_MSA(instance, channel, selection&1);
+    BW_FTM_CnSC_MSB(instance, channel, selection&2? 1:0);
+
+}
+
+/*!
+ * @brief Sets the FTM peripheral timer channel edge level.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+* @param level The rising or falling edge to be set, valid value ELSnB:ELSnA :00,01, 10, 11
+ */
+static inline void ftm_hal_set_channel_edge_level(uint8_t instance, uint8_t channel, uint8_t level)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+    BW_FTM_CnSC_ELSA(instance, channel, level&1? 1:0);
+    BW_FTM_CnSC_ELSB(instance, channel, level&2?1:0);
+}
+
+/*!
+ * @brief Gets the FTM peripheral timer channel mode.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+* @retval The MSnB:MSnA mode value, will be 00,01, 10, 11
+ */
+static inline uint8_t ftm_hal_get_channel_mode(uint8_t instance, uint8_t channel)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+    return (BR_FTM_CnSC_MSA(instance, channel)|| (BR_FTM_CnSC_MSB(instance, channel)<<1));
+}
+
+/*!
+ * @brief Gets the FTM peripheral timer channel edge level.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+* @retval The ELSnB:ELSnA mode value, will be 00,01, 10, 11
+ */
+static inline uint8_t ftm_hal_get_channel_edge_level(uint8_t instance, uint8_t channel)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+    return (BR_FTM_CnSC_ELSA(instance, channel)|| (BR_FTM_CnSC_ELSB(instance, channel)<<1));
+}
+
+/*!
+ * @brief Enables or disables the FTM peripheral timer channel DMA.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+* @param val enable or disable
+ */
+static inline void ftm_hal_enable_channle_dma(uint8_t instance, uint8_t channel, bool val)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+    BW_FTM_CnSC_DMA(instance, channel,(val? 1:0));
+}
+
+/*!
+ * @brief Returns whether the FTM peripheral timer channel DMA is enabled.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+*  @retval true if enabled, false if disabled
+ */
+static inline bool ftm_hal_is_channel_dma(uint8_t instance, uint8_t channel, bool val)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+    return (BR_FTM_CnSC_DMA(instance, channel) ? true : false);
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer channel(n) interrupt.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ */
+static inline void ftm_hal_enable_channel_interrupt(uint8_t instance, uint8_t channel)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+    BW_FTM_CnSC_CHIE(instance, channel, 1);
+}
+/*!
+ * @brief Disables the FTM peripheral timer channel(n) interrupt.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ */
+static inline void ftm_hal_disable_channel_interrupt(uint8_t instance, uint8_t channel)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+    BW_FTM_CnSC_CHIE(instance, channel, 0);
+}
+
+/*!
+ * @brief Returns whether any event for the FTM peripheral timer channel has occurred.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @retval true if event occurred, false otherwise.
+ */
+static inline bool ftm_is_channel_event_occurred(uint8_t instance, uint8_t channel)
+{
+  assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+  return (BR_FTM_CnSC_CHF(instance, channel))? true : false;
+}
+
+/*FTM channel control*/
+/*!
+ * @brief Sets the FTM peripheral timer channel counter value.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param val counter value to be set
+ */
+static inline void ftm_hal_set_channel_count_value(uint8_t instance, uint8_t channel, uint16_t val)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+   HW_FTM_CnV_WR(instance, channel, val);
+}
+
+/*!
+ * @brief Gets the FTM peripheral timer channel counter value.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @retval val return current channel counter value
+ */
+static inline uint16_t ftm_hal_get_channel_count_value(uint8_t instance, uint8_t channel, uint16_t val)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+   return BR_FTM_CnV_VAL(instance, channel);
+}
+
+/*!
+ * @brief Gets the FTM peripheral timer  channel event status.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @retval val return current channel event status value
+ */
+static inline uint32_t ftm_hal_get_channel_event_status(uint8_t instance, uint8_t channel)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+   return (HW_FTM_STATUS_RD(instance)&(1U<<channel))?  true: false;
+   /*return BR_FTM_STATUS(instance, channel);*/
+}
+
+/*!
+ * @brief Clears the FTM peripheral timer all channel event status.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @retval val return current channel counter value
+ */
+static inline void ftm_hal_clear_channel_event_status(uint8_t instance, uint8_t channel)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+   HW_FTM_STATUS_CLR(instance, 1U<<channel);
+}
+
+/*!
+ * @brief Sets the FTM peripheral timer channel output mask.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param mask mask to be set 0 or 1, unmasked or masked
+ */
+static inline void ftm_hal_set_channel_output_mask(uint8_t instance, uint8_t channel, bool  mask)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+   mask? HW_FTM_OUTMASK_SET(instance, 1U<<channel):HW_FTM_OUTMASK_CLR(instance, 1U<<channel);
+  /* BW_FTM_OUTMASK_CHnOM(instance, channel,mask); */
+}
+
+/*!
+ * @brief Sets the FTM peripheral timer channel output initial state 0 or 1.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param state counter value to be set 0 or 1
+ */
+static inline void ftm_hal_set_channel_output_init_state(uint8_t instance, uint8_t channel, uint8_t state)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+   HW_FTM_OUTINIT_CLR(instance, 1U<<channel);
+   HW_FTM_OUTINIT_SET(instance, (uint8_t)(state<<channel));
+}
+
+/*!
+ * @brief Sets the FTM peripheral timer channel output polarity.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param pol polarity to be set 0 or 1
+ */
+static inline void ftm_hal_set_channel_output_polarity(uint8_t instance, uint8_t channel, uint8_t pol)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+   HW_FTM_POL_CLR(instance, 1U<<channel);
+   HW_FTM_POL_SET(instance, (uint8_t)(pol<<channel));
+}
+/*!
+ * @brief Sets the FTM peripheral timer channel input polarity.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param pol polarity  to be set, 0: active high, 1:active low
+ */
+static inline void ftm_hal_set_channel_fault_input_polarity(uint8_t instance, uint8_t channel, uint8_t pol)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+   HW_FTM_FLTPOL_CLR(instance,  1U<<channel);
+   HW_FTM_FLTPOL_SET(instance,  (uint8_t)(pol<<channel));
+}
+
+
+/*Feature mode selection HAL*/
+    /*FTM fault control*/
+/*!
+ * @brief Enables the FTM peripheral timer fault interrupt.
+ * @param instance The FTM peripheral instance number
+ */
+static inline void ftm_hal_enable_fault_interrupt(uint8_t instance)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT);
+   BW_FTM_MODE_FAULTIE(instance, 1);
+}
+
+/*!
+ * @brief Disables the FTM peripheral timer fault interrupt.
+ * @param instance The FTM peripheral instance number
+ */
+static inline void ftm_hal_disable_fault_interrupt(uint8_t instance)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT);
+   BW_FTM_MODE_FAULTIE(instance, 0);
+}
+
+/*!
+ * @brief Sets the FTM peripheral timer fault control mode.
+ * @param instance The FTM peripheral instance number
+ * @param mode, valid number bits:00, 01, 10,11 (1, 2, 3, 4)
+ */
+static inline void ftm_hal_set_fault_control_mode(uint8_t instance, uint8_t mode)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT);
+   BW_FTM_MODE_FAULTM(instance, mode);
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer capture test.
+ * @param instance The FTM peripheral instance number
+ * @param enable  true to enable, false to disable
+ */
+static inline void ftm_hal_enable_capture_test(uint8_t instance, bool enable)
+{
+     assert(instance <HW_FTM_INSTANCE_COUNT);
+     BW_FTM_MODE_CAPTEST(instance, enable? 1: 0);
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer write protection.
+ * @param instance The FTM peripheral instance number
+ * @param enable  true to enable, false to disable
+ */
+static inline void ftm_hal_enable_write_protection(uint8_t instance, bool enable)
+{
+     assert(instance <HW_FTM_INSTANCE_COUNT);
+     BW_FTM_MODE_WPDIS(instance, enable? 0: 1);
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer group.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_ftm_enable(uint8_t instance, bool enable)
+{
+     assert(instance <HW_FTM_INSTANCE_COUNT);
+     assert(BR_FTM_MODE_WPDIS(instance));
+     BW_FTM_MODE_FTMEN(instance, enable? 0: 1);
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer channel output initialization.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_channel_init_output(uint8_t instance, bool enable)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT);
+    BW_FTM_MODE_INIT(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Sets the FTM peripheral timer sync mode.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True no restriction both software and hardware sync, false only software sync.
+ */
+static inline void ftm_hal_set_pwm_sync_mdoe(uint8_t instance, bool enable)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT);
+   BW_FTM_MODE_PWMSYNC(instance, enable? 1:0);
+}
+
+/*FTM synchronization control*/
+/*!
+ * @brief Enables the FTM peripheral timer software trigger.
+ * @param instance The FTM peripheral instance number.
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_software_trigger(uint8_t instance, bool enable)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNC_SWSYNC(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Sets the FTM peripheral timer hardware trigger.
+ * @param instance The FTM peripheral instance number
+ * @param trigger_num  0, 1,2 for trigger0, trigger1 and trigger3
+ * @param enable True to enable, 1 to enable
+ */
+void ftm_hal_set_hardware_trigger(uint8_t instance, uint8_t trigger_num, bool enable);
+
+/*!
+ * @brief Enables the FTM peripheral timer output mask update by PWM sync.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable PWM sync, false to enable outmask in the rising edges of the system clock
+ */
+static inline void ftm_hal_enable_output_mask_sync_by_pwm(uint8_t instance, bool enable)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNC_SYNCHOM(instance, enable?1:0);
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer counter re-initialized by sync.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to update FTM counter when triggered , false to count normally
+ */
+static inline void ftm_hal_enable_count_reinit_sync(uint8_t instance, bool enable)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNC_REINIT(instance, enable?1:0);
+}
+/*!
+ * @brief Enables the FTM peripheral timer maximum loading points.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_max_loading(uint8_t instance, bool enable)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNC_CNTMAX(instance, enable?1:0);
+}
+/*!
+ * @brief Enables the FTM peripheral timer minimum loading points.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_min_loading(uint8_t instance, bool enable)
+{
+   assert(instance <HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNC_CNTMIN(instance, enable?1:0);
+}
+
+/*!
+ * @brief Combines the channel control.
+ *
+ * Returns an index for each channel pair.
+ *
+ * @param channel  The FTM peripheral channel number.
+ * @return 0 for channel pair 0 & 1\n
+ *         1 for channel pair 2 & 3\n
+ *         2 for channel pair 4 & 5\n
+ *         3 for channel pair 6 & 7
+ */
+static uint32_t get_channel_pair_index(uint8_t channel)
+{
+    if((channel == HW_CHAN0) || (channel == HW_CHAN1))
+    {
+        return 0;
+    }
+    else if((channel == HW_CHAN2) || (channel == HW_CHAN3))
+    {
+        return 1;
+    }
+    else if((channel == HW_CHAN4) || (channel == HW_CHAN5))
+    {
+        return 2;
+    }
+    else
+    {
+        return 3;
+    }
+}
+
+/*set DECAPEN bit*/
+/*!
+ * @brief Enables the FTM peripheral timer dual edge capture mode.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_dual_capture(uint8_t instance, uint8_t channel, bool enable)
+{
+    assert(instance < HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+
+    enable? HW_FTM_COMBINE_SET(instance,  BM_FTM_COMBINE_DECAPEN0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH)):
+     HW_FTM_COMBINE_CLR(instance,  BM_FTM_COMBINE_DECAPEN0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH));
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer channel pair fault control.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param enable  True to enable, false to disable
+ */
+static inline  void ftm_hal_enable_dual_channel_fault(uint8_t instance, uint8_t channel, bool enable)
+{
+    assert(instance < HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+
+    enable? HW_FTM_COMBINE_SET(instance, BM_FTM_COMBINE_FAULTEN0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH)):
+             HW_FTM_COMBINE_CLR(instance, BM_FTM_COMBINE_FAULTEN0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH));
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer channel pair counter PWM sync.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_dual_channel_pwm_sync(uint8_t instance, uint8_t channel, bool enable)
+{
+    assert(instance < HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+
+    enable? HW_FTM_COMBINE_SET(instance, BM_FTM_COMBINE_SYNCEN0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH)):
+           HW_FTM_COMBINE_CLR(instance, BM_FTM_COMBINE_SYNCEN0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH));
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer channel pair deadtime.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_dual_channel_deadtime(uint8_t instance, uint8_t channel, bool enable)
+{
+    assert(instance < HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+
+    enable? HW_FTM_COMBINE_SET(instance,  BM_FTM_COMBINE_DTEN0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH)):
+           HW_FTM_COMBINE_CLR(instance,  BM_FTM_COMBINE_DTEN0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH));
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer channel dual edge capture decap, not decapen.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_dual_channel_decap(uint8_t instance, uint8_t channel, bool enable)
+{
+    assert(instance < HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+
+    enable? HW_FTM_COMBINE_SET(instance, BM_FTM_COMBINE_DECAP0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH)):
+             HW_FTM_COMBINE_CLR(instance, BM_FTM_COMBINE_DECAP0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH));
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer channel pair output complement mode.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_dual_channel_comp(uint8_t instance, uint8_t channel, bool enable)
+{
+    assert(instance < HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+
+    enable? HW_FTM_COMBINE_SET(instance,  BM_FTM_COMBINE_COMP0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH)):
+             HW_FTM_COMBINE_CLR(instance,  BM_FTM_COMBINE_COMP0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH));
+
+}
+
+/*!
+ * @brief Enables the FTM peripheral timer channel pair output combine mode.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param enable  True to enable channel pair to combine, false to disable
+ */
+static inline void ftm_hal_enable_dual_channel_combine(uint8_t instance, uint8_t channel, bool enable)
+{
+    assert(instance < HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+
+    enable? HW_FTM_COMBINE_SET(instance, BM_FTM_COMBINE_COMBINE0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH)):
+             HW_FTM_COMBINE_CLR(instance, BM_FTM_COMBINE_COMBINE0 << (get_channel_pair_index(channel) * FTM_COMBINE_CHAN_CTRL_WIDTH));
+}
+
+/*FTM dead time insertion control*/
+/*!
+ * @brief Set the FTM deadtime divider.
+ * @param instance The FTM peripheral instance number
+ * @param divider  The FTM peripheral  prescale divider
+    0x :divided by 1, 10: divided by 4 11:divided by 16
+ */
+static inline void ftm_hal_set_deadtime_prescale(uint8_t instance, ftm_deadtime_ps_t divider)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_DEADTIME_DTVAL(instance, divider);
+}
+
+/*!
+ * @brief Sets the FTM deadtime value.
+ * @param instance The FTM peripheral instance number
+ * @param divider  The FTM peripheral  prescale divider
+    count: 0, no counts inserted  1: 1 count is inserted 2: 2 count is inserted....
+ */
+static inline void ftm_hal_set_deadtime_count(uint8_t instance, uint8_t count)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_DEADTIME_DTPS(instance, count);
+}
+/*FTM external trigger */
+/*!
+ * @brief Enables the generation of the FTM peripheral timer channel trigger when the FTM counter is equal to its initial value.
+   Channels 6 and 7 cannot be used as triggers.
+ * @param instance The FTM peripheral instance number
+ * @param channel Channel to be enabled,  valid value 0, 1, 2, 3, 4, 5
+ * @param enable  True to enable, false to disable
+ */
+void ftm_hal_enable_channel_trigger(uint8_t instance, uint8_t channel, bool val);
+/*!
+ * @brief Checks whether any channel trigger event has occurred.
+ * @param instance The FTM peripheral instance number
+ * @retval True if there is a trigger event, false if not.
+ */
+static inline bool ftm_hal_is_channel_trigger_generated(uint8_t instance, uint8_t channel)
+{
+    assert(instance <HW_FTM_INSTANCE_COUNT && channel < HW_CHAN6);
+    return BR_FTM_EXTTRIG_TRIGF(instance);
+}
+
+
+/*Fault mode status*/
+/*!
+ * @brief Gets the FTM detected fault input.
+ * @param instance The FTM peripheral instance number
+ * @retval Return faulty byte
+ */
+static inline uint8_t ftm_hal_get_detected_fault_input(uint8_t instance)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   return  (HW_FTM_FMS(instance).U &0x0f);
+}
+/*!
+ * @brief Checks whether the write protection is enabled.
+ * @param instance The FTM peripheral instance number
+ * @retval True if enabled, false if not
+ */
+static inline bool    ftm_hal_is_write_protection_enable(uint8_t instance)
+{
+    assert(instance < HW_FTM_INSTANCE_COUNT);
+    return BR_FTM_FMS_WPEN(instance)? true:false;
+}
+
+/*Quadrature decoder control*/
+/*!
+ * @brief Enables the channel quadrature decoder.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_quad_capture(uint8_t instance, bool enable)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+}
+
+/*Hardware definition for quadrature decoder control is missing, implement this later */
+/*static inline void ftm_hal_enable_quad_input_filter(uint8_t instance, ftm_phase_t phase)
+static inline void ftm_hal_set_quad_phase_normal_polarity(uint8_t instance, ftm_phase_t phase)
+static inline void ftm_hal_set_quad_phase_invert_polarity(uint8_t instance, ftm_phase_t phase)
+static inline void ftm_hal_set_quad_mode()
+static inline void ftm_hal_set_quad_direction()
+static inline void ftm_hal_set_quad_timer_overflow_direction()*/
+
+/*!
+ * @brief Sets the FTM peripheral timer channel input capture filter value.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number, only 0,1,2,3, channel 4, 5,6, 7 don't have.
+ * @param val  Filter value to be set
+ */
+void ftm_hal_set_channel_input_capture_filter(uint8_t instance, uint8_t channel, uint8_t val);
+
+
+
+/*!
+ * @brief Enables the channel input filter.
+ * @param instance The FTM peripheral instance number
+ * @param channel Channel to be enabled,  valid value 0, 1, 2, 3
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_channel_fault_input_filter(uint8_t instance, uint8_t channel, bool val)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT  && channel < HW_CHAN4);
+   val? HW_FTM_FLTCTRL_SET(instance, (1U<<channel)) : HW_FTM_FLTCTRL_CLR(instance, (1U<<channel));
+}
+
+/*!
+ * @brief Enables the channel fault input.
+ * @param instance The FTM peripheral instance number
+ * @param channel Channel to be enabled,  valid value 0, 1, 2, 3
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_channel_fault_input(uint8_t instance, uint8_t channel, bool val)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT  && channel < HW_CHAN4);
+   val ? HW_FTM_FLTCTRL_SET(instance,  ((1U << channel) + 4))
+       : HW_FTM_FLTCTRL_CLR(instance,  ((1U << channel) + 4));
+}
+
+/*!
+ * @brief Enables the channel invert.
+ * @param instance The FTM peripheral instance number
+ * @param channel  The FTM peripheral channel number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_dual_channel_invert(uint8_t instance, uint8_t channel, bool val)
+{
+    assert(instance < HW_FTM_INSTANCE_COUNT && channel < HW_FTM_CHANNEL_COUNT);
+
+    val ? HW_FTM_INVCTRL_SET(instance, (1U << get_channel_pair_index(channel)))
+        : HW_FTM_INVCTRL_CLR(instance, (1U << get_channel_pair_index(channel)));
+}
+
+/*FTM software output control*/
+/*!
+ * @brief Enables the channel software control.
+ * @param instance The FTM peripheral instance number
+ * @param channel Channel to be enabled,  valid value 0, 1, 2, 3, 4,5,6,7
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_channel_software_ctrl(uint8_t instance, uint8_t channel, bool val)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT  && channel < HW_FTM_CHANNEL_COUNT);
+   val? HW_FTM_SWOCTRL_SET(instance,  (1U<<channel)) : HW_FTM_SWOCTRL_CLR(instance,  (1U<<channel));
+}
+/*!
+ * @brief Sets the channel software control value.
+ * @param instance The FTM peripheral instance number.
+ * @param channel Channel to be enabled,  valid value 0, 1, 2, 3,5,6,7,
+ * @param bool  True to set 1, false to set 0
+ */
+static inline void ftm_hal_set_channel_software_ctrl_val(uint8_t instance, uint8_t channel, bool val)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT  && channel < HW_FTM_CHANNEL_COUNT);
+          val? HW_FTM_SWOCTRL_SET(instance, (1U<<(channel+8))) : HW_FTM_SWOCTRL_CLR(instance, (1U<<(channel+8)));
+}
+
+/*FTM PWM load control*/
+/*!
+ * @brief Enables the FTM timer PWM loading of MOD, CNTIN and CV.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_pwm_load(uint8_t instance, bool enable)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   HW_FTM_PWMLOAD(instance).B.LDOK = enable? 1:0;
+}
+
+/*!
+ * @brief Enables the channel matching process.
+ * @param instance The FTM peripheral instance number
+ * @param channel Channel to be enabled,  valid value 0, 1, 2, 3, 4,5,6,7
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_pwm_load_matching_channel(uint8_t instance, uint8_t channel, bool val)
+{
+    assert(instance < HW_FTM_INSTANCE_COUNT  && channel < HW_FTM_CHANNEL_COUNT);
+    val? HW_FTM_PWMLOAD_SET(instance, 1U<<channel) : HW_FTM_PWMLOAD_CLR(instance, 1U<<channel);
+}
+/*FTM configuration*/
+/*!
+ * @brief Enables the FTM timer global time base output.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_global_time_base_output(uint8_t instance, bool enable)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_CONF_GTBEOUT(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Enables the FTM timer global time base.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_global_time_base(uint8_t instance, bool enable)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_CONF_GTBEEN(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Sets the FTM timer TOF Frequency.
+ * @param instance The FTM peripheral instance number
+ * @param val  Value of the TOF bit set frequency 
+ */
+static inline void ftm_hal_set_bdm_mode(uint8_t instance, uint8_t val)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_CONF_NUMTOF(instance, val);
+}
+
+/*!
+ * @brief Sets the BDM mode.
+ * @param instance The FTM peripheral instance number
+ * @param val  Value of the TOF bit set frequency 
+ */
+static inline void ftm_hal_set_tof_frequency(uint8_t instance, uint8_t val)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_CONF_BDMMODE(instance, val);
+}
+
+/*FTM sync configuration*/
+  /*hardware sync*/
+/*!
+ * @brief Enables the FTM timer hardware sync activation.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_hardware_sync_software_output_ctrl(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_HWSOC(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Enables the FTM timer hardware inverting control sync.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_hardware_sync_invert_ctrl(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_HWINVC(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Enables the FTM timer hardware outmask sync.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_hardware_sync_output_mask(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_HWOM(instance, enable? 1:0);
+}
+
+/*!
+ * @brief MOD, CNTIN, and CV registers synchronization is activated.
+ *
+ * A hardware trigger  activates the synchronization.
+ *
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_hardware_sycn_mod_cntin_cv(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_HWWRBUF(instance, enable? 1:0);
+}
+
+/*!
+ * @brief The FTM counter synchronization is activated by a hardware trigger.
+ *
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_hardware_sync_counter(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_HWRSTCNT(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Enables the FTM timer software sync activation.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_pwm_sync_swoctrl(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_SWOC(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Enables the FTM timer enhanced PWM sync mode.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_enhanced_pwm_sync_mdoe(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_SYNCMODE(instance, enable? 1:0);
+}
+
+
+/*!
+ * @brief Enables the FTM timer software output control sync.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_software_sync_swoctrl(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_SWSOC(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Enables the FTM timer software inverting control sync.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_software_sync_invert_ctrl(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_SWINVC(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Enables the FTM timer software outmask sync.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_software_sync_output_mask(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_SWOM(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Enables the FTM timer software outmask sync.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable.
+ */
+static inline void ftm_hal_enable_software_sycn_mod_cntin_cv(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_SWWRBUF(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Enables the FTM timer counter software sync.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to enable, false to disable
+ */
+static inline void ftm_hal_enable_software_sync_counter(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_SWRSTCNT(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Enables the FTM timer INVCTRL update by PWM.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to update with PWM, false to update with rising edge of system clock.
+ */
+static inline void ftm_hal_enable_invert_sync_with_rising_edge(uint8_t instance, bool enable)
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_INVC(instance, enable? 1:0);
+}
+
+/*!
+ * @brief Enables the FTM timer cntin update by PWM.
+ * @param instance The FTM peripheral instance number
+ * @param enable  True to update with PWM, false to update with rising edge of system clock.
+ */
+static inline void ftm_hal_enable_cntin_sync_with_rising_edge(uint8_t instance, bool enable )
+{
+   assert(instance < HW_FTM_INSTANCE_COUNT);
+   BW_FTM_SYNCONF_CNTINC(instance, enable? 1:0);
+}
+
+
+/*HAL functionality*/
+/*!
+ * @brief Resets the FTM registers
+ * @param instance The FTM peripheral instance number
+ */
+void ftm_hal_reset(uint8_t instance);
+
+/*!
+ * @brief Initializes the FTM.
+ * @param instance The FTM peripheral instance number.
+*/
+void ftm_hal_init(uint8_t instance, ftm_config_t *config);
+/*Initializes the  5 FTM operating mode, input capture, output compare, PWM output(edge aligned, center-aligned, conbine), dual and quadrature).*/
+
+/*void ftm_hal_input_capture_mode(uint8_t instance);*/
+/*void ftm_hal_output_compare_mode(uint8_t instance);*/
+
+/*!
+ * @brief Enables the FTM timer when it is PWM output mode.
+ * @param instance The FTM peripheral instance number
+ * @param config pwm config parameter
+ */
+void ftm_hal_enable_pwm_mode(uint8_t instance, ftm_config_t *config);
+
+/*!
+ * @brief Initializes the FTM timer when it is PWM output mode.
+ * @param instance The FTM peripheral instance number
+ */
+void ftm_hal_disable_pwm_mode(uint8_t instance, ftm_config_t *config);
+/*void ftm_hal_dual_mode(uint8_t instance);*/
+/*void ftm_hal_quad_mode(uint8_t instance);*/
+
+
+/*void ftm_hal_set_counting_mode(); //up, up down or free running counting mode*/
+/*void ftm_hal_set_deadtime(uint8_t instance, uint_32 us);*/
+
+/*! @}*/
+
+#endif /* __FSL_FTM_HAL_H__*/
+/*******************************************************************************
+ * EOF
+ ******************************************************************************/