/** ******************************************************************************************************* * @file fm33lg0xx_fl_atim.c * @author FMSH Application Team * @brief Src file of ATIM FL Module ******************************************************************************************************* * @attention * * Copyright (c) [2021] [Fudan Microelectronics] * THIS SOFTWARE is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: * http://license.coscl.org.cn/MulanPSL2 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. * ******************************************************************************************************* */ /* Includes ------------------------------------------------------------------*/ #include "fm33lg0xx_fl.h" /** @addtogroup FM33LG0XX_FL_Driver * @{ */ /** @addtogroup ATIM * @{ */ #ifdef FL_ATIM_DRIVER_ENABLED /* Private macros ------------------------------------------------------------*/ /** @addtogroup ATIM_FL_Private_Macros * @{ */ #define IS_ATIM_INSTANCE(TIMx) ((TIMx) == ATIM) #define IS_ATIM_CLKSRC(__VALUE__) (((__VALUE__) == FL_CMU_ATIM_CLK_SOURCE_APBCLK) \ || ((__VALUE__) == FL_CMU_ATIM_CLK_SOURCE_PLL_X2)) #define IS_FL_ATIM_COUNTERMODE(__VALUE__) (((__VALUE__) == FL_ATIM_COUNTER_DIR_UP) \ || ((__VALUE__) == FL_ATIM_COUNTER_DIR_DOWN) \ || ((__VALUE__) == FL_ATIM_COUNTER_ALIGNED_CENTER_DOWN ) \ || ((__VALUE__) == FL_ATIM_COUNTER_ALIGNED_CENTER_UP ) \ || ((__VALUE__) == FL_ATIM_COUNTER_ALIGNED_CENTER_UP_DOWN)) #define IS_FL_ATIM_CLOCKDIVISION(__VALUE__) (((__VALUE__) == FL_ATIM_CLK_DIVISION_DIV1) \ || ((__VALUE__) == FL_ATIM_CLK_DIVISION_DIV2) \ || ((__VALUE__) == FL_ATIM_CLK_DIVISION_DIV4)) #define IS_FL_ATIM_CC_MODE(__VALUE__) (((__VALUE__) == FL_ATIM_CHANNEL_MODE_OUTPUT) \ || ((__VALUE__) == FL_ATIM_CHANNEL_MODE_INPUT_NORMAL) \ || ((__VALUE__) == FL_ATIM_CHANNEL_MODE_INPUT_CROSSOVER) \ || ((__VALUE__) == FL_ATIM_CHANNEL_MODE_INPUT_TRC)) #define IS_FL_ATIM_IC_FILTER(__VALUE__) (((__VALUE__) == FL_ATIM_IC_FILTER_DIV1 ) \ || ((__VALUE__) ==FL_ATIM_IC_FILTER_DIV1_N2) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV1_N4) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV1_N8) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV2_N6) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV2_N8) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV4_N6) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV4_N8) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV8_N6) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV8_N8) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV16_N5) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV16_N6) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV16_N8) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV32_N5) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV32_N6) \ || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV32_N8)) #define IS_FL_ATIM_CHANNEL(__VALUE__) (((__VALUE__) == FL_ATIM_CHANNEL_1)\ || ((__VALUE__) == FL_ATIM_CHANNEL_2)\ || ((__VALUE__) == FL_ATIM_CHANNEL_3)\ || ((__VALUE__) == FL_ATIM_CHANNEL_4)) #define IS_FL_ATIM_SLAVE_MODE(__VALUE__) (((__VALUE__) == FL_ATIM_SLAVE_MODE_PROHIBITED)\ || ((__VALUE__) == FL_ATIM_SLAVE_MODE_ENCODER_X2_TI1)\ || ((__VALUE__) == FL_ATIM_SLAVE_MODE_ENCODER_X2_TI2)\ || ((__VALUE__) == FL_ATIM_SLAVE_MODE_ENCODER_X4_TI1TI2)\ || ((__VALUE__) == FL_ATIM_SLAVE_MODE_TRGI_RISE_RST)\ || ((__VALUE__) == FL_ATIM_SLAVE_MODE_TRGI_HIGH_RUN)\ || ((__VALUE__) == FL_ATIM_SLAVE_MODE_TRGI_RISE_RUN)\ || ((__VALUE__) == FL_ATIM_SLAVE_MODE_TRGI_CLK)) #define IS_FL_ATIM_TRIGGER_SRC(__VALUE__) (((__VALUE__) == FL_ATIM_TRGI_ITR0 )\ ||((__VALUE__) ==FL_ATIM_TRGI_ITR1 )\ ||((__VALUE__) ==FL_ATIM_TRGI_ITR2)\ ||((__VALUE__) ==FL_ATIM_TRGI_ITR3)\ ||((__VALUE__) ==FL_ATIM_TRGI_TI1F_EDGE)\ ||((__VALUE__) ==FL_ATIM_TRGI_TI1FP1)\ ||((__VALUE__) ==FL_ATIM_TRGI_TI2FP2)\ ||((__VALUE__) ==FL_ATIM_TRGI_ETRF)) #define IS_FL_ATIM_ETP_FILTER(__VALUE__) (((__VALUE__) == FL_ATIM_ETR_FILTER_DIV1) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV1_N2) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV1_N4) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV1_N8) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV2_N6) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV2_N8) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV4_N6) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV4_N8) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV8_N6) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV8_N8) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV16_N5) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV16_N6) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV16_N8) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV32_N5) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV32_N6) \ || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV32_N8)) #define IS_FL_ATIM_ETR_PSC(__VALUE__) (((__VALUE__) == FL_ATIM_ETR_PSC_DIV1) \ || ((__VALUE__) == FL_ATIM_ETR_PSC_DIV2) \ || ((__VALUE__) == FL_ATIM_ETR_PSC_DIV4) \ || ((__VALUE__) == FL_ATIM_ETR_PSC_DIV8)) #define IS_FL_ATIM_ETR_POLARITY(__VALUE__) (((__VALUE__) == FL_ATIM_ETR_POLARITY_NORMAL) \ || ((__VALUE__) == FL_ATIM_ETR_POLARITY_INVERT)) #define IS_FL_ATIM_IC_POLARITY(__VALUE__) (((__VALUE__) == FL_ATIM_IC_POLARITY_NORMAL) \ || ((__VALUE__) == FL_ATIM_IC_POLARITY_INVERT)) #define IS_FL_ATIM_IC_ACTIVEINPUT(__VALUE__) (((__VALUE__) == FL_ATIM_CHANNEL_MODE_INPUT_NORMAL) \ || ((__VALUE__) == FL_ATIM_CHANNEL_MODE_INPUT_CROSSOVER) \ || ((__VALUE__) == FL_ATIM_CHANNEL_MODE_INPUT_TRC)) #define IS_FL_ATIM_IC_PRESCALER(__VALUE__) (((__VALUE__) == FL_ATIM_IC_PSC_DIV1) \ || ((__VALUE__) == FL_ATIM_IC_PSC_DIV2) \ || ((__VALUE__) == FL_ATIM_IC_PSC_DIV4) \ || ((__VALUE__) == FL_ATIM_IC_PSC_DIV8)) #define IS_FL_ATIM_OC_POLARITY(__VALUE__) (((__VALUE__) == FL_ATIM_OC_POLARITY_NORMAL) \ || ((__VALUE__) == FL_ATIM_OC_POLARITY_INVERT)) #define IS_FL_ATIM_OC_MODE(__VALUE__) (((__VALUE__) == FL_ATIM_OC_MODE_FROZEN) \ || ((__VALUE__) == FL_ATIM_OC_MODE_ACTIVE) \ || ((__VALUE__) == FL_ATIM_OC_MODE_INACTIVE) \ || ((__VALUE__) == FL_ATIM_OC_MODE_TOGGLE) \ || ((__VALUE__) == FL_ATIM_OC_MODE_FORCED_INACTIVE) \ || ((__VALUE__) == FL_ATIM_OC_MODE_FORCED_ACTIVE) \ || ((__VALUE__) == FL_ATIM_OC_MODE_PWM1) \ || ((__VALUE__) == FL_ATIM_OC_MODE_PWM2)) #define IS_FL_ATIM_AUTORELOAB_STATE(__VALUE__) (((__VALUE__) == FL_ENABLE) \ || ((__VALUE__) == FL_DISABLE)) #define IS_FL_ATIM_OC_FASTMODE(__VALUE__) (((__VALUE__) == FL_ENABLE) \ || ((__VALUE__) == FL_DISABLE)) #define IS_FL_ATIM_OC_PRELOAD(__VALUE__) (((__VALUE__) == FL_ENABLE) \ || ((__VALUE__) == FL_DISABLE)) #define IS_FL_ATIM_OC_ETR_CLEARN(__VALUE__) (((__VALUE__) == FL_ENABLE) \ || ((__VALUE__) == FL_DISABLE)) #define IS_FL_ATIM_OCN_STATE(__VALUE__) (((__VALUE__) == FL_ENABLE)\ || ((__VALUE__) == FL_DISABLE)) #define IS_FL_ATIM_OC_STATE(__VALUE__) (((__VALUE__) == FL_ENABLE)\ || ((__VALUE__) == FL_DISABLE)) #define IS_FL_ATIM_OC_IDLESTATE(__VALUE__) (((__VALUE__) == FL_ATIM_OC_IDLE_STATE_LOW) \ || ((__VALUE__) == FL_ATIM_OC_IDLE_STATE_HIGH)) #define IS_FL_ATIM_OC_NIDLESTATE(__VALUE__) (((__VALUE__) == FL_ATIM_OCN_IDLE_STATE_LOW) \ || ((__VALUE__) == FL_ATIM_OCN_IDLE_STATE_HIGH)) #define IS_FL_ATIM_OC_NPOLARITY(__VALUE__) (((__VALUE__) == FL_ATIM_OCN_POLARITY_NORMAL) \ || ((__VALUE__) == FL_ATIM_OCN_POLARITY_INVERT)) #define IS_FL_ATIM_BDTR_FILTER(__VALUE__) (((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV1) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV1_N2) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV1_N4) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV1_N8) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV2_N6) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV2_N8) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV4_N6) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV4_N8) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV8_N6) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV8_N8) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV16_N5) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV16_N6) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV16_N8) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV32_N5) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV32_N6) \ || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV32_N8)) #define IS_FL_ATIM_OSSR_STATE(__VALUE__) (((__VALUE__) == FL_ATIM_OSSR_DISABLE) \ || ((__VALUE__) == FL_ATIM_OSSR_ENABLE)) #define IS_FL_ATIM_OSSI_STATE(__VALUE__) (((__VALUE__) == FL_ATIM_OSSI_DISABLE) \ || ((__VALUE__) == FL_ATIM_OSSI_ENABLE)) #define IS_FL_ATIM_LOCK_LEVEL(__VALUE__) (((__VALUE__) == FL_ATIM_LOCK_LEVEL_OFF) \ || ((__VALUE__) == FL_ATIM_LOCK_LEVEL_1) \ || ((__VALUE__) == FL_ATIM_LOCK_LEVEL_2) \ || ((__VALUE__) == FL_ATIM_LOCK_LEVEL_3)) #define IS_FL_ATIM_BREAK_POLARITY(__VALUE__) (((__VALUE__) == FL_ATIM_BREAK_POLARITY_LOW) \ || ((__VALUE__) == FL_ATIM_BREAK_POLARITY_HIGH)) #define IS_FL_ATIM_AUTOMATIC_OUTPUT_STATE(__VALUE__) (((__VALUE__) == FL_DISABLE) \ || ((__VALUE__) == FL_ENABLE)) #define IS_FL_ATIM_TRIGGER_DELAY(__VALUE__) (((__VALUE__) == FL_DISABLE) \ || ((__VALUE__) == FL_ENABLE)) #define IS_FL_ATIM_IC_CAPTURE_STATE(__VALUE__) (((__VALUE__) == FL_DISABLE) \ || ((__VALUE__) == FL_ENABLE)) /** * @} */ /* Private function prototypes -----------------------------------------------*/ /** @defgroup TIM_FL_Private_Functions TIM Private Functions * @{ */ static FL_ErrorStatus OCConfig(ATIM_Type *TIMx, uint32_t Channel, FL_ATIM_OC_InitTypeDef *TIM_OC_InitStruct); /** * @} */ /* Exported functions --------------------------------------------------------*/ /** @addtogroup TIM_FL_EF_Init * @{ */ /** * @brief 复位对应ATIMx寄存器. * @param ATIMx * @retval ErrorStatus枚举值: * -FL_PASS 外设寄存器值恢复复位值 * -FL_FAIL 未成功执行 */ FL_ErrorStatus FL_ATIM_DeInit(ATIM_Type *TIMx) { FL_ErrorStatus result = FL_PASS; /* Check the parameters */ assert_param(IS_ATIM_INSTANCE(TIMx)); /* 使能外设复位 */ FL_RMU_EnablePeripheralReset(RMU); /* 复位ATIM外设寄存器 */ FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_ATIM); FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_ATIM); /* 关闭外设总线始时钟和工作时钟 */ FL_CMU_DisableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_ATIM); FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_ATIM); /* 锁定外设复位 */ FL_RMU_DisablePeripheralReset(RMU); return result; } /** * @brief 配置基本定时器时基单元(内部时钟源). * @param TIMx Timer Instance * @param TIM_InitStruct 指向一个 @ref FL_ATIM_InitTypeDef(时基配置结构体) * @retval ErrorStatus枚举值 * -FL_FAIL 配置过程发生错误 * -FL_PASS 成功 */ FL_ErrorStatus FL_ATIM_Init(ATIM_Type *TIMx, FL_ATIM_InitTypeDef *TIM_InitStruct) { uint32_t i = 5; /* 参数检查 */ assert_param(IS_ATIM_INSTANCE(TIMx)); assert_param(IS_FL_ATIM_COUNTERMODE(TIM_InitStruct->counterMode)); assert_param(IS_FL_ATIM_CLOCKDIVISION(TIM_InitStruct->clockDivision)); assert_param(IS_FL_ATIM_AUTORELOAB_STATE(TIM_InitStruct->autoReloadState)); assert_param(IS_ATIM_CLKSRC(TIM_InitStruct->clockSource)); /* 时钟总线使能配置 */ FL_CMU_SetATIMClockSource(TIM_InitStruct->clockSource); FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_ATIM); FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_ATIM); /* 设置重复计数值 */ FL_ATIM_WriteRepetitionCounter(TIMx, TIM_InitStruct->repetitionCounter); /* 计数器计数模式配置 */ switch(TIM_InitStruct->counterMode) { /* 中心对称模式 */ case FL_ATIM_COUNTER_ALIGNED_CENTER_DOWN : case FL_ATIM_COUNTER_ALIGNED_CENTER_UP : case FL_ATIM_COUNTER_ALIGNED_CENTER_UP_DOWN: FL_ATIM_SetCounterDirection(TIMx, FL_ATIM_COUNTER_DIR_UP); FL_ATIM_SetCounterAlignedMode(TIMx, TIM_InitStruct->counterMode); break; default: /* 边沿模式 */ FL_ATIM_SetCounterDirection(TIMx, TIM_InitStruct->counterMode); FL_ATIM_SetCounterAlignedMode(TIMx, FL_ATIM_COUNTER_ALIGNED_EDGE); break; } /* 自动重装载值 */ FL_ATIM_WriteAutoReload(TIMx, TIM_InitStruct->autoReload); /* 定时器分频系数与数字滤波器所使用的采样时钟分频比 */ FL_ATIM_SetClockDivision(TIMx, TIM_InitStruct->clockDivision); /* 时钟分频 */ FL_ATIM_WritePrescaler(TIMx, TIM_InitStruct->prescaler); /* 预装载配置 */ if(TIM_InitStruct->autoReloadState == FL_ENABLE) { FL_ATIM_EnableARRPreload(TIMx); } else { FL_ATIM_DisableARRPreload(TIMx); } /* 手动触发更新事件,将配置值写入 */ FL_ATIM_GenerateUpdateEvent(TIMx); while((!FL_ATIM_IsActiveFlag_Update(ATIM)) && i) { i--; } /*清除UIF标志,防止产生UG事件中断*/ FL_ATIM_ClearFlag_Update(ATIM); return FL_PASS; } /** * @brief 设置 FL_ATIM_InitTypeDef 为默认配置 * @param TIM_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ATIM_InitTypeDef 结构体 * * @retval None */ void FL_ATIM_StructInit(FL_ATIM_InitTypeDef *TIM_InitStruct) { /* Set the default configuration */ TIM_InitStruct->clockSource = FL_CMU_ATIM_CLK_SOURCE_APBCLK; TIM_InitStruct->prescaler = (uint16_t)0x0000; TIM_InitStruct->counterMode = FL_ATIM_COUNTER_DIR_UP; TIM_InitStruct->autoReload = 0xFFFFU; TIM_InitStruct->clockDivision = FL_ATIM_CLK_DIVISION_DIV1; TIM_InitStruct->repetitionCounter = 0; TIM_InitStruct->autoReloadState = FL_DISABLE; } /** * @brief 配置基本定时器从模式,包括编码器模式. * @param TIMx Timer Instance * @param TIM_InitStruct 指向一个 @ref FL_ATIM_SlaveInitTypeDef 结构体 * @retval ErrorStatus枚举值 * -FL_FAIL 配置过程发生错误 * -FL_PASS 成功 */ FL_ErrorStatus FL_ATIM_SlaveMode_Init(ATIM_Type *TIMx, FL_ATIM_SlaveInitTypeDef *TIM_InitStruct) { /* 参数检查 */ assert_param(IS_ATIM_INSTANCE(TIMx)); assert_param(IS_FL_ATIM_TRIGGER_DELAY(TIM_InitStruct->triggerDelay)); assert_param(IS_FL_ATIM_TRIGGER_SRC(TIM_InitStruct->triggerSrc)); assert_param(IS_FL_ATIM_SLAVE_MODE(TIM_InitStruct->slaveMode)); /* 时钟总线使能配置 */ FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_ATIM); FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_ATIM); /* 触发延迟默认关闭 */ FL_ATIM_DisableMasterSlaveMode(TIMx); /* 关闭从模式以能写入TS */ FL_ATIM_SetSlaveMode(TIMx, 0); /* 从模式输入源选择 */ FL_ATIM_SetTriggerInput(TIMx, TIM_InitStruct->triggerSrc); /* 从模式选择 */ FL_ATIM_SetSlaveMode(TIMx, TIM_InitStruct->slaveMode); /* 触发延迟默认关闭 */ if(TIM_InitStruct->triggerDelay == FL_ENABLE) { FL_ATIM_EnableMasterSlaveMode(TIMx); } return FL_PASS; } /** * @brief 设置 FL_ATIM_SlaveInitTypeDef 为默认配置 * @param TIM_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ATIM_SlaveInitTypeDef 结构体 * * @retval None */ void FL_ATIM_SlaveModeStructInit(FL_ATIM_SlaveInitTypeDef *TIM_InitStruct) { TIM_InitStruct->slaveMode = FL_ATIM_SLAVE_MODE_PROHIBITED; TIM_InitStruct->triggerSrc = FL_ATIM_TRGI_TI1FP1; TIM_InitStruct->triggerDelay = FL_DISABLE; } /** * @brief 配置TIM的输入捕获通道. * @param TIMx Timer Instance * @param Channel This parameter can be one of the following values: * @arg @ref FL_ATIM_CHANNEL_0 * @arg @ref FL_ATIM_CHANNEL_1 * @arg @ref FL_ATIM_CHANNEL_2 * @arg @ref FL_ATIM_CHANNEL_3 * @param TIM_IC_InitStruct 指向一个 @ref FL_ATIM_IC_InitTypeDef 结构体 * @retval TIM_OC_InitStruct pointer to a @ref FL_ATIM_OC_InitTypeDef structure * -FL_FAIL 配置过程发生错误 * -FL_PASS 成功 */ FL_ErrorStatus FL_ATIM_IC_Init(ATIM_Type *TIMx, uint32_t channel, FL_ATIM_IC_InitTypeDef *IC_InitStruct) { /* 参数检查 */ assert_param(IS_FL_ATIM_CHANNEL(channel)); assert_param(IS_FL_ATIM_IC_CAPTURE_STATE(IC_InitStruct->captureState)); assert_param(IS_FL_ATIM_IC_POLARITY(IC_InitStruct->ICPolarity)); assert_param(IS_FL_ATIM_IC_ACTIVEINPUT(IC_InitStruct->ICActiveInput)); assert_param(IS_FL_ATIM_IC_PRESCALER(IC_InitStruct->ICPrescaler)); assert_param(IS_FL_ATIM_IC_FILTER(IC_InitStruct->ICFilter)); /* 时钟总线使能配置 */ FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_ATIM); FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_ATIM); /* 通道关闭 */ FL_ATIM_OC_DisableChannel(TIMx, channel); /*捕获极性 */ FL_ATIM_IC_SetChannelPolarity(TIMx, IC_InitStruct->ICPolarity, channel); /* 捕获映射通道 */ FL_ATIM_CC_SetChannelMode(TIMx, IC_InitStruct->ICActiveInput, channel); /* 捕获预分频 */ FL_ATIM_IC_SetPrescaler(TIMx, IC_InitStruct->ICPrescaler, channel); /* 捕获滤波器 */ FL_ATIM_IC_SetFilter(TIMx, IC_InitStruct->ICFilter, channel); if(IC_InitStruct->captureState == FL_ENABLE) { FL_ATIM_IC_EnableChannel(TIMx, channel); } return FL_PASS; } /** * @brief 设置 FL_ATIM_IC_InitTypeDef 为默认配置 * @param TIM_ICInitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ATIM_IC_InitTypeDef 结构体 * * @retval None */ void FL_ATIM_IC_StructInit(FL_ATIM_IC_InitTypeDef *TIM_ICInitStruct) { /* 默认配置 */ TIM_ICInitStruct->ICPolarity = FL_ATIM_IC_POLARITY_NORMAL; TIM_ICInitStruct->ICActiveInput = FL_ATIM_CHANNEL_MODE_INPUT_NORMAL; TIM_ICInitStruct->ICPrescaler = FL_ATIM_IC_PSC_DIV1; TIM_ICInitStruct->ICFilter = FL_ATIM_IC_FILTER_DIV1; TIM_ICInitStruct->captureState = FL_DISABLE; } /** * @brief 配置TIM触发输入捕获通道ETR. * @param TIMx Timer Instance * @param ETPolarity 极性 * @param ETPrescaler 分频 * @param ETR_Filter 滤波 * @param TIM_IC_InitStruct 指向一个 @ref FL_ATIM_IC_InitTypeDef 结构体 * @retval TIM_OC_InitStruct pointer to a @ref FL_ATIM_OC_InitTypeDef structure * -FL_FAIL 配置过程发生错误 * -FL_PASS 成功 */ FL_ErrorStatus FL_ATIM_ETR_Init(ATIM_Type *TIMx, FL_ATIM_ETR_InitTypeDef *TIM_InitStruct) { assert_param(IS_FL_ATIM_ETP_FILTER(TIM_InitStruct->ETRFilter)); assert_param(IS_FL_ATIM_ETR_PSC(TIM_InitStruct->ETRClockDivision)); assert_param(IS_FL_ATIM_ETR_POLARITY(TIM_InitStruct->ETRPolarity)); /* 时钟总线使能配置 */ FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_ATIM); FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_ATIM); /* 外部时钟极性 */ FL_ATIM_SetETRPolarity(TIMx, TIM_InitStruct->ETRPolarity); /* 外部时钟滤波 */ FL_ATIM_SetETRFilter(TIMx, TIM_InitStruct->ETRFilter); /* 外部时钟分频 */ FL_ATIM_SetETRPrescaler(TIMx, TIM_InitStruct->ETRClockDivision); if(TIM_InitStruct->useExternalTrigger == FL_ENABLE) { FL_ATIM_EnableExternalClock(TIMx); } else { FL_ATIM_DisableExternalClock(TIMx); } return FL_PASS; } void FL_ATIM_ETRStructInit(FL_ATIM_ETR_InitTypeDef *TIM_InitStruct) { TIM_InitStruct->useExternalTrigger = FL_DISABLE; TIM_InitStruct->ETRFilter = FL_ATIM_ETR_FILTER_DIV1; TIM_InitStruct->ETRPolarity = FL_ATIM_ETR_POLARITY_NORMAL; TIM_InitStruct->ETRClockDivision = FL_ATIM_ETR_PSC_DIV1; } /** * @brief 配置 * @param TIMx Timer Instance * @param Channel This parameter can be one of the following values: * @arg @ref FL_ATIM_CHANNEL_1 * @arg @ref FL_ATIM_CHANNEL_2 * @arg @ref FL_ATIM_CHANNEL_3 * @arg @ref FL_ATIM_CHANNEL_4 * @param TIM_ICInitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ATIM_IC_InitTypeDef 结构体包含配置参数. * @retval None * -FL_FAIL 配置过程发生错误 * -FL_PASS 成功 */ static FL_ErrorStatus OCConfig(ATIM_Type *TIMx, uint32_t channel, FL_ATIM_OC_InitTypeDef *TIM_OC_InitStruct) { FL_ErrorStatus result = FL_PASS; /* 配置比较输出通道模式 */ FL_ATIM_OC_SetMode(TIMx, TIM_OC_InitStruct->OCMode, channel); /* 配置TRF清零使能 */ if(TIM_OC_InitStruct->OCETRFStatus == FL_ENABLE) { FL_ATIM_OC_EnableClear(TIMx, channel); } else { FL_ATIM_OC_DisableClear(TIMx, channel); } /* 比较输出通道快速模式 */ if(TIM_OC_InitStruct->OCFastMode == FL_ENABLE) { FL_ATIM_OC_EnableFastMode(TIMx, channel); } else { FL_ATIM_OC_DisableFastMode(TIMx, channel); } /* 比较输出通道缓冲模式 */ if(TIM_OC_InitStruct->OCPreload == FL_ENABLE) { FL_ATIM_OC_EnablePreload(TIMx, channel); } else { FL_ATIM_OC_DisablePreload(TIMx, channel); } if(TIM_OC_InitStruct->OCNState == FL_ENABLE) { FL_ATIM_OC_EnableReverseChannel(TIMx, channel); } else { FL_ATIM_OC_DisableReverseChannel(TIMx, channel); } if(TIM_OC_InitStruct->OCState == FL_ENABLE) { /* 通道使能 */ FL_ATIM_OC_EnableChannel(TIMx, channel); } else { FL_ATIM_OC_DisableChannel(TIMx, channel); } /* 设置比较值 */ switch(channel) { case FL_ATIM_CHANNEL_1: FL_ATIM_WriteCompareCH1(TIMx, TIM_OC_InitStruct->compareValue); break; case FL_ATIM_CHANNEL_2: FL_ATIM_WriteCompareCH2(TIMx, TIM_OC_InitStruct->compareValue); break; case FL_ATIM_CHANNEL_3: FL_ATIM_WriteCompareCH3(TIMx, TIM_OC_InitStruct->compareValue); break; case FL_ATIM_CHANNEL_4: FL_ATIM_WriteCompareCH4(TIMx, TIM_OC_InitStruct->compareValue); break; default : result = FL_FAIL; break; } return result; } /** * @brief 配置TIM的比较输出通道. * @param TIMx Timer Instance * @param Channel This parameter can be one of the following values: * @arg @ref FL_ATIM_CHANNEL_1 * @arg @ref FL_ATIM_CHANNEL_2 * @arg @ref FL_ATIM_CHANNEL_3 * @arg @ref FL_ATIM_CHANNEL_4 * @retval TIM_OC_InitStruct pointer to a @ref FL_ATIM_OC_InitTypeDef structure * -FL_FAIL 配置过程发生错误 * -FL_PASS 成功 */ FL_ErrorStatus FL_ATIM_OC_Init(ATIM_Type *TIMx, uint32_t channel, FL_ATIM_OC_InitTypeDef *TIM_OC_InitStruct) { uint32_t i = 5; FL_ErrorStatus result = FL_PASS; /* 参数检查 */ assert_param(IS_ATIM_INSTANCE(TIMx)); assert_param(IS_FL_ATIM_OC_MODE(TIM_OC_InitStruct->OCMode)); assert_param(IS_FL_ATIM_OC_PRELOAD(TIM_OC_InitStruct->OCPreload)); assert_param(IS_FL_ATIM_OC_POLARITY(TIM_OC_InitStruct->OCPolarity)); assert_param(IS_FL_ATIM_OC_FASTMODE(TIM_OC_InitStruct->OCFastMode)); assert_param(IS_FL_ATIM_OC_ETR_CLEARN(TIM_OC_InitStruct->OCETRFStatus)); assert_param(IS_FL_ATIM_OCN_STATE(TIM_OC_InitStruct->OCNState)); assert_param(IS_FL_ATIM_OC_STATE(TIM_OC_InitStruct->OCState)); assert_param(IS_FL_ATIM_OC_IDLESTATE(TIM_OC_InitStruct->OCIdleState)); assert_param(IS_FL_ATIM_OC_NIDLESTATE(TIM_OC_InitStruct->OCNIdleState)); assert_param(IS_FL_ATIM_OC_NPOLARITY(TIM_OC_InitStruct->OCNPolarity)); /* 通道关闭 */ FL_ATIM_OC_DisableChannel(TIMx, channel); FL_ATIM_OC_DisableReverseChannel(TIMx, channel); /* 通道极性 */ FL_ATIM_OC_SetChannelPolarity(TIMx, TIM_OC_InitStruct->OCPolarity, channel); /* 通道空闲电平 */ FL_ATIM_OC_SetChannelIdleState(TIMx, TIM_OC_InitStruct->OCIdleState, channel); /* 互补通道空闲电平 */ FL_ATIM_OC_SetReverseChannelIdleState(TIMx, TIM_OC_InitStruct->OCNIdleState, channel); /* 互补通道极性 */ FL_ATIM_OC_SetReverseChannelPolarity(TIMx, TIM_OC_InitStruct->OCNPolarity, channel); /* 捕获映射到输出通道 */ FL_ATIM_CC_SetChannelMode(TIMx, FL_ATIM_CHANNEL_MODE_OUTPUT, channel); /* 输出比较模式寄存器配置 */ OCConfig(TIMx, channel, TIM_OC_InitStruct); /* 手动触发更新事件,将配置值写入 */ FL_ATIM_GenerateUpdateEvent(TIMx); while((!FL_ATIM_IsActiveFlag_Update(ATIM)) && i) { i--; } /*清除UIF标志,防止产生UG事件中断*/ FL_ATIM_ClearFlag_Update(ATIM); return result; } /** * @brief 设置 FL_ATIM_OC_InitTypeDef 为默认配置 * @param TIM_OC_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ATIM_OC_InitTypeDef 结构体 * * @retval None */ void FL_ATIM_OC_StructInit(FL_ATIM_OC_InitTypeDef *TIM_OC_InitStruct) { /* Set the default configuration */ TIM_OC_InitStruct->OCMode = FL_ATIM_OC_MODE_FROZEN; TIM_OC_InitStruct->OCETRFStatus = FL_DISABLE; TIM_OC_InitStruct->OCFastMode = FL_DISABLE; TIM_OC_InitStruct->compareValue = 0x00000000U; TIM_OC_InitStruct->OCPolarity = FL_ATIM_OC_POLARITY_NORMAL; TIM_OC_InitStruct->OCPreload = FL_DISABLE; TIM_OC_InitStruct->OCIdleState = FL_ATIM_OC_IDLE_STATE_LOW; TIM_OC_InitStruct->OCNIdleState = FL_ATIM_OCN_IDLE_STATE_LOW; TIM_OC_InitStruct->OCNPolarity = FL_ATIM_OCN_POLARITY_NORMAL; TIM_OC_InitStruct->OCNState = FL_DISABLE; } /** * @brief 配置TIM的输入捕获通道. * @param TIMx Timer Instance * @param TIM_IC_InitStruct 指向一个 @ref FL_ATIM_IC_InitTypeDef 结构体 * @retval TIM_OC_InitStruct pointer to a @ref FL_ATIM_OC_InitTypeDef structure * -FL_FAIL 配置过程发生错误 * -FL_PASS 成功 */ FL_ErrorStatus FL_ATIM_BDTR_Init(ATIM_Type *TIMx, FL_ATIM_BDTR_InitTypeDef *TIM_BDTR_InitStruct) { FL_ErrorStatus result = FL_PASS; /* 参数检查 */ assert_param(IS_ATIM_INSTANCE(TIMx)); assert_param(IS_FL_ATIM_OSSR_STATE(TIM_BDTR_InitStruct->OSSRState)); assert_param(IS_FL_ATIM_OSSI_STATE(TIM_BDTR_InitStruct->OSSIState)); assert_param(IS_FL_ATIM_LOCK_LEVEL(TIM_BDTR_InitStruct->lockLevel)); assert_param(IS_FL_ATIM_BREAK_POLARITY(TIM_BDTR_InitStruct->breakPolarity)); assert_param(IS_FL_ATIM_AUTOMATIC_OUTPUT_STATE(TIM_BDTR_InitStruct->automaticOutput)); assert_param(IS_FL_ATIM_BDTR_FILTER(TIM_BDTR_InitStruct->breakFilter)); /* 关闭所有输出 */ FL_ATIM_DisableALLOutput(TIMx); /* 设置死区时间 */ FL_ATIM_WriteDeadTime(TIMx, TIM_BDTR_InitStruct->deadTime); /* 设置寄存器锁定等级 */ FL_ATIM_SetLockLevel(TIMx, TIM_BDTR_InitStruct->lockLevel); /* Idle状态下关闭状态 */ FL_ATIM_SetOffStateIdle(TIMx, TIM_BDTR_InitStruct->OSSIState); /* run状态下关闭状态 */ FL_ATIM_SetOffStateRun(TIMx, TIM_BDTR_InitStruct->OSSRState); /* 门控1刹车信号 */ FL_ATIM_SetBreak1GateState(TIMx, TIM_BDTR_InitStruct->gatedBrakeSignal_1); /* 门控2刹车信号 */ FL_ATIM_SetBreak2GateState(TIMx, TIM_BDTR_InitStruct->gatedBrakeSignal_2); /* 门控刹车信号组合方式设置 */ FL_ATIM_SetBreakSignalCombination(TIMx, TIM_BDTR_InitStruct->brakeSignalCombined); /* 刹车极性设置 */ FL_ATIM_SetBreakPolarity(TIMx, TIM_BDTR_InitStruct->breakPolarity); /* 更新时间自动设置输出配置,如果刹车事件发生过并且当前功能使能,则下一个更新事件将重新自动输出 */ if(TIM_BDTR_InitStruct->automaticOutput == FL_ENABLE) { FL_ATIM_EnableAutomaticOutput(TIMx); } else { FL_ATIM_DisableAutomaticOutput(TIMx); } /* 刹车功能开关配置 */ if(TIM_BDTR_InitStruct->breakState == FL_ENABLE) { FL_ATIM_EnableBreak(TIMx); } else { FL_ATIM_DisableBreak(TIMx); } /* 使能全部输出 */ FL_ATIM_EnableALLOutput(TIMx); return result; } /** * @brief 设置 FL_ATIM_IC_InitTypeDef 为默认配置 * @param TIM_ICInitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ATIM_IC_InitTypeDef 结构体 * * @retval None */ void FL_ATIM_BDTR_StructInit(FL_ATIM_BDTR_InitTypeDef *TIM_BDTR_InitStruct) { TIM_BDTR_InitStruct->deadTime = 0x00; TIM_BDTR_InitStruct->lockLevel = FL_ATIM_LOCK_LEVEL_OFF; TIM_BDTR_InitStruct->OSSRState = FL_ATIM_OSSR_DISABLE; TIM_BDTR_InitStruct->OSSIState = FL_ATIM_OSSI_DISABLE; TIM_BDTR_InitStruct->breakFilter = FL_ATIM_BREAK_FILTER_DIV1; TIM_BDTR_InitStruct->breakPolarity = FL_ATIM_BREAK_POLARITY_LOW; TIM_BDTR_InitStruct->automaticOutput = FL_DISABLE; TIM_BDTR_InitStruct->gatedBrakeSignal_1 = FL_ATIM_BREAK1_GATE_AUTO; TIM_BDTR_InitStruct->gatedBrakeSignal_2 = FL_ATIM_BREAK2_GATE_AUTO; TIM_BDTR_InitStruct->breakState = FL_DISABLE; TIM_BDTR_InitStruct->brakeSignalCombined = FL_ATIM_BREAK_COMBINATION_OR; } /** * @} */ #endif /* FL_ATIM_DRIVER_ENABLED */ /** * @} */ /** * @} */ /*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/