CIU32_L051_M307R/Peripheral/CIU32L051_Lib/Include/ciu32l051_std_tim.h

1582 lines
61 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/************************************************************************************************/
/**
* @file ciu32l051_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 CIU32L051_STD_TIM_H
#define CIU32L051_STD_TIM_H
/************************************************************************************************/
/**
* @addtogroup CIU32L051_STD_Driver
* @{
*/
/**
* @defgroup TIM TIM
* @brief 通用定时器/基本定时器的STD库驱动
* @{
*
*/
/************************************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
/*------------------------------------------includes--------------------------------------------*/
#include "ciu32l051_std_common.h"
/*-----------------------------------------type define------------------------------------------*/
/************************************************************************************************/
/**
* @defgroup TIM_Types TIM Types
* @brief TIM数据类型定义
* @{
*/
/************************************************************************************************/
/**
* @brief TIM基本参数配置结构体定义
*/
typedef struct
{
uint32_t prescaler; /**< TIM时钟的预分频参数其值必须在0x0000~0xFFFF之间 */
uint32_t counter_mode; /**< 计数器模式选择
@arg TIM_COUNTER_MODE_UP ... */
uint32_t period; /**< 自动重载值其值必须在0x0000~0xFFFF之间 */
uint32_t clock_div; /**< TIM时钟分频参数
@arg TIM_CLOCK_DTS_DIV1 ... */
uint32_t auto_reload_preload; /**< 自动重载预加载
@arg TIM_AUTORELOAD_PRE_DISABLE ... */
}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 pulse; /**< TIM载入捕获比较寄存器的脉冲值其值必须在0x0000~0xFFFF之间 */
uint32_t output_pol; /**< 输出极性定义
@arg TIM_OUTPUT_POL_HIGH ... */
uint32_t output_preloadccx; /**< 通道预加载使能定义
@arg TIM_OUTPUT_PRECC_ENABLE ... */
uint32_t output_fast_mode; /**< 快速模式定义
@arg TIM_OUTPUT_FAST_ENABLE ...
@note 该参数仅在PWM1和PWM2模式下有效 */
}std_tim_output_compare_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_UP /**< 中心对齐模式1 */
#define TIM_COUNTER_MODE_CENT_MODE2 TIM_CR1_CMS_CENTER_DOWN /**< 中心对齐模式2 */
#define TIM_COUNTER_MODE_CENT_MODE3 TIM_CR1_CMS_CENTER_UP_DOWN /**< 中心对齐模式3 */
/* TIM计数方向定义 */
#define TIM_COUNTER_UP (0x00000000U) /**< 计数方向为:向上 */
#define TIM_COUNTER_DOWN TIM_CR1_DIR /**< 计数方向为:向下 */
/* TIM自动重载预装载状态定义 */
#define TIM_AUTORELOAD_PRE_DISABLE (0x00000000U) /**< 禁止寄存器预装载功能 */
#define TIM_AUTORELOAD_PRE_ENABLE TIM_CR1_ARPE /**< 使能寄存器预装载功能 */
/* 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_PRECC_DISABLE (0x00000000U) /**< 禁止输出比较预装载模式 */
#define TIM_OUTPUT_PRECC_ENABLE TIM_CCM1_OC1PE /**< 使能输出比较预装载模式 */
/* TIM输出快速状态定义 */
#define TIM_OUTPUT_FAST_DISABLE (0x00000000U) /**< 禁止输出比较快速模式 */
#define TIM_OUTPUT_FAST_ENABLE TIM_CCM1_OC1FE /**< 使能输出比较快速模式 */
/* TIM输出比较极性定义 */
#define TIM_OUTPUT_POL_HIGH (0x00000000U) /**< 比较输出极性:高电平为有效电平 */
#define TIM_OUTPUT_POL_LOW TIM_CCEN_CC1P /**< 比较输出极性:低电平为有效电平 */
/* 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 ETR极性定义 */
#define TIM_ETR_POL_HIGH (0x00000000U) /**< ETR高电平或上升沿有效 */
#define TIM_ETR_POL_LOW TIM_SMC_ETP /**< ETR低电平或下降沿有效 */
/* TIM ETR预分频参数 */
#define TIM_ETR_PSC_DIV1 (0x00000000U) /**< 预分频器关闭 */
#define TIM_ETR_PSC_DIV2 TIM_SMC_ET_PRE_DIV2 /**< ETR输入源预分频系数为2 */
#define TIM_ETR_PSC_DIV4 TIM_SMC_ET_PRE_DIV4 /**< ETR输入源预分频系数为4 */
#define TIM_ETR_PSC_DIV8 TIM_SMC_ET_PRE_DIV8 /**< ETR输入源预分频系数为8 */
/* TIM时钟源选择 */
#define TIM_CLKSRC_INT (0x00000000U) /**< TIM时钟源内部时钟 */
#define TIM_CLKSRC_ETR_MODE1 TIM_SMC_SM_SEL_EXT_MODE1 /**< TIM时钟源外部时钟源模式1 */
#define TIM_CLKSRC_ETR_MODE2 TIM_SMC_ECEN /**< TIM时钟源外部时钟源模式2 */
/* TIM时钟极性定义 */
#define TIM_CLK_ETR_POL_HIGH (0x00000000U) /**< ETR时钟源的极性高有效 */
#define TIM_CLK_ETR_POL_LOW TIM_SMC_ETP /**< ETR时钟源的极性低有效 */
#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 DMA请求生成事件源 */
#define TIM_GEN_DMA_REQ_CCX (0x00000000U) /**< 发生CCx事件生成DMA请求 */
#define TIM_GEN_DMA_REQ_UPDATE (TIM_CR2_CC_DMASEL) /**< 发生更新事件生成DMA请求 */
/* 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_TRIG TIM_EVTG_TG /**< 生成一个触发事件 */
/* 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_TRIG TIM_DIER_TIE /**< 触发中断 */
/* TIM DMA源 */
#define TIM_DMA_REQ_UPDATE TIM_DIER_UDMAEN /**< 更新事件触发DMA请求 */
#define TIM_DMA_REQ_CC1 TIM_DIER_CC1_DMAEN /**< 捕获/比较1触发DMA请求 */
#define TIM_DMA_REQ_CC2 TIM_DIER_CC2_DMAEN /**< 捕获/比较2触发DMA请求 */
#define TIM_DMA_REQ_CC3 TIM_DIER_CC3_DMAEN /**< 捕获/比较3触发DMA请求 */
#define TIM_DMA_REQ_CC4 TIM_DIER_CC4_DMAEN /**< 捕获/比较4触发DMA请求 */
#define TIM_DMA_REQ_TRIG TIM_DIER_TDMAEN /**< 触发事件触发DMA请求 */
/* TIM标志定义 */
#define TIM_FLAG_ALL (0x1E5FU) /**< 所有事件标志 */
#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_TRIG TIM_SR_TIF /**< 触发事件标志 */
#define TIM_FLAG_CC1OF TIM_SR_CC1OF /**< 捕获/比较1重复捕获标志 */
#define TIM_FLAG_CC2OF TIM_SR_CC2OF /**< 捕获/比较2重复捕获标志 */
#define TIM_FLAG_CC3OF TIM_SR_CC3OF /**< 捕获/比较3重复捕获标志 */
#define TIM_FLAG_CC4OF TIM_SR_CC4OF /**< 捕获/比较3重复捕获标志 */
/* TIM清除OCxREF输出的输入源 */
#define TIM_CLEAR_INPUT_SRC_ETR TIM_SMC_OCCS /**< 清除OCREF输出的信号源与ETRF相连 */
#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清除OCxREF输出的信号源极性定义 */
#define TIM_CLEAR_INPUT_POL_HIGH (0x00000000U) /**< ETR引脚极性:高电平或上升沿有效 */
#define TIM_CLEAR_INPUT_POL_LOW TIM_SMC_ETP /**< ETR引脚极性:低电平或下降沿有效 */
/* TIM正交编码模式选择 */
#define TIM_ENCODER_MODE_TI1 TIM_SMC_SM_SEL_ENCODE_TI1 /**< 正交编码模式1, x2模式,
计数器根据TI1FP1电平在TI2FP2边沿递增/递减计数 */
#define TIM_ENCODER_MODE_TI2 TIM_SMC_SM_SEL_ENCODE_TI2 /**< 正交编码模式2, x2模式,
计数器根据TI2FP2电平在TI1FP1边沿递增/递减计数 */
#define TIM_ENCODER_MODE_TI12 TIM_SMC_SM_SEL_ENCODE_TI12 /**< 正交编码模式3, x4模式,
计数器在TI1FP1和TI2FP2的边沿计数计数的方向取决于另外一个输入的电平 */
/* 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 /**< 内部触发0ITR0 */
#define TIM_TRIG_SOURCE_ITR1 TIM_SMC_TS_ITR1 /**< 内部触发1ITR1 */
#define TIM_TRIG_SOURCE_ITR2 TIM_SMC_TS_ITR2 /**< 内部触发2ITR2 */
#define TIM_TRIG_SOURCE_TI1F_ED TIM_SMC_TS_TI1F_ED /**< TI1边沿检测器TI1F_ED */
#define TIM_TRIG_SOURCE_TI1FP1 TIM_SMC_TS_TI1FP1 /**< 滤波后的定时器输入1TI1FP1 */
#define TIM_TRIG_SOURCE_TI2FP2 TIM_SMC_TS_TI2FP2 /**< 滤波后的定时器输入2TI1FP2 */
#define TIM_TRIG_SOURCE_ETRF TIM_SMC_TS_ETRF /**< 外部触发输入ETRF */
/* TIM触发极性参数定义*/
#define TIM_TRIG_ETR_POL_RISING (0x00000000U) /**< ETR触发极性:高电平或上升沿有效 */
#define TIM_TRIG_ETR_POL_FALLING TIM_SMC_ETP /**< ETR触发极性:低电平或下降沿有效 */
#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_TRIG_PSC_DIV1 TIM_ETR_PSC_DIV1 /**< 未使用预分频 */
#define TIM_TRIG_PSC_DIV2 TIM_ETR_PSC_DIV2 /**< 外部ETR时钟预分频 = 2 */
#define TIM_TRIG_PSC_DIV4 TIM_ETR_PSC_DIV4 /**< 外部ETR时钟预分频 = 4 */
#define TIM_TRIG_PSC_DIV8 TIM_ETR_PSC_DIV8 /**< 外部ETR时钟预分频 = 8 */
/* TIM ETR定义 */
#define TIM_TIM3_ETR_GPIO TIM3_AF1_ETR_SEL_GPIO /**< TIM3_ETR连接到GPIO */
#define TIM_TIM3_ETR_COMP1 TIM3_AF1_ETR_SEL_COMP1 /**< TIM3_ETR连接到COMP1输出 */
#define TIM_TIM3_ETR_COMP2 TIM3_AF1_ETR_SEL_COMP2 /**< TIM3_ETR连接到COMP2输出 */
#define TIM_TIM3_ETR_LXTAL TIM3_AF1_ETR_SEL_LXTAL /**< TIM3_ETR连接到LXTAL */
#define TIM_TIM3_ETR_HXTAL TIM3_AF1_ETR_SEL_HXTAL /**< TIM3_ETR连接到HXTAL */
#define TIM_TIM3_ETR_MCO TIM3_AF1_ETR_SEL_MCO /**< TIM3_ETR连接到MCO */
#define TIM_TIM3_ETR_RCL TIM3_AF1_ETR_SEL_RCL /**< TIM3_ETR连接到RCL */
#define TIM_TIM4_ETR_GPIO TIM4_AF1_ETR_SEL_GPIO /**< TIM4_ETR连接到GPIO */
#define TIM_TIM4_ETR_COMP1 TIM4_AF1_ETR_SEL_COMP1 /**< TIM4_ETR连接到COMP1输出 */
#define TIM_TIM4_ETR_COMP2 TIM4_AF1_ETR_SEL_COMP2 /**< TIM4_ETR连接到COMP2输出 */
#define TIM_TIM5_ETR_GPIO TIM5_AF1_ETR_SEL_GPIO /**< TIM5_ETR连接到GPIO */
#define TIM_TIM5_ETR_COMP1 TIM5_AF1_ETR_SEL_COMP1 /**< TIM5_ETR连接到COMP1输出 */
#define TIM_TIM5_ETR_COMP2 TIM5_AF1_ETR_SEL_COMP2 /**< TIM5_ETR连接到COMP2输出 */
/* 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输出 */
#define TIM_TIM3_TI4_GPIO TIM3_TISEL_TI4_SEL_CH4 /**< TIM3_TI4连接到GPIO */
#define TIM_TIM3_TI4_LXTAL TIM3_TISEL_TI4_SEL_LXTAL /**< TIM3_TI4连接到LXTAL时钟 */
#define TIM_TIM3_TI4_HXTAL TIM3_TISEL_TI4_SEL_HXTAL /**< TIM3_TI4连接到HXTAL时钟 */
#define TIM_TIM3_TI4_MCO TIM3_TISEL_TI4_SEL_MCO /**< TIM3_TI4连接到MCO */
#define TIM_TIM3_TI4_RCL TIM3_TISEL_TI4_SEL_RCL /**< TIM3_TI4连接到RCL时钟 */
#define TIM_TIM4_TI1_GPIO TIM_TISEL_TI1_SEL_CH1 /**< TIM4_TI1连接到GPIO */
#define TIM_TIM4_TI1_COMP1 TIM_TISEL_TI1_SEL_COMP1 /**< TIM4_TI1连接到COMP1输出 */
#define TIM_TIM4_TI2_GPIO TIM_TISEL_TI2_SEL_CH2 /**< TIM4_TI2连接到GPIO */
#define TIM_TIM4_TI2_COMP2 TIM_TISEL_TI2_SEL_COMP2 /**< TIM4_TI2连接到COMP2输出 */
#define TIM_TIM5_TI1_GPIO TIM_TISEL_TI1_SEL_CH1 /**< TIM5_TI1连接到GPIO */
#define TIM_TIM5_TI1_COMP1 TIM_TISEL_TI1_SEL_COMP1 /**< TIM5_TI1连接到COMP1输出 */
#define TIM_TIM5_TI2_GPIO TIM_TISEL_TI2_SEL_CH2 /**< TIM5_TI2连接到GPIO */
#define TIM_TIM5_TI2_COMP2 TIM_TISEL_TI2_SEL_COMP2 /**< TIM5_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 预分频新值
* @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 TIM ARR值其值必须≥3。
* @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时钟分频值
* @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 设置计数模式
* @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 bool 返回TIM计数方向标志
* @arg true: 当前计数方向为向下计数
* @arg false:当前计数方向为向上计数
*/
__STATIC_INLINE bool std_tim_get_count_dir(TIM_t *timx)
{
return ((timx->CR1 & TIM_CR1_DIR) == (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 bool 返回单脉冲计数模式
* @arg true: 当前配置为单脉冲模式
* @arg false:当前配置为连续计数模式
*/
__STATIC_INLINE bool std_tim_get_onepulse_mode(TIM_t *timx)
{
return ((timx->CR1 & (TIM_CR1_OPM)) == (TIM_CR1_OPM));
}
/**
* @brief 设置计数时钟源参数
* @param timx TIM外设
* @param clock_source 时钟源选择
* @arg TIM_CLKSRC_INT: 内部时钟源
* @arg TIM_CLKSRC_ETR_MODE1:外部时钟模式1
* @arg TIM_CLKSRC_ETR_MODE2:外部时钟模式2
* @retval 无
*/
__STATIC_INLINE void std_tim_clock_source_config(TIM_t *timx, uint32_t clock_source)
{
MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL | TIM_SMC_ECEN, 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_TRIG: 触发事件源
* @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_TRIG: 触发中断
* @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_TRIG: 触发中断
* @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_TRIG: 触发中断
* @retval bool 返回中断请求源的状态
* @arg true: 当前中断请求源为使能状态
* @arg false:当前中断请求源为禁止状态
*/
__STATIC_INLINE bool std_tim_get_interrupt_enable(TIM_t *timx, uint32_t interrupt)
{
return ((timx->DIER &(interrupt)) == (interrupt));
}
/**
* @brief DMA请求使能
* @param timx TIM外设
* @param dam_req TIM_DMA请求
* @arg TIM_DMA_REQ_UPDATE: 更新DMA请求
* @arg TIM_DMA_REQ_CC1: 捕获/比较1 DMA请求
* @arg TIM_DMA_REQ_CC2: 捕获/比较2 DMA请求
* @arg TIM_DMA_REQ_CC3: 捕获/比较3 DMA请求
* @arg TIM_DMA_REQ_CC4: 捕获/比较4 DMA请求
* @arg TIM_DMA_REQ_TRIG: 触发DMA请求
* @retval 无
*/
__STATIC_INLINE void std_tim_dma_req_enable(TIM_t *timx, uint32_t dam_req)
{
timx->DIER |= (dam_req);
}
/**
* @brief DMA请求禁止
* @param timx TIM外设
* @param dam_req TIM_DMA请求
* @arg TIM_DMA_REQ_UPDATE: 更新DMA请求
* @arg TIM_DMA_REQ_CC1: 捕获/比较1 DMA请求
* @arg TIM_DMA_REQ_CC2: 捕获/比较2 DMA请求
* @arg TIM_DMA_REQ_CC3: 捕获/比较3 DMA请求
* @arg TIM_DMA_REQ_CC4: 捕获/比较4 DMA请求
* @arg TIM_DMA_REQ_TRIG: 触发DMA请求
* @retval 无
*/
__STATIC_INLINE void std_tim_dma_req_disable(TIM_t *timx, uint32_t dam_req)
{
timx->DIER &= (~(dam_req));
}
/**
* @brief 获取TIM DMA使能状态
* @param timx TIM外设
* @param dam_req TIM_DMA请求
* @arg TIM_DMA_REQ_UPDATE: 更新DMA请求
* @arg TIM_DMA_REQ_CC1: 捕获/比较1 DMA请求
* @arg TIM_DMA_REQ_CC2: 捕获/比较2 DMA请求
* @arg TIM_DMA_REQ_CC3: 捕获/比较3 DMA请求
* @arg TIM_DMA_REQ_CC4: 捕获/比较4 DMA请求
* @arg TIM_DMA_REQ_TRIG: 触发DMA请求
* @retval bool 返回DMA请求源的状态
* @arg true: 当前DMA请求源为使能状态
* @arg false:当前DMA请求源为禁止状态
*/
__STATIC_INLINE bool std_tim_get_dma_req_enable(TIM_t *timx, uint32_t dam_req)
{
return ((timx->DIER &(dam_req)) == (dam_req));
}
/**
* @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_TRIG: 触发事件标志
* @arg TIM_FLAG_CC1OF: 捕获/比较1重复捕获标志
* @arg TIM_FLAG_CC2OF: 捕获/比较2重复捕获标志
* @arg TIM_FLAG_CC3OF: 捕获/比较3重复捕获标志
* @arg TIM_FLAG_CC4OF: 捕获/比较4重复捕获标志
* @retval bool 返回标志的状态
* @arg true: 当前标志为置起状态
* @arg false:当前标志为清除状态
*/
__STATIC_INLINE bool std_tim_get_flag(TIM_t *timx, uint32_t flag)
{
return ((timx->SR &(flag)) == (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_TRIG: 触发事件标志
* @arg TIM_FLAG_CC1OF: 捕获/比较1重复捕获标志
* @arg TIM_FLAG_CC2OF: 捕获/比较2重复触发标志
* @arg TIM_FLAG_CC3OF: 捕获/比较3重复触发标志
* @arg TIM_FLAG_CC4OF: 捕获/比较4重复触发标志
* @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
* @arg TIM_CHANNEL_4
* @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
* @arg TIM_CHANNEL_3
* @arg TIM_CHANNEL_4
* @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 使能清除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
* @arg TIM_CHANNEL_3
* @arg TIM_CHANNEL_4
* @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
* @arg TIM_CHANNEL_3
* @arg TIM_CHANNEL_4
* @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
* @note 该函数执行后,会将通道设置为输出模式
* @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 std_status_t 返回API执行结果
*/
__STATIC_INLINE void std_tim_set_ccx_value(TIM_t *timx, uint32_t channel_id, uint32_t ccx_value)
{
__IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
MODIFY_REG(*pReg, TIM_CC1_CC1, ccx_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)
{
__IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
return (*preg & TIM_CC1_CC1);
}
/**
* @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 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
* @arg TIM_CHANNEL_3
* @arg TIM_CHANNEL_4
* @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
* @arg TIM_CHANNEL_3
* @arg TIM_CHANNEL_4
* @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
* @arg TIM_CHANNEL_3
* @arg TIM_CHANNEL_4
* @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 设置编码器模式计数方式
* @param timx TIM外设
* @param encoder_mode 编码器计数方式
* @arg TIM_ENCODER_MODE_TI1
* @arg TIM_ENCODER_MODE_TI2
* @arg TIM_ENCODER_MODE_TI12
* @retval 无
*/
__STATIC_INLINE void std_tim_encode_mode_config(TIM_t *timx, uint32_t encoder_mode)
{
MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, encoder_mode);
}
/**
* @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_ITR1
* @arg TIM_TRIG_SOURCE_ITR2
* @arg TIM_TRIG_SOURCE_TI1F_ED
* @arg TIM_TRIG_SOURCE_TI1FP1
* @arg TIM_TRIG_SOURCE_TI2FP2
* @arg TIM_TRIG_SOURCE_ETRF
* @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 ETR参数配置
* @param timx TIM外设
* @param etr_pol ETR极性参数定义
* @arg TIM_ETR_POL_HIGH
* @arg TIM_ETR_POL_LOW
* @param etr_psc ETR预分频参数定义
* @arg TIM_ETR_PSC_DIV1
* @arg TIM_ETR_PSC_DIV2
* @arg TIM_ETR_PSC_DIV4
* @arg TIM_ETR_PSC_DIV8
* @param etr_filter ETR滤波参数定义其值范围为:0x00~0x07
* @retval 无
*/
__STATIC_INLINE void std_tim_etr_config(TIM_t *timx, uint32_t etr_pol, uint32_t etr_psc, uint32_t etr_filter)
{
MODIFY_REG(timx->SMC, TIM_SMC_ETP | TIM_SMC_ET_PRE | TIM_SMC_ETF, etr_pol | etr_psc | (etr_filter << TIM_SMC_ETF_POS));
}
/**
* @brief 配置ETR源
* @param timx TIM外设
* @param etr_source ETR源选择
* 对于TIM3参数可以取以下值之一:
* @arg TIM_TIM3_ETR_GPIO: TIM3 ETR连接到GPIO
* @arg TIM_TIM3_ETR_COMP1: TIM3 ETR连接到COMP1输出
* @arg TIM_TIM3_ETR_COMP2: TIM3 ETR连接到COMP2输出
* @arg TIM_TIM3_ETR_LXTAL: TIM3 ETR连接到LXTAL
* @arg TIM_TIM3_ETR_HXTAL: TIM3 ETR连接到HXTAL
* @arg TIM_TIM3_ETR_MCO: TIM3 ETR连接到MCO
* @arg TIM_TIM3_ETR_RCL: TIM3 ETR连接到RCL
*
* 对于TIM4参数可以取以下值之一:
* @arg TIM_TIM4_ETR_GPIO: TIM4 ETR连接到GPIO
* @arg TIM_TIM4_ETR_COMP1: TIM4 ETR连接到COMP1输出
* @arg TIM_TIM4_ETR_COMP2: TIM4 ETR连接到COMP2输出
*
* 对于TIM5参数可以取以下值之一:
* @arg TIM_TIM5_ETR_GPIO: TIM5 ETR连接到GPIO
* @arg TIM_TIM5_ETR_COMP1: TIM5 ETR连接到COMP1输出
* @arg TIM_TIM5_ETR_COMP2: TIM5 ETR连接到COMP2输出
* @retval 无
*/
__STATIC_INLINE void std_tim_set_etr_source(TIM_t *timx, uint32_t etr_source)
{
MODIFY_REG(timx->AF1, TIM_AF1_ETR_SEL, etr_source);
}
/**
* @brief 获取ETR源
* @param timx TIM外设
* @retval uint32_t ETR源选择
* 对于TIM3参数可以取以下值之一:
* @arg TIM_TIM3_ETR_GPIO: TIM3 ETR连接到GPIO
* @arg TIM_TIM3_ETR_COMP1: TIM3 ETR连接到COMP1输出
* @arg TIM_TIM3_ETR_COMP2: TIM3 ETR连接到COMP2输出
* @arg TIM_TIM3_ETR_LXTAL: TIM3 ETR连接到LXTAL
* @arg TIM_TIM3_ETR_HXTAL: TIM3 ETR连接到HXTAL
* @arg TIM_TIM3_ETR_MCO: TIM3 ETR连接到MCO
* @arg TIM_TIM3_ETR_RCL: TIM3 ETR连接到RCL
*
* 对于TIM4参数可以取以下值之一:
* @arg TIM_TIM4_ETR_GPIO: TIM4 ETR连接到GPIO
* @arg TIM_TIM4_ETR_COMP1: TIM4 ETR连接到COMP1输出
* @arg TIM_TIM4_ETR_COMP2: TIM4 ETR连接到COMP2输出
*
* 对于TIM5参数可以取以下值之一:
* @arg TIM_TIM5_ETR_GPIO: TIM5 ETR连接到GPIO
* @arg TIM_TIM5_ETR_COMP1: TIM5 ETR连接到COMP1输出
* @arg TIM_TIM5_ETR_COMP2: TIM5 ETR连接到COMP2输出
*/
__STATIC_INLINE uint32_t std_tim_get_etr_source(TIM_t *timx)
{
return (timx->AF1 & TIM_AF1_ETR_SEL);
}
/**
* @brief 配置TIM OCREF CLEAR输入源
* @param timx TIM外设
* @param ocrefclr_source OCREF CLR源选择
* @arg TIM_CLEAR_INPUT_SRC_ETR: OCREF CLR连接到ETR
* @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)
{
if(ocrefclr_source == TIM_CLEAR_INPUT_SRC_ETR)
{
timx->SMC |= TIM_SMC_OCCS;
}
else
{
timx->SMC &= (~TIM_SMC_OCCS);
MODIFY_REG(timx->CFG, TIM_CFG_OCREF_CLR, ocrefclr_source);
}
}
/**
* @brief 配置捕获/比较DMA请求生成选择
* @param timx TIM外设
* @param gen_event 生成DMA请求的事件
* @arg TIM_GEN_DMA_REQ_CCX
* @arg TIM_GEN_DMA_REQ_UPDATE
* @note DMA Burst模式下该配置无效
* @retval 无
*/
__STATIC_INLINE void std_tim_dma_request_gen_event_config(TIM_t *timx, uint32_t gen_event)
{
MODIFY_REG(timx->CR2, (TIM_CR2_CC_DMASEL), gen_event);
}
/**
* @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 通道输入源选择参数
* 对于TIM3参数可以取以下值之一:
* @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输出
*
* @arg TIM_TIM3_TI4_GPIO: TIM3 TI4连接到GPIO
* @arg TIM_TIM3_TI4_LXTAL: TIM3 TI4连接到LXTAL
* @arg TIM_TIM3_TI4_HXTAL: TIM3 TI4连接到HXTAL
* @arg TIM_TIM3_TI4_MCO: TIM3 TI4连接到MCO
* @arg TIM_TIM3_TI4_RCL: TIM3 TI4连接到RCL
*
* 对于TIM4参数可以取以下值之一:
* @arg TIM_TIM4_TI1_GPIO: TIM4 TI1连接到GPIO
* @arg TIM_TIM4_TI1_COMP1: TIM4 TI1连接到COMP1输出
* @arg TIM_TIM4_TI2_GPIO: TIM4 TI2连接到GPIO
* @arg TIM_TIM4_TI2_COMP2: TIM4 TI2连接到COMP2输出
*
* 对于TIM5参数可以取以下值之一:
* @arg TIM_TIM5_TI1_GPIO: TIM5 TI1连接到GPIO
* @arg TIM_TIM5_TI1_COMP1: TIM5 TI1连接到COMP1输出
* @arg TIM_TIM5_TI2_GPIO: TIM5 TI2连接到GPIO
* @arg TIM_TIM5_TI2_COMP2: TIM5 TI2连接到COMP2输出
* @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_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);
}
/* 基础计数功能初始化/去初始化 */
void std_tim_init(TIM_t *timx, std_tim_basic_init_t *tim_init_param);
void std_tim_deinit(TIM_t *timx);
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);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
/**
* @}
*/
/**
* @}
*/
#endif /* CIU32L051_STD_TIM_H */