/************************************************************************************************/
/**
* @file               ciu32f003_std_tim.h          
* @author             MCU Ecosystem Development Team
* @brief              TIM STD库驱动头文件。
*                     提供TIM相关的STD库操作函数声明、数据类型以及常量的定义。 
* 
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/

/*避免头文件重复引用*/
#ifndef CIU32F003_STD_TIM_H
#define CIU32F003_STD_TIM_H

/************************************************************************************************/
/**
* @addtogroup CIU32F003_STD_Driver
* @{
*/

/**
* @defgroup TIM TIM
* @brief    高级控制定时器/通用定时器的STD库驱动
* @{
*
*/
/************************************************************************************************/

#ifdef __cplusplus
extern "C" {
#endif

/*------------------------------------------includes--------------------------------------------*/
#include "ciu32f003_std_common.h"


/*-----------------------------------------type define------------------------------------------*/

/************************************************************************************************/
/** 
* @defgroup TIM_Types TIM Types
* @brief    TIM数据类型定义
* @{
*/
/************************************************************************************************/

/**
* @brief  TIM基本参数配置结构体定义
*/
typedef struct
{    
    uint32_t prescaler;              /**< TIM时钟的预分频参数                               
                                              @note TIM1预分频参数范围为：0x0000~0xFFFF    
                                                    TIM3预分频参数范围为：0x0000~0x000F                    */
                                   
    uint32_t counter_mode;           /**< 计数器模式选择
                                              @arg TIM_COUNTER_MODE_UP ...                                 */
                                   
    uint32_t period;                 /**< 在下次更新事件时加载到自动重新加载寄存器中的溢出值
                                          其值必须在0x0000~0xFFFF之间                                      */
                                   
    uint32_t clock_div;              /**< TIM时钟分频参数
                                              @arg TIM_CLOCK_DTS_DIV1 ...                                  */
                                   
    uint8_t repeat_counter;         /**< 重复计数器参数定义，每当RCR向下计数达到0时，会产出一个更新事件，
                                         并从RCR的值(N)开始重新计数，该参数必须在0x0000~0x00FF之间。       */
                                   
}std_tim_basic_init_t;


/**
* @brief  TIM输入捕获参数配置结构体定义
*/
typedef struct
{
    uint32_t  input_capture_pol;         /**< 输入信号的有效边沿选择                           
                                                  @arg TIM_INPUT_POL_RISING ...                */
                                
    uint32_t input_capture_sel;          /**< 输入模式定义
                                                  @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI ...      */
                                
    uint32_t input_capture_prescaler;    /**< 输入捕获预分频定义
                                                  @arg TIM_INPUT_CAPTURE_PSC_DIV1 ...          */
                                
    uint32_t input_capture_filter;       /**< 输入捕获滤波器定义，其值必须在0x0~0x7之间        */
    
}std_tim_input_capture_init_t;      


/**
* @brief  TIM输出比较参数配置结构体定义
*/
typedef struct
{
    uint32_t output_compare_mode;        /**< TIM输出比较模式定义
                                                  @arg TIM_OUTPUT_MODE_ACTIVE ...                           */
    
    uint32_t output_state;               /**< 输出使能定义                                               
                                                  @arg TIM_OUTPUT_DISABLE ...                               */
 
    uint32_t output_negtive_state;       /**< 互补输出使能定义                                               
                                                  @arg TIM_OUTPUT_NEGTIVE_DISABLE ...                       */
                                   
    uint32_t pulse;                      /**< TIM载入捕获比较寄存器的脉冲值，其值必须在0x0000~0xFFFF之间    */    
                                   
    uint32_t output_pol;                 /**< 输出极性定义
                                                  @arg TIM_OUTPUT_POL_HIGH ...                              */
                                   
    uint32_t output_negtive_pol;         /**< 互补输出极性定义
                                                  @arg TIM_OUTPUT_NEGTIVE_POL_HIGH ...                      */                                                                     
                                   
    uint32_t output_idle_state;          /**< TIM空闲状态下输出状态定义
                                                  @arg  TIM_OUTPUT_IDLE_SET ...
                                                  @note 该参数仅对支持Break功能的定时器实例有效             */
                                   
    uint32_t output_negtive_idle_state;  /**< TIM空闲状态下互补输出状态定义
                                                  @arg  TIM_OUTPUT_NEGTIVE_IDLE_SET ...
                                                  @note 该参数仅对支持Break功能的定时器实例有效             */
    
}std_tim_output_compare_init_t;


/**
* @brief  TIM断路输入和死区参数配置结构体定义
*/
typedef struct
{
    uint32_t off_state_run_mode;                        /**< 运行模式下的关闭状态
                                                                 @arg TIM_OSSR_ENABLE ...            */
    
    uint32_t off_state_idle_mode;                       /**< 空闲模式下的关闭状态
                                                                 @arg TIM_OSSI_ENABLE ...            */
    
    uint32_t lock_level;                                /**< LOCK级别
                                                                 @arg TIM_LOCK_LEVEL1 ...            */  
    
    uint32_t dead_time;                                 /**< 死区参数定义，其值必须在0x00~0xFF之间   */
       
    uint32_t break_state;                              /**< 断路功能使能控制
                                                                  @arg TIM_BREAK_ENABLE
                                                                  @arg TIM_BREAK_DISABLE             */ 
    
}std_tim_break_init_t;



/**
* @}
*/
  
/*--------------------------------------------define--------------------------------------------*/

/************************************************************************************************/
/**
* @defgroup TIM_Constants TIM Constants 
* @brief    TIM常量定义及宏定义
* @{
*
*/
/************************************************************************************************/
/* TIM计数模式定义 */
#define TIM_COUNTER_MODE_UP                (0x00000000U)                      /**< 向上计数                      */
#define TIM_COUNTER_MODE_DOWN              TIM_CR1_DIR                        /**< 向下计数                      */
#define TIM_COUNTER_MODE_CENT_MODE1        TIM_CR1_CMS_CENTER_DOWN            /**< 中心对齐模式1                 */
#define TIM_COUNTER_MODE_CENT_MODE2        TIM_CR1_CMS_CENTER_UP              /**< 中心对齐模式2                 */
#define TIM_COUNTER_MODE_CENT_MODE3        TIM_CR1_CMS_CENTER_UP_DOWN         /**< 中心对齐模式3                 */

/* TIM更新事件源选择 */
#define TIM_UPDATE_SOURCE_REGULAR          (0x00000000U)                      /**< 计数上溢或下溢触发                       */
#define TIM_UPDATE_SOURCE_COUNTER          TIM_CR1_URS                        /**< 计数上溢或下溢、UG置位、从模式控制器触发  */

/* TIM时钟分频 */
#define TIM_CLOCK_DTS_DIV1                 (0x00000000U)                      /**< tDTS=tTIMx_KCLK          */
#define TIM_CLOCK_DTS_DIV2                 TIM_CR1_CLK_DIV2                   /**< tDTS=2*tTIMx_KCLK        */
#define TIM_CLOCK_DTS_DIV4                 TIM_CR1_CLK_DIV4                   /**< tDTS=4*tTIMx_KCLK        */

/* TIM通道定义 */
#define TIM_CHANNEL_1                      (0x00U)                            /**< 通道1定义            */
#define TIM_CHANNEL_2                      (0x01U)                            /**< 通道2定义            */
#define TIM_CHANNEL_3                      (0x02U)                            /**< 通道3定义            */
#define TIM_CHANNEL_4                      (0x03U)                            /**< 通道4定义            */

/* TIM输入通道极性定义 */
#define TIM_INPUT_POL_RISING               (0x00000000U)                        /**< 未反向/上升沿触发             */
#define TIM_INPUT_POL_FALLING              TIM_CCEN_CC1P                        /**< 反向/下降沿触发               */
#define TIM_INPUT_POL_BOTH                 (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)     /**< 未反向/上升下降均触发         */

/* TIM输入捕获选择 */
#define TIM_INPUT_CAPTURE_SEL_DIRECTTI         TIM_CCM1_CC1S_DIRECTTI             /**< TIM输入1, 2, 3 or 4，且被映射到IC1, IC2, IC3 or IC4（一一对应） */
#define TIM_INPUT_CAPTURE_SEL_INDIRECTTI       TIM_CCM1_CC1S_INDIRECTTI           /**< TIM输入1, 2, 3 or 4，且被映射到IC2, IC1, IC4 or IC3（一一对应） */
#define TIM_INPUT_CAPTURE_SEL_TRC              TIM_CCM1_CC1S_TRC                  /**< TIM输入1, 2, 3 or 4，且被映射到TRC                              */

/* TIM输入捕获预分频参数定义 */
#define TIM_INPUT_CAPTURE_PSC_DIV1             (0x00000000U)                      /**< 无预分频器，捕获输入上每检测到一个边沿便执行捕获 */
#define TIM_INPUT_CAPTURE_PSC_DIV2             TIM_CCM1_IC1PSC_DIV2               /**< 每发生2个事件执行一次捕获        */
#define TIM_INPUT_CAPTURE_PSC_DIV4             TIM_CCM1_IC1PSC_DIV4               /**< 每发生4个事件执行一次捕获        */
#define TIM_INPUT_CAPTURE_PSC_DIV8             TIM_CCM1_IC1PSC_DIV8               /**< 每发生8个事件执行一次捕获        */

/* TIM输出比较极性定义 */
#define TIM_OUTPUT_POL_HIGH                (0x00000000U)                      /**< 比较输出极性：高电平为有效电平      */
#define TIM_OUTPUT_POL_LOW                 TIM_CCEN_CC1P                      /**< 比较输出极性：低电平为有效电平      */

/* TIM输出比较输出使能定义 */
#define TIM_OUTPUT_DISABLE                 (0x00000000U)                      /**< 比较通道输出禁止                    */
#define TIM_OUTPUT_ENABLE                  TIM_CCEN_CC1E                      /**< 比较通道输出使能                    */

/* TIM输出比较参数定义*/   
#define TIM_OUTPUT_MODE_FROZEN                  (0x00000000U)                                /**< 冻结                          */
#define TIM_OUTPUT_MODE_ACTIVE                  TIM_CCM1_OC1M_ACTIVE                         /**< 通道1设置为匹配时输出有效电平 */
#define TIM_OUTPUT_MODE_INACTIVE                TIM_CCM1_OC1M_INACTIVE                       /**< 通道1设置为匹配时输出无效电平 */
#define TIM_OUTPUT_MODE_TOGGLE                  TIM_CCM1_OC1M_TOGGLE                         /**< 翻转                          */
#define TIM_OUTPUT_MODE_FORCED_INACTIVE         TIM_CCM1_OC1M_FORCED_INACTIVE                /**< 强制变为无效电平              */
#define TIM_OUTPUT_MODE_FORCED_ACTIVE           TIM_CCM1_OC1M_FORCED_ACTIVE                  /**< 强制变为有效电平              */
#define TIM_OUTPUT_MODE_PWM1                    TIM_CCM1_OC1M_PWM1                           /**< PWM模式1                      */
#define TIM_OUTPUT_MODE_PWM2                    TIM_CCM1_OC1M_PWM2                           /**< PWM模式2                      */

/*  TIM时钟源选择 */ 
#define TIM_CLKSRC_INT                     (0x00000000U)                      /**< TIM时钟源：内部时钟           */
#define TIM_CLKSRC_MODE1                   TIM_SMC_SM_SEL_EXT_MODE1           /**< TIM时钟源：外部时钟源模式1    */

/* TIM时钟极性定义 */
#define TIM_CLK_TIX_POL_RISING             (0x00000000U)                      /**< TIx时钟源的极性：上升沿有效   */
#define TIM_CLK_TIX_POL_FALLING            TIM_CCEN_CC1P                      /**< TIx时钟源的极性：下降沿有效   */
#define TIM_CLK_TIX_POL_BOTH               (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)   /**< TIx时钟源的极性：双沿有效     */

/* TIM事件源 */
#define TIM_EVENT_SRC_UPDATE               TIM_EVTG_UG                       /**< 重新初始化计数器并生成一个更新事件      */
#define TIM_EVENT_SRC_CC1                  TIM_EVTG_CC1G                     /**< 在通道1上生成一个捕获/比较事件          */
#define TIM_EVENT_SRC_CC2                  TIM_EVTG_CC2G                     /**< 在通道2上生成一个捕获/比较事件          */ 
#define TIM_EVENT_SRC_CC3                  TIM_EVTG_CC3G                     /**< 在通道3上生成一个捕获/比较事件          */ 
#define TIM_EVENT_SRC_CC4                  TIM_EVTG_CC4G                     /**< 在通道4上生成一个捕获/比较事件          */ 
#define TIM_EVENT_SRC_COM                  TIM_EVTG_COMG                     /**< 生成一个换相事件                        */
#define TIM_EVENT_SRC_TRIG                 TIM_EVTG_TG                       /**< 生成一个触发事件                        */
#define TIM_EVENT_SRC_BREAK                TIM_EVTG_BG                       /**< 生成一个断路事件                        */

/* TIM中断定义 */
#define TIM_INTERRUPT_UPDATE               TIM_DIER_UIE                       /**< 更新中断                */
#define TIM_INTERRUPT_CC1                  TIM_DIER_CC1IE                     /**< 捕获/比较1中断          */
#define TIM_INTERRUPT_CC2                  TIM_DIER_CC2IE                     /**< 捕获/比较1中断2         */
#define TIM_INTERRUPT_CC3                  TIM_DIER_CC3IE                     /**< 捕获/比较1中断3         */
#define TIM_INTERRUPT_CC4                  TIM_DIER_CC4IE                     /**< 捕获/比较1中断4         */
#define TIM_INTERRUPT_COM                  TIM_DIER_COMIE                     /**< 换相中断                */
#define TIM_INTERRUPT_TRIG                 TIM_DIER_TIE                       /**< 触发中断                */
#define TIM_INTERRUPT_BREAK                TIM_DIER_BIE                       /**< 断路中断                */

/* TIM标志定义 */
#define TIM_FLAG_UPDATE                    TIM_SR_UIF                         /**< 更新中断标志              */
#define TIM_FLAG_CC1                       TIM_SR_CC1IF                       /**< 捕获/比较1事件标志        */
#define TIM_FLAG_CC2                       TIM_SR_CC2IF                       /**< 捕获/比较2事件标志        */
#define TIM_FLAG_CC3                       TIM_SR_CC3IF                       /**< 捕获/比较3事件标志        */
#define TIM_FLAG_CC4                       TIM_SR_CC4IF                       /**< 捕获/比较4事件标志        */
#define TIM_FLAG_COM                       TIM_SR_COMIF                       /**< 换相事件标志              */
#define TIM_FLAG_TRIG                      TIM_SR_TIF                         /**< 触发事件标志              */
#define TIM_FLAG_BREAK                     TIM_SR_BIF                         /**< 断路事件标志              */
#define TIM_FLAG_CC1OF                     TIM_SR_CC1OF                       /**< 捕获/比较1重复捕获标志    */
#define TIM_FLAG_CC2OF                     TIM_SR_CC2OF                       /**< 捕获/比较2重复捕获标志    */

#define TIM_FLAG_ALL                       (0xFFFF)                           /**< TIM事件标志               */
#define TIM_FLAG_CCX_ALL                   (0x001E)                           /**< 全通道捕获/比较事件标志   */

/* TIM清除OCxREF输出的输入源 */                               
#define TIM_CLEAR_INPUT_SRC_COMP1          (0x00000000U)                    /**< OCREF_CLR_INPUT连接到COMP1的输出  */
#define TIM_CLEAR_INPUT_SRC_COMP2          TIM_CFG_OCREF_CLR                /**< OCREF_CLR_INPUT连接到COMP2的输出  */

/* TIM换相事件源 */
#define TIM_COM_SOFTWARE                  (0x00000000U)                      /**< 如果捕获/比较控制位进行预装载（CCPC=1），仅通过将COMG位置1触发换相事件               */
#define TIM_COM_TRGI                      TIM_CR2_CCU_SEL                    /**< 如果捕获/比较控制位进行预装载（CCPC=1），可通过将COMG位置1或TRIG的上升沿触发换相事件 */

/* TIM主模式选择(TRIG_OUT)参数定义*/
#define TIM_TRIG_OUT_RESET                 (0x00000000U)                         /**< TIM1_EVTG寄存器中的UG位用作触发输出（TRIG_OUT）  */
#define TIM_TRIG_OUT_ENABLE                TIM_CR2_MM_SEL_ENABLE                 /**< 计数器使能信号CEN用作触发输出（TRIG_OUT）        */
#define TIM_TRIG_OUT_UPDATE                TIM_CR2_MM_SEL_UPDATE                 /**< 选择更新事件作为触发输出（TRIG_OUT）             */
#define TIM_TRIG_OUT_CC1                   TIM_CR2_MM_SEL_CC1IF                  /**< 捕获或比较匹配，触发输出（TRIG_OUT）             */
#define TIM_TRIG_OUT_OC1REF                TIM_CR2_MM_SEL_OC1REF                 /**< OC1REF信号用作触发输出(TRIG_OUT)                 */
#define TIM_TRIG_OUT_OC2REF                TIM_CR2_MM_SEL_OC2REF                 /**< OC2REF信号用作触发输出(TRIG_OUT)                 */
#define TIM_TRIG_OUT_OC3REF                TIM_CR2_MM_SEL_OC3REF                 /**< OC3REF信号用作触发输出(TRIG_OUT)                 */
#define TIM_TRIG_OUT_OC4REF                TIM_CR2_MM_SEL_OC4REF                 /**< OC4REF信号用作触发输出(TRIG_OUT)                 */

/* TIM从模式参数定义*/
#define TIM_SLAVE_MODE_DISABLE             (0x00000000U)                              /**< 禁止从模式          */
#define TIM_SLAVE_MODE_RESET               TIM_SMC_SM_SEL_RESET                       /**< 复位模式            */
#define TIM_SLAVE_MODE_GATED               TIM_SMC_SM_SEL_GATED                       /**< 门控模式            */
#define TIM_SLAVE_MODE_TRIG                TIM_SMC_SM_SEL_TRIG                        /**< 触发模式            */

/* TIM触发选择参数定义*/
#define TIM_TRIG_SOURCE_ITR0               TIM_SMC_TS_ITR0                              /**< 内部触发0（ITR0）               */
#define TIM_TRIG_SOURCE_TI1F_ED            TIM_SMC_TS_TI1F_ED                           /**< TI1边沿检测器（TI1F_ED）        */
#define TIM_TRIG_SOURCE_TI1FP1             TIM_SMC_TS_TI1FP1                            /**< 滤波后的定时器输入1（TI1FP1）   */
#define TIM_TRIG_SOURCE_TI2FP2             TIM_SMC_TS_TI2FP2                            /**< 滤波后的定时器输入2（TI1FP2）   */

/* TIM触发极性参数定义*/
#define TIM_TRIG_TIX_POL_RISING            (0x00000000U)                        /**< TIxFPx或TI1F_ED触发极性：高电平或上升沿有效   */
#define TIM_TRIG_TIX_POL_FALLING           TIM_CCEN_CC1P                        /**< TIxFPx或TI1F_ED触发极性：低电平或下降沿有效   */
#define TIM_TRIG_TIX_POL_BOTH              (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)     /**< TIxFPx或TI1F_ED触发极性：上升下降均触发       */
                                                                                       
/* TIM输出比较互补输出极性定义 */
#define TIM_OUTPUT_NEGTIVE_POL_HIGH        (0x00000000U)                      /**< 互补输出极性为高电平有效      */
#define TIM_OUTPUT_NEGTIVE_POL_LOW         TIM_CCEN_CC1NP                     /**< 互补输出极性为低电平有效      */

/* TIM输出比较互补输出使能定义 */
#define TIM_OUTPUT_NEGTIVE_DISABLE         (0x00000000U)                      /**< 互补输出通道输出禁止          */
#define TIM_OUTPUT_NEGTIVE_ENABLE          TIM_CCEN_CC1NE                     /**< 互补输出通道输出使能          */

/* TIM空闲状态下输出状态定义 */
#define TIM_OUTPUT_IDLE_RESET              (0x00000000U)                      /**< 空闲状态为: 当MOEN=0时OCx输出低电平   */
#define TIM_OUTPUT_IDLE_SET                TIM_CR2_OIS1                       /**< 空闲状态为: 当MOEN=0时OCx输出高电平   */

/* TIM空闲状态下互补输出状态定义 */
#define TIM_OUTPUT_NEGTIVE_IDLE_RESET      (0x00000000U)                      /**< 互补输出空闲状态为: 当MOEN=0时OCxN输出低电平  */
#define TIM_OUTPUT_NEGTIVE_IDLE_SET        TIM_CR2_OIS1N                      /**< 互补输出空闲状态为: 当MOEN=0时OCxN输出高电平  */

/* TIM运行模式下关闭状态选择参数定义 */                                         
#define TIM_OSSR_DISABLE                   (0x00000000U)               /**< 处于无效状态时，OC/OCN输出禁止(不再受定时器控制)     */
#define TIM_OSSR_ENABLE                    TIM_BDT_OSSR                /**< 处于无效状态时，OC/OCN输出使能(仍然受定时器控制)     */
                                                                               
/* TIM空闲模式下关闭状态选择参数定义 */                                         
#define TIM_OSSI_DISABLE                   (0x00000000U)               /**< 处于无效状态时，OC/OCN输出禁止(不再受定时器控制)     */
#define TIM_OSSI_ENABLE                    TIM_BDT_OSSI                /**< 处于无效状态时，OC/OCN输出使能(仍然受定时器控制)     */

/* TIM锁级别定义*/
#define TIM_LOCK_LEVEL_OFF                 (0x00000000U)                      /**< 锁级别0         */
#define TIM_LOCK_LEVEL1                    TIM_BDT_LOCK_LEVEL1                /**< 锁级别1         */
#define TIM_LOCK_LEVEL2                    TIM_BDT_LOCK_LEVEL2                /**< 锁级别2         */
#define TIM_LOCK_LEVEL3                    TIM_BDT_LOCK_LEVEL3                /**< 锁级别3         */

/* TIM断路输入使能*/                                                            
#define TIM_BREAK_DISABLE                  (0x00000000U)                      /**< 禁止断路输入    */
#define TIM_BREAK_ENABLE                   TIM_BDT_BKEN                       /**< 使能断路输入    */                                                                              
                                                                              
/* TIM断路输入源定义 */                                                       
#define TIM_BREAK_INPUT_SRC_GPIO           TIM1_AF1_BKINE                      /**< GPIO接到BKIN引脚上          */    
#define TIM_BREAK_INPUT_SRC_COMP1          TIM1_AF1_BKCMP1E                    /**< COMP1输出接到断路输入       */
#define TIM_BREAK_INPUT_SRC_COMP2          TIM1_AF1_BKCMP2E                    /**< COMP2输出接到断路输入       */       
  
/* TIM断路输入极性定义 */                                                                                                    
#define TIM_BREAK_INPUT_POL_HIGH           TIM1_AF1_BKINP                      /**< 断路输入源为高电平      */
#define TIM_BREAK_INPUT_POL_LOW            (0x00000000U)                       /**< 断路输入源为低电平      */ 
                                                                                                                                                                              
/* TIM外部时钟输入选择  */                                                                                                                                                    
#define TIM_TIM3_TI1_GPIO                  TIM_TISEL_TI1_SEL_CH1                      /**< TIM3_TI1连接到GPIO       */
#define TIM_TIM3_TI1_COMP1                 TIM_TISEL_TI1_SEL_COMP1                    /**< TIM3_TI1连接到COMP1输出  */    
                                                                                       
#define TIM_TIM3_TI2_GPIO                  TIM_TISEL_TI2_SEL_CH2                      /**< TIM3_TI2连接到GPIO       */  
#define TIM_TIM3_TI2_COMP2                 TIM_TISEL_TI2_SEL_COMP2                    /**< TIM3_TI2连接到COMP2输出  */                                                                                                                                                 


/**
* @}
*/


/*-------------------------------------------functions------------------------------------------*/

/************************************************************************************************/
/**
* @defgroup TIM_External_Functions TIM External Functions
* @brief    TIM对外函数
* @{
*
*/
/************************************************************************************************/
/**
* @brief  TIM启动计数
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_enable(TIM_t *timx)
{
    timx->CR1 |= TIM_CR1_CEN;    
}

/**
* @brief  TIM停止计数
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_disable(TIM_t *timx)
{
    timx->CR1 &= (~TIM_CR1_CEN);
}


/**
* @brief  设置TIM预分频参数
* @param  timx TIM外设
* @param  presc 预分频新值
* @note   TIM1预分频参数范围为：0x0000~0xFFFF    
*         TIM3预分频参数范围为：0x0000~0x000F
* @retval 无
*/
__STATIC_INLINE void std_tim_set_psc(TIM_t *timx, uint32_t presc)          
{
    timx->PSC = (presc);
}


/**
* @brief  获取TIM预分频参数
* @param  timx TIM外设
* @retval uint32_t TIM预分频值
*/
__STATIC_INLINE uint32_t std_tim_get_psc(TIM_t *timx)          
{
    return (timx->PSC);    
}


/**
* @brief  设置TIM计数值
* @param  timx TIM外设 
* @param  counter 计数新值
* @retval 无
*/
__STATIC_INLINE void std_tim_set_counter(TIM_t *timx, uint32_t counter)     
{
    timx->CNT = (counter);
}

/**
* @brief  获取TIM计数值
* @param  timx TIM外设
* @retval uint32_t TIM计数值
*/
__STATIC_INLINE uint32_t std_tim_get_counter(TIM_t *timx)   
{
    return (timx->CNT);
}

/**
* @brief  设置TIM ARR值
* @param  timx TIM外设
* @param  autoreload ARR值
* @retval 无
*/
__STATIC_INLINE void std_tim_set_autoreload(TIM_t *timx, uint32_t autoreload)
{
    timx->ARR = (autoreload); 
}
                                                            
/**
* @brief  获取TIM ARR值
* @param  timx TIM外设
* @retval uint32_t TIM ARR值
*/
__STATIC_INLINE uint32_t std_tim_get_autoreload(TIM_t *timx)
{
    return (timx->ARR);
}


/**
* @brief  设置TIM RCR值
* @param  timx TIM外设
* @param  rcr TIM RCR值
* @retval 无
*/
__STATIC_INLINE void std_tim_set_repcounter(TIM_t *timx, uint32_t rcr)
{
    timx->RCR = (rcr);
}


/**
* @brief  获取TIM RCR值
* @param  timx TIM外设
* @retval uint32_t TIM RCR值
*/
__STATIC_INLINE uint32_t std_tim_get_repcounter(TIM_t *timx)
{
    return (timx->RCR);
}


/**
* @brief  设置TIM时钟分频值
* @param  timx TIM外设
* @param  clk_div 时钟分频值
*             @arg TIM_CLOCK_DTS_DIV1:  tDTS=tTIM_KCLK
*             @arg TIM_CLOCK_DTS_DIV2:  tDTS=2*tTIM_KCLK
*             @arg TIM_CLOCK_DTS_DIV4:  tDTS=4*tTIM_KCLK
* @retval 无
*/
__STATIC_INLINE void std_tim_set_clock_div(TIM_t *timx, uint32_t clk_div) 
{
    MODIFY_REG(timx->CR1, TIM_CR1_CLK_DIV, clk_div);    
}

/**
* @brief  获取TIM时钟分频值
* @param  timx TIM外设
* @retval uint32_t 时钟分频值
*             @arg TIM_CLOCK_DIV1: tDTS=tTIM_KCLK
*             @arg TIM_CLOCK_DIV2: tDTS=2*tTIM_KCLK
*             @arg TIM_CLOCK_DIV4: tDTS=4*tTIM_KCLK
*/
__STATIC_INLINE uint32_t std_tim_get_clock_div(TIM_t *timx)           
{
    return (timx->CR1 & TIM_CR1_CLK_DIV);
}

/**
* @brief  使能自动重载功能
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_arrpreload_enable(TIM_t *timx)           
{
    timx->CR1 |= TIM_CR1_ARPE;
}

/**
* @brief  禁止自动重载功能
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_arrpreload_disable(TIM_t *timx)           
{
    timx->CR1 &= (~TIM_CR1_ARPE);
}

/**
* @brief  使能更新事件
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_updateevent_enable(TIM_t *timx)
{
    timx->CR1 |= TIM_CR1_UDIS;
}

/**
* @brief  禁止更新事件
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_updateevent_disable(TIM_t *timx)
{
    timx->CR1 &= (~TIM_CR1_UDIS);
}

/**
* @brief  设置更新事件源
* @param  timx TIM外设
* @param  update_source 更新事件源选择
*             @arg TIM_UPDATE_SOURCE_REGULAR
*             @arg TIM_UPDATE_SOURCE_COUNTER
* @retval 无
*/
__STATIC_INLINE void std_tim_set_update_source(TIM_t *timx, uint32_t update_source)
{
    MODIFY_REG(timx->CR1, TIM_CR1_URS, update_source);
}


/**
* @brief  获取更新事件源
* @param  timx TIM外设
* @retval uint32_t 更新事件源选择
*             @arg TIM_UPDATE_SOURCE_REGULAR
*             @arg TIM_UPDATE_SOURCE_COUNTER
*/
__STATIC_INLINE uint32_t std_tim_get_update_source(TIM_t *timx)
{
    return (timx->CR1 & TIM_CR1_URS);
}


/**
* @brief  使能工作模式1
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_work_mode1_enable(TIM_t *timx)
{
    timx->CR1 |= TIM_CR1_MODE;
}

/**
* @brief  禁止工作模式1
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_work_mode1_disable(TIM_t *timx)
{
    timx->CR1 &= (~TIM_CR1_MODE);
}


/**
* @brief  设置计数模式
* @param  timx TIM外设
* @param  counter_mode 计数方式
*             @arg TIM_COUNTER_MODE_UP
*             @arg TIM_COUNTER_MODE_DOWN
*             @arg TIM_COUNTER_MODE_CENT_MODE1
*             @arg TIM_COUNTER_MODE_CENT_MODE2
*             @arg TIM_COUNTER_MODE_CENT_MODE3
* @note   由于DIR控制位在中心对齐模式下为只读权限，当从中心对齐模式切换到边沿模式时，避免计数方向修改异常，应先复位一次TIM
* @retval 无
*/
__STATIC_INLINE void std_tim_set_counter_mode(TIM_t *timx, uint32_t counter_mode)
{
    MODIFY_REG(timx->CR1, (TIM_CR1_DIR | TIM_CR1_CMS), counter_mode);
}

/**
* @brief  获取计数模式
* @param  timx TIM外设
* @retval uint32_t 计数方式
*             @arg TIM_COUNTER_MODE_UP
*             @arg TIM_COUNTER_MODE_DOWN
*             @arg TIM_COUNTER_MODE_CENT_MODE1
*             @arg TIM_COUNTER_MODE_CENT_MODE2
*             @arg TIM_COUNTER_MODE_CENT_MODE3
*/
__STATIC_INLINE uint32_t std_tim_get_counter_mode(TIM_t *timx)
{
    if(timx->CR1 & TIM_CR1_CMS)
    {
        return (timx->CR1 & TIM_CR1_CMS);
    }
    else
    {
        return (timx->CR1 & TIM_CR1_DIR);       
    }
}

/**
* @brief  获取TIM计数方向
* @param  timx TIM外设
* @retval uint32_t 返回TIM计数方向标志
*             @arg 非0: 当前计数方向为向下计数
*             @arg 0:当前计数方向为向上计数
*/
__STATIC_INLINE uint32_t std_tim_get_count_dir(TIM_t *timx)  
{
    return (timx->CR1 & TIM_CR1_DIR);
}


/**
* @brief  使能单脉冲模式
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_onepulse_enable(TIM_t *timx)
{
    timx->CR1 |= TIM_CR1_OPM;
}

/**
* @brief  禁止单脉冲模式
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_onepulse_disable(TIM_t *timx)
{
    timx->CR1 &= (~TIM_CR1_OPM);
}

/**
* @brief  获取单脉冲模式
* @param  timx TIM外设
* @retval uint32_t 返回单脉冲计数模式
*             @arg 非0: 当前配置为单脉冲模式
*             @arg 0:当前配置为连续计数模式
*/
__STATIC_INLINE uint32_t std_tim_get_onepulse_mode(TIM_t *timx)
{
    return (timx->CR1 & (TIM_CR1_OPM));
}


/**
* @brief  设置计数时钟源参数
* @param  timx TIM外设
* @param  clock_source 时钟源选择
*             @arg TIM_CLKSRC_INT:   内部时钟源
*             @arg TIM_CLKSRC_MODE1: 外部时钟模式1
* @retval 无
*/
__STATIC_INLINE void std_tim_clock_source_config(TIM_t *timx, uint32_t clock_source)
{
    MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, clock_source);
}


/**
* @brief  生成一个软件事件
* @param  timx TIM外设
* @param  event_src 事件源
*             @arg TIM_EVENT_SRC_UPDATE:更新事件源
*             @arg TIM_EVENT_SRC_CC1:   捕获比较1事件源
*             @arg TIM_EVENT_SRC_CC2:   捕获比较2事件源
*             @arg TIM_EVENT_SRC_CC3:   捕获比较3事件源
*             @arg TIM_EVENT_SRC_CC4:   捕获比较4事件源
*             @arg TIM_EVENT_SRC_COM:   换相事件源
*             @arg TIM_EVENT_SRC_TRIG:  触发事件源
*             @arg TIM_EVENT_SRC_BREAK: 断路事件源
* @retval 无
*/
__STATIC_INLINE void std_tim_set_sw_trig_event(TIM_t *timx, uint32_t event_src)
{
    timx->EVTG = event_src;
}


/** 
* @brief  TIM中断使能
* @param  timx TIM外设
* @param  interrupt TIM中断源
*             @arg TIM_INTERRUPT_UPDATE:  更新中断
*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
*             @arg TIM_INTERRUPT_COM:     换相中断
*             @arg TIM_INTERRUPT_TRIG:    触发中断
*             @arg TIM_INTERRUPT_BREAK:   断路中断
* @retval 无
*/
__STATIC_INLINE void std_tim_interrupt_enable(TIM_t *timx, uint32_t interrupt)    
{
    timx->DIER |= (interrupt);
}

/** 
* @brief  TIM中断禁止
* @param  timx TIM外设
* @param  interrupt TIM中断源
*             @arg TIM_INTERRUPT_UPDATE:  更新中断
*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
*             @arg TIM_INTERRUPT_COM:     换相中断
*             @arg TIM_INTERRUPT_TRIG:    触发中断
*             @arg TIM_INTERRUPT_BREAK:   断路中断
* @retval 无
*/
__STATIC_INLINE void std_tim_interrupt_disable(TIM_t *timx, uint32_t interrupt)   
{
    timx->DIER &= (~(interrupt));
}


/**
* @brief  获取TIM中断源的状态
* @param  timx TIM外设
* @param  interrupt TIM中断源信息
*             @arg TIM_INTERRUPT_UPDATE:  更新中断
*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
*             @arg TIM_INTERRUPT_COM:     换相中断
*             @arg TIM_INTERRUPT_TRIG:    触发中断
*             @arg TIM_INTERRUPT_BREAK:   断路中断
* @retval uint32_t 返回中断请求源的状态 
*/  
__STATIC_INLINE uint32_t std_tim_get_interrupt_enable(TIM_t *timx, uint32_t interrupt)   
{
    return (timx->DIER & (interrupt));
}


/** 
* @brief  获取TIM标志状态
* @param  timx TIM外设
* @param  flag TIM标志信息
*             @arg TIM_FLAG_UPDATE:       更新事件标志
*             @arg TIM_FLAG_CC1:          捕获/比较1事件标志
*             @arg TIM_FLAG_CC2:          捕获/比较2事件标志
*             @arg TIM_FLAG_CC3:          捕获/比较3事件标志
*             @arg TIM_FLAG_CC4:          捕获/比较4事件标志
*             @arg TIM_FLAG_COM:          换相事件标志
*             @arg TIM_FLAG_TRIG:         触发事件标志
*             @arg TIM_FLAG_BREAK:        断路事件标志
*             @arg TIM_FLAG_CC1OF:        捕获/比较1重复捕获标志
*             @arg TIM_FLAG_CC2OF:        捕获/比较2重复捕获标志
*             @arg TIM_FLAG_CCX_ALL:      全通道捕获/比较事件标志
*             @arg TIM_FLAG_ALL:          TIM事件标志
* @retval uint32_t 返回标志的状态 
*             @arg 非0: 当前标志为置起状态 
*             @arg 0:当前标志为清除状态
*/
__STATIC_INLINE uint32_t std_tim_get_flag(TIM_t *timx, uint32_t flag)          
{
    return (timx->SR &(flag));
}


/** 
* @brief  清除TIM标志
* @param  timx TIM外设
* @param  flag 清除TIM标志
*             @arg TIM_FLAG_UPDATE:       更新事件标志
*             @arg TIM_FLAG_CC1:          捕获/比较1事件标志
*             @arg TIM_FLAG_CC2:          捕获/比较2事件标志
*             @arg TIM_FLAG_CC3:          捕获/比较3事件标志
*             @arg TIM_FLAG_CC4:          捕获/比较4事件标志
*             @arg TIM_FLAG_COM:          换相事件标志
*             @arg TIM_FLAG_TRIG:         触发事件标志
*             @arg TIM_FLAG_BREAK:        断路事件标志
*             @arg TIM_FLAG_CC1OF:        捕获/比较1重复捕获标志
*             @arg TIM_FLAG_CC2OF:        捕获/比较2重复触发标志
*             @arg TIM_FLAG_CCX_ALL:      全通道捕获/比较事件标志
*             @arg TIM_FLAG_ALL:          TIM事件标志
* @retval 无
*/
__STATIC_INLINE void std_tim_clear_flag(TIM_t *timx, uint32_t flag)
{
    timx->SR = (~(flag));
}


/**
* @brief  使能TIM比较/匹配通道
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval 无
*/
__STATIC_INLINE void std_tim_ccx_channel_enable(TIM_t *timx, uint32_t channel_id)
{  
    timx->CCEN |= (TIM_CCEN_CC1E << (channel_id << 2));
}


/**
* @brief  禁止TIM比较/匹配通道
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval 无
*/
__STATIC_INLINE void std_tim_ccx_channel_disable(TIM_t *timx, uint32_t channel_id)
{     
    timx->CCEN &= (~(TIM_CCEN_CC1E << (channel_id << 2)));
}


/**
* @brief  使能TIM互补输出通道
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
* @retval 无
*/
__STATIC_INLINE void std_tim_ccxn_channel_enable(TIM_t *timx, uint32_t channel_id)
{    
    timx->CCEN |= (TIM_CCEN_CC1NE << (channel_id << 2));
}


/**
* @brief  禁止TIM互补输出通道
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
* @retval 无
*/
__STATIC_INLINE void std_tim_ccxn_channel_disable(TIM_t *timx, uint32_t channel_id)
{ 
    timx->CCEN &= (~(TIM_CCEN_CC1NE << (channel_id << 2)));
}


/**
* @brief  配置TIM输入捕获通道极性
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
* @param  input_capture_pol 输入极性
*             @arg TIM_INPUT_POL_RISING
*             @arg TIM_INPUT_POL_FALLING
*             @arg TIM_INPUT_POL_BOTH
* @retval 无
*/
__STATIC_INLINE void std_tim_set_input_pol(TIM_t *timx, uint32_t channel_id, uint32_t input_capture_pol)
{ 
    MODIFY_REG(timx->CCEN, ((TIM_CCEN_CC1P | TIM_CCEN_CC1NP) << (channel_id << 2)), (input_capture_pol << (channel_id << 2)));
}

/**
* @brief  获取TIM输入捕获通道极性
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
* @retval uint32_t 输入极性
*             @arg TIM_INPUT_POL_RISING
*             @arg TIM_INPUT_POL_FALLING
*             @arg TIM_INPUT_POL_BOTH
*/
__STATIC_INLINE uint32_t std_tim_get_input_pol(TIM_t *timx, uint32_t channel_id)
{ 
    return (((timx->CCEN) >> (channel_id << 2)) & (TIM_CCEN_CC1P | TIM_CCEN_CC1NP));
}


/**
* @brief  配置TIM通道输出的极性
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @param  output_commpare_pol 输出极性
*             @arg TIM_OUTPUT_POL_HIGH
*             @arg TIM_OUTPUT_POL_LOW
* @retval 无
*/
__STATIC_INLINE void std_tim_set_output_pol(TIM_t *timx, uint32_t channel_id, uint32_t output_commpare_pol)
{ 
    MODIFY_REG(timx->CCEN, (TIM_CCEN_CC1P << (channel_id << 2)), (output_commpare_pol << (channel_id << 2)));
}

/**
* @brief  获取TIM通道输出的极性
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval uint32_t 输出极性
*             @arg TIM_OUTPUT_POL_HIGH
*             @arg TIM_OUTPUT_POL_LOW
*/
__STATIC_INLINE uint32_t std_tim_get_output_pol(TIM_t *timx, uint32_t channel_id)
{ 
    return (((timx->CCEN) >> (channel_id << 2)) & TIM_CCEN_CC1P);
}


/**
* @brief  配置TIM互补通道的输出极性
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
* @param  negtive_output_pol 互补通道的输出极性
*             @arg TIM_OUTPUT_NEGTIVE_POL_HIGH
*             @arg TIM_OUTPUT_NEGTIVE_POL_LOW
* @retval 无
*/
__STATIC_INLINE void std_tim_set_negtive_output_pol(TIM_t *timx, uint32_t channel_id, uint32_t negtive_output_pol)
{ 
    MODIFY_REG(timx->CCEN, (TIM_CCEN_CC1NP << (channel_id << 2)), (negtive_output_pol << (channel_id << 2)));
}

/**
* @brief  获取TIM互补通道的输出极性
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
* @retval uint32_t 互补通道的输出极性
*             @arg TIM_OUTPUT_NEGTIVE_POL_HIGH
*             @arg TIM_OUTPUT_NEGTIVE_POL_LOW
*/
__STATIC_INLINE uint32_t std_tim_get_negtive_output_pol(TIM_t *timx, uint32_t channel_id)
{ 
    return (((timx->CCEN) >> (channel_id << 2)) & TIM_CCEN_CC1NP);
}


/**
* @brief  配置TIM通道的空闲状态
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @param  idle_state 通道空闲状态
*             @arg TIM_OUTPUT_IDLE_RESET
*             @arg TIM_OUTPUT_IDLE_SET
* @retval 无
*/
__STATIC_INLINE void std_tim_set_output_idlestate(TIM_t *timx, uint32_t channel_id, uint32_t idle_state)
{ 
    MODIFY_REG(timx->CR2, (TIM_CR2_OIS1 << (channel_id << 1)), (idle_state << (channel_id << 1)));
}

/**
* @brief  获取TIM通道的空闲状态
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval uint32_t 通道空闲状态
*             @arg TIM_OUTPUT_IDLE_RESET
*             @arg TIM_OUTPUT_IDLE_SET
*/
__STATIC_INLINE uint32_t std_tim_get_output_idlestate(TIM_t *timx, uint32_t channel_id)
{ 
    return (((timx->CR2) >> (channel_id << 1)) & TIM_CR2_OIS1);    
}

/**
* @brief  配置TIM互补通道的空闲状态
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
* @param  negtive_idlestate 互补通道空闲状态
*             @arg TIM_OUTPUT_NEGTIVE_IDLE_RESET
*             @arg TIM_OUTPUT_NEGTIVE_IDLE_SET
* @retval 无
*/
__STATIC_INLINE void std_tim_set_negtive_output_idlestate(TIM_t *timx, uint32_t channel_id, uint32_t negtive_idlestate)
{ 
    MODIFY_REG(timx->CR2, (TIM_CR2_OIS1N << (channel_id << 1)), (negtive_idlestate << (channel_id << 1)));
}

/**
* @brief  获取TIM互补通道的空闲状态
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
* @retval uint32_t 互补通道空闲状态
*             @arg TIM_OUTPUT_NEGTIVE_IDLE_RESET
*             @arg TIM_OUTPUT_NEGTIVE_IDLE_SET
*/
__STATIC_INLINE uint32_t std_tim_get_negtive_output_idlestate(TIM_t *timx, uint32_t channel_id)
{ 
    return (((timx->CR2) >> (channel_id << 1)) & TIM_CR2_OIS1N);        
}

/**
* @brief  使能清除OCxREF功能
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval 无
*/
__STATIC_INLINE void std_tim_channel_clear_ocxref_enable(TIM_t *timx, uint32_t channel_id)
{
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;    
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
    
    /* 使能清除OCxREF */ 
    *preg |= (TIM_CCM1_OC1CE << tmp_value);
}

/**
* @brief  禁止清除OCxREF功能
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval 无
*/
__STATIC_INLINE void std_tim_channel_clear_ocxref_disable(TIM_t *timx, uint32_t channel_id)
{
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;      
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
    
    /* 禁止清除OCxREF */ 
    *preg &= (~(TIM_CCM1_OC1CE << tmp_value));
}

/**
* @brief  设置输入捕获预分频值
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
* @param  icxpsc_num 输入捕获预分频值
*             @arg TIM_INPUT_CAPTURE_PSC_DIV1
*             @arg TIM_INPUT_CAPTURE_PSC_DIV2
*             @arg TIM_INPUT_CAPTURE_PSC_DIV4
*             @arg TIM_INPUT_CAPTURE_PSC_DIV8
* @retval 无
*/
__STATIC_INLINE void std_tim_set_channel_icxpsc(TIM_t *timx, uint32_t channel_id, uint32_t icxpsc_num)
{
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;      
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
    
    /* 设置输入捕获预分频 */ 
    MODIFY_REG(*preg, (TIM_CCM1_IC1PSC << tmp_value), (icxpsc_num << tmp_value));
}


/**
* @brief  获取输入捕获预分频值
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
* @retval uint32_t 输入捕获预分频值
*             @arg TIM_INPUT_CAPTURE_PSC_DIV1
*             @arg TIM_INPUT_CAPTURE_PSC_DIV2
*             @arg TIM_INPUT_CAPTURE_PSC_DIV4
*             @arg TIM_INPUT_CAPTURE_PSC_DIV8
*/
__STATIC_INLINE uint32_t std_tim_get_channel_icxpsc(TIM_t *timx, uint32_t channel_id)
{
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
    
    /* 获取输入捕获预分频 */ 
    return ((*preg >> tmp_value) & TIM_CCM1_IC1PSC);
    
}


/**
* @brief  使能TIM通道输出比较的预装载功能
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval 无
*/
__STATIC_INLINE void std_tim_preloadccx_channel_enable(TIM_t *timx, uint32_t channel_id)
{ 
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
 
    /* 使能输出比较预装载功能 */ 
    *preg |= (TIM_CCM1_OC1PE << tmp_value);
}


/**
* @brief  禁止TIM通道输出比较的预装载功能
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval 无
*/
__STATIC_INLINE void std_tim_preloadccx_channel_disable(TIM_t *timx, uint32_t channel_id)
{ 
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
 
    /* 禁止输出比较预装载功能 */ 
    *preg &= (~(TIM_CCM1_OC1PE << tmp_value));
}


/**
* @brief  使能TIM通道快速模式
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval 无
*/
__STATIC_INLINE void std_tim_fastmode_channel_enable(TIM_t *timx, uint32_t channel_id)
{ 
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
 
    /* 使能输出快速模式 */ 
    *preg |= (TIM_CCM1_OC1FE << tmp_value);
}


/**
* @brief  禁止TIM通道快速模式
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval 无
*/
__STATIC_INLINE void std_tim_fastmode_channel_disable(TIM_t *timx, uint32_t channel_id)
{ 
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
 
    /* 禁止输出快速模式 */ 
    *preg &= (~(TIM_CCM1_OC1FE << tmp_value));
}


/**
* @brief  配置通道输出模式
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @param  ocmode 输出模式选择
*             @arg TIM_OUTPUT_MODE_FROZEN         
*             @arg TIM_OUTPUT_MODE_ACTIVE         
*             @arg TIM_OUTPUT_MODE_INACTIVE       
*             @arg TIM_OUTPUT_MODE_TOGGLE         
*             @arg TIM_OUTPUT_MODE_FORCED_INACTIVE
*             @arg TIM_OUTPUT_MODE_FORCED_ACTIVE  
*             @arg TIM_OUTPUT_MODE_PWM1           
*             @arg TIM_OUTPUT_MODE_PWM2                   
* @retval 无
*/
__STATIC_INLINE void std_tim_set_ocmode(TIM_t *timx, uint32_t channel_id, uint32_t ocmode)
{
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
    
    MODIFY_REG(*preg, ((TIM_CCM1_OC1M  | TIM_CCM1_CC1S) << tmp_value), (ocmode << tmp_value));
}


/**
* @brief  获取通道输出模式
* @param  timx TIM外设
* @param  channel_id 指定TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval uint32_t 输出模式选择
*             @arg TIM_OUTPUT_MODE_FROZEN         
*             @arg TIM_OUTPUT_MODE_ACTIVE         
*             @arg TIM_OUTPUT_MODE_INACTIVE       
*             @arg TIM_OUTPUT_MODE_TOGGLE         
*             @arg TIM_OUTPUT_MODE_FORCED_INACTIVE
*             @arg TIM_OUTPUT_MODE_FORCED_ACTIVE  
*             @arg TIM_OUTPUT_MODE_PWM1           
*             @arg TIM_OUTPUT_MODE_PWM2               
*/
__STATIC_INLINE uint32_t std_tim_get_ocmode(TIM_t *timx, uint32_t channel_id)
{
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;    
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);

    return ((*preg >> tmp_value) & TIM_CCM1_OC1M);
}

/**
* @brief  设置捕获/比较寄存器的值
* @param  timx TIM外设
* @param  ccx_value 捕获比较寄存器的值
* @param  channel_id TIM 通道配置
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval 无
*/
__STATIC_INLINE void std_tim_set_ccx_value(TIM_t *timx, uint32_t channel_id, uint32_t ccx_value)
{    
    if ((timx->CR1 & TIM_CR1_MODE) != TIM_CR1_MODE)
    {
        __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
        MODIFY_REG(*pReg, TIM_CC1_CC1, ccx_value);    
    }
    else
    {
        uint32_t tmp_value = ((channel_id & 0x02) == 0)?0U:8U;   
        uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:2U;          
        __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + ((channel_id - shift_value) << 2));
        MODIFY_REG(*pReg, (TIM3_CC1_CC1_MODE1 << tmp_value), (ccx_value << tmp_value));
    }
}


/**
* @brief  获取捕获/比较寄存器的值
* @param  timx TIM外设
* @param  channel_id TIM 通道配置
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
*             @arg TIM_CHANNEL_3
*             @arg TIM_CHANNEL_4
* @retval uint32_t 捕获比较寄存器的值
*/
__STATIC_INLINE uint32_t std_tim_get_ccx_value(TIM_t *timx, uint32_t channel_id)
{
    if ((timx->CR1 & TIM_CR1_MODE) != TIM_CR1_MODE)
    {
        __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
        return (*preg & TIM_CC1_CC1);
    }
    else
    {
        uint32_t tmp_value = ((channel_id & 0x02) == 0)?0U:8U;  
        uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:2U;     
        __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + ((channel_id - shift_value) << 2));
        
        return ((*preg >> tmp_value) & TIM3_CC1_CC1_MODE1);
    }
}


/**
* @brief  设置通道为输入模式
* @param  timx TIM外设
* @param  channel_id TIM 通道配置
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
* @param  icmode 输入模式选择
*             @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI
*             @arg TIM_INPUT_CAPTURE_SEL_INDIRECTTI
*             @arg TIM_INPUT_CAPTURE_SEL_TRC
* @retval 无
*/
__STATIC_INLINE void std_tim_set_icmode(TIM_t *timx, uint32_t channel_id, uint32_t icmode)
{
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
    
    MODIFY_REG(*preg, (TIM_CCM1_CC1S << tmp_value), (icmode << tmp_value));
}

/**
* @brief  获取通道的输入状态
* @param  timx TIM外设
* @param  channel_id TIM 通道配置
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
* @retval uint32_t 输入模式选择
*             @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI
*             @arg TIM_INPUT_CAPTURE_SEL_INDIRECTTI
*             @arg TIM_INPUT_CAPTURE_SEL_TRC
*/
__STATIC_INLINE uint32_t std_tim_get_icmode(TIM_t *timx, uint32_t channel_id)
{
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
    
    return ((*preg >> tmp_value) & TIM_CCM1_CC1S);
}

/**
* @brief  设置输入通道的滤波参数
* @param  timx TIM外设
* @param  channel_id TIM 通道配置
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
* @param  icfilter 输入滤波参数，其值的范围为:0x00~0x07
* @retval 无
*/
__STATIC_INLINE void std_tim_set_icfilter(TIM_t *timx, uint32_t channel_id, uint32_t icfilter)
{
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
    
    MODIFY_REG(*preg, (TIM_CCM1_IC1F << tmp_value), ((icfilter << tmp_value) << 4U));
}

/**
* @brief  获取输入通道的滤波参数
* @param  timx TIM外设
* @param  channel_id TIM 通道配置
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
* @retval uint32_t 输入滤波参数，其值的范围为:0x00~0x07
*/
__STATIC_INLINE uint32_t std_tim_get_icfilter(TIM_t *timx, uint32_t channel_id)
{
    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
    
    return (((*preg >> tmp_value) & TIM_CCM1_IC1F) >> 4U);
}


/**
* @brief  设置主模式（TRIG_OUT）输出参数
* @param  timx TIM外设
* @param  trigout_mode 主模式输出参数定义
*             @arg TIM_TRIG_OUT_RESET
*             @arg TIM_TRIG_OUT_ENABLE
*             @arg TIM_TRIG_OUT_UPDATE
*             @arg TIM_TRIG_OUT_CC1      
*             @arg TIM_TRIG_OUT_OC1REF   
*             @arg TIM_TRIG_OUT_OC2REF   
*             @arg TIM_TRIG_OUT_OC3REF   
*             @arg TIM_TRIG_OUT_OC4REF
* @retval 无
*/
__STATIC_INLINE void std_tim_trigout_mode_config(TIM_t *timx, uint32_t trigout_mode)
{
    MODIFY_REG(timx->CR2, TIM_CR2_MM_SEL, trigout_mode);
}


/**
* @brief  设置从模式参数
* @param  timx TIM外设
* @param  slave_mode 从模式参数定义
*             @arg TIM_SLAVE_MODE_DISABLE 
*             @arg TIM_SLAVE_MODE_RESET   
*             @arg TIM_SLAVE_MODE_GATED   
*             @arg TIM_SLAVE_MODE_TRIG    
* @retval 无
*/
__STATIC_INLINE void std_tim_slave_mode_config(TIM_t *timx, uint32_t slave_mode)
{
    MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, slave_mode);
}

/**
* @brief  设置触发输入源
* @param  timx TIM外设
* @param  trig_source 触发输入源定义
*             @arg TIM_TRIG_SOURCE_ITR0    
*             @arg TIM_TRIG_SOURCE_TI1F_ED
*             @arg TIM_TRIG_SOURCE_TI1FP1 
*             @arg TIM_TRIG_SOURCE_TI2FP2  
* @retval 无
*/
__STATIC_INLINE void std_tim_trig_source_config(TIM_t *timx, uint32_t trig_source)
{
    MODIFY_REG(timx->SMC, TIM_SMC_TS, trig_source);
}


/**
* @brief  使能主/从模式
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_master_mode_enable(TIM_t *timx)
{
    timx->SMC |= TIM_SMC_MS_MOD;
}


/**
* @brief  禁止主/从模式
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_master_mode_disable(TIM_t *timx)
{
    timx->SMC &= (~TIM_SMC_MS_MOD);
}


/**
* @brief  配置TIM OCREF CLEAR输入源
* @param  timx TIM外设
* @param  ocrefclr_source OCREF CLR源选择
*             @arg TIM_CLEAR_INPUT_SRC_COMP1: OCREF CLR连接到COMP1
*             @arg TIM_CLEAR_INPUT_SRC_COMP2: OCREF CLR连接到COMP2
* @retval 无
*/
__STATIC_INLINE void std_tim_ocrefclr_source_config(TIM_t *timx, uint32_t ocrefclr_source)
{
    MODIFY_REG(timx->CFG, TIM_CFG_OCREF_CLR, ocrefclr_source);
}


/**
* @brief  使能比较换相预装载控制
* @param  timx TIM外设
* @note   该函数仅对互补通道有效
* @retval 无
*/
__STATIC_INLINE void std_tim_ccreload_enable(TIM_t *timx)
{
    timx->CR2 |= TIM_CR2_CC_PRECR;
}

/**
* @brief  禁止比较换相预装载控制
* @param  timx TIM外设
* @note   该函数仅对互补通道有效
* @retval 无
*/
__STATIC_INLINE void std_tim_ccreload_disable(TIM_t *timx)
{
    timx->CR2 &= (~TIM_CR2_CC_PRECR);
}


/**
* @brief  配置换相控制更新源选择
* @param  timx TIM外设
* @param  ccupdate_source 换相更新源
*             @arg TIM_COM_SOFTWARE
*             @arg TIM_COM_TRGI
* @note   该函数仅对互补通道有效
* @retval 无
*/
__STATIC_INLINE void std_tim_cc_set_update_source(TIM_t *timx, uint32_t ccupdate_source)
{
    MODIFY_REG(timx->CR2, TIM_CR2_CCU_SEL, ccupdate_source);
}



/**
* @brief  使能TI1的XOR功能
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_ti1xor_enable(TIM_t *timx)
{
    timx->CR2 |= TIM_CR2_TI1_XOR_SEL;
}


/**
* @brief  禁止TI1的XOR功能
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_ti1xor_disable(TIM_t *timx)
{
    timx->CR2 &= (~TIM_CR2_TI1_XOR_SEL);
}


/**
* @brief  配置TIM输入通道重映射功能
* @param  timx TIM外设
* @param  ti_sel 通道输入源选择参数
*             @arg TIM_TIM3_TI1_GPIO:           TIM3 TI1连接到GPIO
*             @arg TIM_TIM3_TI1_COMP1:          TIM3 TI1连接到COMP1输出
*             @arg TIM_TIM3_TI2_GPIO:           TIM3 TI2连接到GPIO
*             @arg TIM_TIM3_TI2_COMP2:          TIM3 TI2连接到COMP2输出
* @param  channel_id TIM通道
*             @arg TIM_CHANNEL_1
*             @arg TIM_CHANNEL_2
* @retval 无
*/
__STATIC_INLINE void std_tim_set_channel_remap(TIM_t *timx, uint32_t ti_sel, uint32_t channel_id)
{
    MODIFY_REG(timx->TISEL, (TIM_TISEL_TI1_SEL << (channel_id << 3)), ti_sel);
}



/**
* @brief  TIM输出使能
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_moen_enable(TIM_t *timx)            
{
    timx->BDT |= (TIM_BDT_MOEN);
}

/**
* @brief  TIM输出禁止
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_moen_disable(TIM_t *timx)        
{
    timx->BDT &= (~TIM_BDT_MOEN);
}

/**
* @brief  TIM自动输出使能
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_aoen_enable(TIM_t *timx)            
{
    timx->BDT |= (TIM_BDT_AOEN);
}

/**
* @brief  TIM自动输出禁止
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_aoen_disable(TIM_t *timx)        
{
    timx->BDT &= (~TIM_BDT_AOEN);
}


/** 
* @brief  运行状态下的输出关闭时，使能通道/互补通道输出并将其设为无效电平
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_ossr_enable(TIM_t *timx)                
{
    timx->BDT |= TIM_BDT_OSSR;
}

/** 
* @brief  运行状态下输出关闭时，禁止通道/互补通道输出（由GPIO接管）
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_ossr_disable(TIM_t *timx)                
{
    timx->BDT &= (~TIM_BDT_OSSR);
}

/** 
* @brief  空闲状态下输出关闭时，输出强制为无效电平，在死区时间后强制为空闲电平
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_ossi_enable(TIM_t *timx)                
{
    timx->BDT |= TIM_BDT_OSSI;
}

/** 
* @brief  空闲状态下输出关闭时，禁止通道/互补通道输出（由GPIO接管）
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_ossi_disable(TIM_t *timx)                
{
    timx->BDT &= (~TIM_BDT_OSSI);
}


/** 
* @brief  使能TIM断路
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_bken_enable(TIM_t *timx)                
{
    timx->BDT |= TIM_BDT_BKEN;
}

/** 
* @brief  禁止TIM断路
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_bken_disable(TIM_t *timx)                
{
    timx->BDT &= (~TIM_BDT_BKEN);
}


/** 
* @brief  使能断路源
* @param  timx TIM外设
* @param  brk_source 断路输入源定义
*             @arg TIM_BREAK_INPUT_SRC_GPIO
*             @arg TIM_BREAK_INPUT_SRC_COMP1
*             @arg TIM_BREAK_INPUT_SRC_COMP2
* @retval 无
*/
__STATIC_INLINE void std_tim_brk_source_enable(TIM_t *timx, uint32_t brk_source)
{
    timx->AF1 |= brk_source;
}


/** 
* @brief  配置断路的极性
* @param  timx TIM外设
* @param  brk_source 断路输入源定义
*             @arg TIM_BREAK_INPUT_SRC_GPIO
*             @arg TIM_BREAK_INPUT_SRC_COMP1
*             @arg TIM_BREAK_INPUT_SRC_COMP2
* @param  brk_pol 断路输入极性定义
*             @arg TIM_BREAK_INPUT_POL_HIGH
*             @arg TIM_BREAK_INPUT_POL_LOW
* @retval 无
*/
__STATIC_INLINE void std_tim_set_brk_pol(TIM_t *timx, uint32_t brk_source, uint32_t brk_pol)
{   
    MODIFY_REG(timx->AF1, (TIM1_AF1_BKINP << (brk_source >> 1U)), (brk_pol << (brk_source >> 1U)));
}


/**
* @brief  配置TIM死区时间
* @param  timx TIM外设
* @param  deadtime 死区时间，该值的范围:0x00~0xFF
* @retval 无
*/
__STATIC_INLINE void std_tim_set_deadtime(TIM_t *timx, uint32_t deadtime)
{
    MODIFY_REG(timx->BDT, TIM_BDT_DTG, deadtime);
}


/**
* @brief  获取TIM死区时间
* @param  timx TIM外设
* @retval uint32_t 死区时间，其值范围为:0x00~0xFF
*/
__STATIC_INLINE uint32_t std_tim_get_deadtime(TIM_t *timx)
{
    return (timx->BDT & TIM_BDT_DTG);
}


/**
* @brief  配置TIM的锁定级别
* @param  timx TIM外设
* @param  locklevel LOCK锁定级别
*             @arg TIM_LOCK_LEVEL_OFF
*             @arg TIM_LOCK_LEVEL1
*             @arg TIM_LOCK_LEVEL2
*             @arg TIM_LOCK_LEVEL3
* @retval 无
*/
__STATIC_INLINE void std_tim_set_locklevel(TIM_t *timx, uint32_t locklevel)
{
    MODIFY_REG(timx->BDT, TIM_BDT_LOCK, locklevel);
}


/**
* @brief  获取TIM锁定级别
* @param  timx TIM外设
* @retval uint32_t LOCK锁定级别
*             @arg TIM_LOCK_LEVEL_OFF
*             @arg TIM_LOCK_LEVEL1
*             @arg TIM_LOCK_LEVEL2
*             @arg TIM_LOCK_LEVEL3
*/
__STATIC_INLINE uint32_t std_tim_get_locklevel(TIM_t *timx)
{
    return (timx->BDT & TIM_BDT_LOCK);
}


/** 
* @brief  使能LOCKUP锁定功能
* @param  timx TIM外设
* @retval 无
*/
__STATIC_INLINE void std_tim_lockup_lock_enable(TIM_t *timx)
{
    timx->AF1 |= TIM1_AF1_LOCKUP_LOCK;
}




/* 基础计数功能初始化/去初始化 */
void std_tim_deinit(TIM_t *timx);
void std_tim_init(TIM_t *timx, std_tim_basic_init_t *tim_init_param);
void std_tim_struct_init(std_tim_basic_init_t *tim_init_struct);

/* 输入捕获初始化 */
void std_tim_input_capture_init(TIM_t *timx, std_tim_input_capture_init_t *input_config, uint32_t channel_id);
void std_tim_input_capture_struct_init(std_tim_input_capture_init_t *input_init_struct);

/* 输出模式初始化及参数配置函数 */
void std_tim_output_compare_init(TIM_t *timx, std_tim_output_compare_init_t *output_config, uint32_t channel_id);
void std_tim_output_compare_struct_init(std_tim_output_compare_init_t *output_init_struct);

/* 断路功能初始化 */
void std_tim_bdt_init(TIM_t* timx, std_tim_break_init_t *bdt_init_param);
void std_tim_bdt_struct_init(std_tim_break_init_t *bdt_init_struct);


/**
* @}
*/

#ifdef __cplusplus
}
#endif
/**
* @}
*/

/**
* @}
*/
#endif /* CIU32F003_STD_TIM_H */

