642 lines
27 KiB
C
642 lines
27 KiB
C
|
|
/**
|
|||
|
|
*******************************************************************************************************
|
|||
|
|
* @file fm33lg0xx_fl_gptim.c
|
|||
|
|
* @author FMSH Application Team
|
|||
|
|
* @brief Src file of GPTIM 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 GPTIM
|
|||
|
|
* @{
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#ifdef FL_GPTIM_DRIVER_ENABLED
|
|||
|
|
|
|||
|
|
/* Private macros ------------------------------------------------------------*/
|
|||
|
|
/** @addtogroup GPTIM_FL_Private_Macros
|
|||
|
|
* @{
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#define IS_GPTIM_INSTANCE(TIMx) (((TIMx) == GPTIM0) || \
|
|||
|
|
((TIMx) == GPTIM1) || \
|
|||
|
|
((TIMx) == GPTIM2))
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_COUNTERMODE(__VALUE__) (((__VALUE__) == FL_GPTIM_COUNTER_DIR_UP) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_COUNTER_DIR_DOWN) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_COUNTER_ALIGNED_EDGE) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_COUNTER_ALIGNED_CENTER_UP) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_COUNTER_ALIGNED_CENTER_DOWN) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_COUNTER_ALIGNED_CENTER_UP_DOWN))
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_CLOCKDIVISION(__VALUE__) (((__VALUE__) == FL_GPTIM_CLK_DIVISION_DIV1) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_CLK_DIVISION_DIV2) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_CLK_DIVISION_DIV4))
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_CHANNEL_MODE(__VALUE__) (((__VALUE__) == FL_GPTIM_CHANNEL_MODE_OUTPUT) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_CHANNEL_MODE_INPUT_NORMAL) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_CHANNEL_MODE_INPUT_CROSSOVER) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_CHANNEL_MODE_INPUT_TRC))
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_IC_FILTER(__VALUE__) (((__VALUE__) == FL_GPTIM_IC_FILTER_DIV1) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV1_N2) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV1_N4) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV1_N8) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV2_N6) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV2_N8) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV4_N6) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV4_N8) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV8_N6) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV8_N8) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV16_N5) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV16_N6) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV16_N8) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV32_N5) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV32_N6) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_IC_FILTER_DIV32_N8))
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_CHANNEL(__VALUE__) (((__VALUE__) == FL_GPTIM_CHANNEL_1)\
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_CHANNEL_2)\
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_CHANNEL_3)\
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_CHANNEL_4))
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_SLAVE_MODE(__VALUE__) (((__VALUE__) == FL_GPTIM_SLAVE_MODE_PROHIBITED)\
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_SLAVE_MODE_ENCODER_X2_TI1)\
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_SLAVE_MODE_ENCODER_X2_TI2)\
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_SLAVE_MODE_ENCODER_X4_TI1TI2)\
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_SLAVE_MODE_TRGI_RISE_RST)\
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_SLAVE_MODE_TRGI_HIGH_RUN)\
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_SLAVE_MODE_TRGI_RISE_RUN)\
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_SLAVE_MODE_TRGI_CLK))
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_TRIGGER_SRC(__VALUE__) (((__VALUE__) ==FL_GPTIM_TIM_TS_ITR0 )\
|
|||
|
|
||((__VALUE__) ==FL_GPTIM_TIM_TS_ITR1 )\
|
|||
|
|
||((__VALUE__) ==FL_GPTIM_TIM_TS_ITR2)\
|
|||
|
|
||((__VALUE__) ==FL_GPTIM_TIM_TS_ITR3)\
|
|||
|
|
||((__VALUE__) ==FL_GPTIM_TIM_TS_TI1F_ED)\
|
|||
|
|
||((__VALUE__) ==FL_GPTIM_TIM_TS_TI1FP1)\
|
|||
|
|
||((__VALUE__) ==FL_GPTIM_TIM_TS_TI2FP2)\
|
|||
|
|
||((__VALUE__) ==FL_GPTIM_TIM_TS_ETRF))
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_ETR_FILTER(__VALUE__) (((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV1) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV1_N2) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV1_N4) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV1_N8) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV2_N6) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV2_N8) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV4_N6) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV4_N8) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV8_N6) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV8_N8) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV16_N5) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV16_N6) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV16_N8) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV32_N5) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV32_N6) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV32_N8))
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_ETR_PSC(__VALUE__) (((__VALUE__) == FL_GPTIM_ETR_PSC_DIV1) ||\
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_PSC_DIV2) ||\
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_PSC_DIV4) ||\
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_PSC_DIV8))
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_ETR_POLARITY(__VALUE__) (((__VALUE__) == FL_GPTIM_ETR_POLARITY_NORMAL) || \
|
|||
|
|
((__VALUE__) == FL_GPTIM_ETR_POLARITY_INVERT))
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_IC_POLARITY(__VALUE__) (((__VALUE__) == FL_GPTIM_IC_POLARITY_NORMAL) \
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_IC_POLARITY_INVERT))
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_IC_PSC(__VALUE__) (((__VALUE__) == FL_GPTIM_IC_PSC_DIV1) \
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_IC_PSC_DIV2) \
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_IC_PSC_DIV4) \
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_IC_PSC_DIV8))
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_OC_POLARITY(__VALUE__) (((__VALUE__) == FL_GPTIM_OC_POLARITY_NORMAL) \
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_OC_POLARITY_INVERT))
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_OC_MODE(__VALUE__) (((__VALUE__) == FL_GPTIM_OC_MODE_FROZEN) \
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_OC_MODE_ACTIVE) \
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_OC_MODE_INACTIVE) \
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_OC_MODE_TOGGLE) \
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_OC_MODE_FORCED_INACTIVE) \
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_OC_MODE_FORCED_ACTIVE) \
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_OC_MODE_PWM1) \
|
|||
|
|
|| ((__VALUE__) == FL_GPTIM_OC_MODE_PWM2))
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_OC_FASTMODE(__VALUE__) (((__VALUE__) == FL_ENABLE) \
|
|||
|
|
|| ((__VALUE__) == FL_DISABLE))
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_OC_PRELOAD(__VALUE__) (((__VALUE__) == FL_ENABLE) \
|
|||
|
|
|| ((__VALUE__) == FL_DISABLE))
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_OC_ETR_CLEARN(__VALUE__) (((__VALUE__) == FL_ENABLE) \
|
|||
|
|
|| ((__VALUE__) == FL_DISABLE))
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_TRIGGER_DELAY(__VALUE__) (((__VALUE__) == FL_DISABLE) \
|
|||
|
|
|| ((__VALUE__) == FL_ENABLE))
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define IS_FL_GPTIM_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(GPTIM_Type *TIMx, uint32_t Channel, FL_GPTIM_OC_InitTypeDef *TIM_OC_InitStruct);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @}
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/* Exported functions --------------------------------------------------------*/
|
|||
|
|
/** @addtogroup TIM_FL_EF_Init
|
|||
|
|
* @{
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 复位对应GPTIMx寄存器.
|
|||
|
|
* @param GPTIMx
|
|||
|
|
* @retval ErrorStatus枚举值:
|
|||
|
|
* -FL_PASS 外设寄存器值恢复复位值
|
|||
|
|
* -FL_FAIL 未成功执行
|
|||
|
|
*/
|
|||
|
|
FL_ErrorStatus FL_GPTIM_DeInit(GPTIM_Type *TIMx)
|
|||
|
|
{
|
|||
|
|
FL_ErrorStatus result = FL_PASS;
|
|||
|
|
/* Check the parameters */
|
|||
|
|
assert_param(IS_GPTIM_INSTANCE(TIMx));
|
|||
|
|
/* 使能外设复位 */
|
|||
|
|
FL_RMU_EnablePeripheralReset(RMU);
|
|||
|
|
if(TIMx == GPTIM0)
|
|||
|
|
{
|
|||
|
|
/* 使能外设复位 */
|
|||
|
|
FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_GPTIM0);
|
|||
|
|
FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_GPTIM0);
|
|||
|
|
/* 关闭外设时钟 */
|
|||
|
|
FL_CMU_DisableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM0);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
if(TIMx == GPTIM1)
|
|||
|
|
{
|
|||
|
|
/* 使能外设复位 */
|
|||
|
|
FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_GPTIM1);
|
|||
|
|
FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_GPTIM1);
|
|||
|
|
/* 关闭外设时钟 */
|
|||
|
|
FL_CMU_DisableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
if(TIMx == GPTIM2)
|
|||
|
|
{
|
|||
|
|
/* 使能外设复位 */
|
|||
|
|
FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_GPTIM2);
|
|||
|
|
FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_GPTIM2);
|
|||
|
|
/* 关闭外设时钟 */
|
|||
|
|
FL_CMU_DisableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM2);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
result = FL_FAIL;
|
|||
|
|
}
|
|||
|
|
/* 锁定外设复位 */
|
|||
|
|
FL_RMU_DisablePeripheralReset(RMU);
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* @brief 配置基本定时器时基单元(内部时钟源).
|
|||
|
|
* @param TIMx Timer Instance
|
|||
|
|
* @param TIM_InitStruct 指向一个 @ref FL_GPTIM_InitTypeDef(时基配置结构体)
|
|||
|
|
* @retval ErrorStatus枚举值
|
|||
|
|
* -FL_FAIL 配置过程发生错误
|
|||
|
|
* -FL_PASS 成功
|
|||
|
|
*/
|
|||
|
|
FL_ErrorStatus FL_GPTIM_Init(GPTIM_Type *TIMx, FL_GPTIM_InitTypeDef *init)
|
|||
|
|
{
|
|||
|
|
uint32_t i = 5;
|
|||
|
|
/* 参数检查 */
|
|||
|
|
assert_param(IS_GPTIM_INSTANCE(TIMx));
|
|||
|
|
assert_param(IS_FL_GPTIM_COUNTERMODE(init->counterMode));
|
|||
|
|
assert_param(IS_FL_GPTIM_CLOCKDIVISION(init->clockDivision));
|
|||
|
|
/* 时钟总线使能配置 */
|
|||
|
|
if(TIMx == GPTIM0)
|
|||
|
|
{
|
|||
|
|
FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM0);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
if(TIMx == GPTIM1)
|
|||
|
|
{
|
|||
|
|
FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM2);
|
|||
|
|
}
|
|||
|
|
/* 计数器计数模式配置 */
|
|||
|
|
switch(init->counterMode)
|
|||
|
|
{
|
|||
|
|
/* 中心对称模式 */
|
|||
|
|
case FL_GPTIM_COUNTER_ALIGNED_CENTER_DOWN :
|
|||
|
|
case FL_GPTIM_COUNTER_ALIGNED_CENTER_UP :
|
|||
|
|
case FL_GPTIM_COUNTER_ALIGNED_CENTER_UP_DOWN:
|
|||
|
|
FL_GPTIM_SetCounterAlignedMode(TIMx, init->counterMode);
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
/* 边沿模式 */
|
|||
|
|
FL_GPTIM_SetCounterDirection(TIMx, init->counterMode);
|
|||
|
|
FL_GPTIM_SetCounterAlignedMode(TIMx, FL_GPTIM_COUNTER_ALIGNED_EDGE);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
/* 自动重装载值 */
|
|||
|
|
FL_GPTIM_WriteAutoReload(TIMx, init->autoReload);
|
|||
|
|
/* 定时器分频系数与数字滤波器所使用的采样时钟分频比 */
|
|||
|
|
FL_GPTIM_SetClockDivision(TIMx, init->clockDivision);
|
|||
|
|
/* 时钟分频 */
|
|||
|
|
FL_GPTIM_WritePrescaler(TIMx, init->prescaler);
|
|||
|
|
/* 预装载配置 */
|
|||
|
|
if(init->autoReloadState == FL_ENABLE)
|
|||
|
|
{
|
|||
|
|
FL_GPTIM_EnableARRPreload(TIMx);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
FL_GPTIM_DisableARRPreload(TIMx);
|
|||
|
|
}
|
|||
|
|
/* 手动触发更新事件,将配置值写入 */
|
|||
|
|
FL_GPTIM_GenerateUpdateEvent(TIMx);
|
|||
|
|
while((!FL_GPTIM_IsActiveFlag_Update(TIMx)) && i)
|
|||
|
|
{
|
|||
|
|
i--;
|
|||
|
|
}
|
|||
|
|
FL_GPTIM_ClearFlag_Update(TIMx);
|
|||
|
|
return FL_PASS;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置 FL_GPTIM_InitTypeDef 为默认配置
|
|||
|
|
* @param TIM_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_GPTIM_InitTypeDef 结构体
|
|||
|
|
*
|
|||
|
|
* @retval None
|
|||
|
|
*/
|
|||
|
|
void FL_GPTIM_StructInit(FL_GPTIM_InitTypeDef *TIM_InitStruct)
|
|||
|
|
{
|
|||
|
|
/* Set the default configuration */
|
|||
|
|
TIM_InitStruct->prescaler = (uint16_t)0x0000;
|
|||
|
|
TIM_InitStruct->autoReloadState = FL_DISABLE;
|
|||
|
|
TIM_InitStruct->counterMode = FL_GPTIM_COUNTER_DIR_UP;
|
|||
|
|
TIM_InitStruct->autoReload = 0xFFFFU;
|
|||
|
|
TIM_InitStruct->clockDivision = FL_GPTIM_CLK_DIVISION_DIV1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 配置基本定时器外部时钟源模式,包括编码器模式.
|
|||
|
|
* @param TIMx Timer Instance
|
|||
|
|
* @param slave_init 指向一个 @ref FL_GPTIM_SlaveInitTypeDef 结构体
|
|||
|
|
* @retval ErrorStatus枚举值
|
|||
|
|
* -FL_FAIL 配置过程发生错误
|
|||
|
|
* -FL_PASS 成功
|
|||
|
|
*/
|
|||
|
|
FL_ErrorStatus FL_GPTIM_SlaveMode_Init(GPTIM_Type *TIMx, FL_GPTIM_SlaveInitTypeDef *slave_init)
|
|||
|
|
{
|
|||
|
|
/* 参数检查 */
|
|||
|
|
assert_param(IS_GPTIM_INSTANCE(TIMx));
|
|||
|
|
assert_param(IS_FL_GPTIM_SLAVE_MODE(slave_init->slaveMode));
|
|||
|
|
assert_param(IS_FL_GPTIM_TRIGGER_SRC(slave_init->triggerSrc));
|
|||
|
|
assert_param(IS_FL_GPTIM_TRIGGER_DELAY(slave_init->triggerDelay));
|
|||
|
|
/* 时钟总线使能配置 */
|
|||
|
|
if(TIMx == GPTIM0)
|
|||
|
|
{
|
|||
|
|
FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM0);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
if(TIMx == GPTIM1)
|
|||
|
|
{
|
|||
|
|
FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM2);
|
|||
|
|
}
|
|||
|
|
/* 触发延迟默认关闭 */
|
|||
|
|
FL_GPTIM_DisableMasterSlaveMode(TIMx);
|
|||
|
|
/* 关闭从模式以能写入TS */
|
|||
|
|
FL_GPTIM_SetSlaveMode(TIMx, 0);
|
|||
|
|
/* 从模式输入源选择 */
|
|||
|
|
FL_GPTIM_SetTriggerInput(TIMx, slave_init->triggerSrc);
|
|||
|
|
/* ITRx 输入源选择 */
|
|||
|
|
if(slave_init->triggerSrc <= FL_GPTIM_TIM_TS_ITR3)
|
|||
|
|
{
|
|||
|
|
/* 内部触发ITRx源选择 */
|
|||
|
|
FL_GPTIM_SetITRInput(TIMx, (1U << (slave_init->triggerSrc >> GPTIM_SMCR_TS_Pos)), slave_init->ITRSourceGroup);
|
|||
|
|
}
|
|||
|
|
/* 从模式选择 */
|
|||
|
|
FL_GPTIM_SetSlaveMode(TIMx, slave_init->slaveMode);
|
|||
|
|
/* 触发延迟默认关闭 */
|
|||
|
|
if(slave_init->triggerDelay == FL_ENABLE)
|
|||
|
|
{
|
|||
|
|
FL_GPTIM_EnableMasterSlaveMode(TIMx);
|
|||
|
|
}
|
|||
|
|
return FL_PASS;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置 FL_GPTIM_SlaveInitTypeDef 为默认配置
|
|||
|
|
* @param TIM_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_GPTIM_SlaveInitTypeDef 结构体
|
|||
|
|
*
|
|||
|
|
* @retval None
|
|||
|
|
*/
|
|||
|
|
void FL_GPTIM_SlaveMode_StructInit(FL_GPTIM_SlaveInitTypeDef *slave_init)
|
|||
|
|
{
|
|||
|
|
slave_init->ITRSourceGroup = 0;
|
|||
|
|
slave_init->slaveMode = FL_GPTIM_SLAVE_MODE_PROHIBITED;
|
|||
|
|
slave_init->triggerSrc = FL_GPTIM_TIM_TS_TI1FP1;
|
|||
|
|
slave_init->triggerDelay = FL_DISABLE;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* @brief 配置TIM触发输入捕获通道ETR.
|
|||
|
|
* @param TIMx Timer Instance
|
|||
|
|
* @param ETPolarity 极性
|
|||
|
|
* @param ETPrescaler 分频
|
|||
|
|
* @param ETR_Filter 滤波
|
|||
|
|
* @param etr_init 指向一个 @ref FL_GPTIM_ETR_InitTypeDef 结构体
|
|||
|
|
* @retval ErrorStatus枚举值
|
|||
|
|
* -FL_FAIL 配置过程发生错误
|
|||
|
|
* -FL_PASS 成功
|
|||
|
|
*/
|
|||
|
|
FL_ErrorStatus FL_GPTIM_ETR_Init(GPTIM_Type *TIMx, FL_GPTIM_ETR_InitTypeDef *etr_init)
|
|||
|
|
{
|
|||
|
|
assert_param(IS_FL_GPTIM_ETR_FILTER(etr_init->ETRFilter));
|
|||
|
|
assert_param(IS_FL_GPTIM_ETR_PSC(etr_init->ETRClockDivision));
|
|||
|
|
assert_param(IS_FL_GPTIM_ETR_POLARITY(etr_init->ETRPolarity));
|
|||
|
|
/* 时钟总线使能配置 */
|
|||
|
|
if(TIMx == GPTIM0)
|
|||
|
|
{
|
|||
|
|
FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM0);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
if(TIMx == GPTIM1)
|
|||
|
|
{
|
|||
|
|
FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM2);
|
|||
|
|
}
|
|||
|
|
/* 外部时钟极性 */
|
|||
|
|
FL_GPTIM_SetETRPolarity(TIMx, etr_init->ETRPolarity);
|
|||
|
|
/* 外部时钟滤波 */
|
|||
|
|
FL_GPTIM_SetETRFilter(TIMx, etr_init->ETRFilter);
|
|||
|
|
/* 外部时钟分频 */
|
|||
|
|
FL_GPTIM_SetETRPrescaler(TIMx, etr_init->ETRClockDivision);
|
|||
|
|
if(etr_init->useExternalTrigger == FL_ENABLE)
|
|||
|
|
{
|
|||
|
|
FL_GPTIM_EnableExternalClock(TIMx);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
FL_GPTIM_DisableExternalClock(TIMx);
|
|||
|
|
}
|
|||
|
|
return FL_PASS;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置 FL_GPTIM_ETRInitTypeDef 为默认配置
|
|||
|
|
* @param etr_init 指向需要将值设置为默认配置的结构体 @ref FL_GPTIM_ETR_InitTypeDef 结构体
|
|||
|
|
*
|
|||
|
|
* @retval None
|
|||
|
|
*/
|
|||
|
|
void FL_GPTIM_ETR_StructInit(FL_GPTIM_ETR_InitTypeDef *etr_init)
|
|||
|
|
{
|
|||
|
|
etr_init->useExternalTrigger = FL_DISABLE;
|
|||
|
|
etr_init->ETRFilter = FL_GPTIM_ETR_FILTER_DIV1;
|
|||
|
|
etr_init->ETRPolarity = FL_GPTIM_ETR_POLARITY_NORMAL;
|
|||
|
|
etr_init->ETRClockDivision = FL_GPTIM_ETR_PSC_DIV1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 配置TIM的比较输出通道.
|
|||
|
|
* @param TIMx Timer Instance
|
|||
|
|
* @param Channel This parameter can be one of the following values:
|
|||
|
|
* @arg @ref FL_GPTIM_CHANNEL_0
|
|||
|
|
* @arg @ref FL_GPTIM_CHANNEL_1
|
|||
|
|
* @arg @ref FL_GPTIM_CHANNEL_2
|
|||
|
|
* @arg @ref FL_GPTIM_CHANNEL_3
|
|||
|
|
* @param oc_init 指向一个 @ref FL_GPTIM_OC_InitTypeDef 结构体
|
|||
|
|
* @retval ErrorStatus枚举值
|
|||
|
|
* -FL_FAIL 配置过程发生错误
|
|||
|
|
* -FL_PASS 成功
|
|||
|
|
*/
|
|||
|
|
FL_ErrorStatus FL_GPTIM_OC_Init(GPTIM_Type *TIMx, uint32_t channel, FL_GPTIM_OC_InitTypeDef *oc_init)
|
|||
|
|
{
|
|||
|
|
FL_ErrorStatus result = FL_PASS;
|
|||
|
|
/* 参数检查 */
|
|||
|
|
assert_param(IS_GPTIM_INSTANCE(TIMx));
|
|||
|
|
assert_param(IS_FL_GPTIM_OC_MODE(oc_init->OCMode));
|
|||
|
|
assert_param(IS_FL_GPTIM_OC_PRELOAD(oc_init->OCPreload));
|
|||
|
|
assert_param(IS_FL_GPTIM_OC_POLARITY(oc_init->OCPolarity));
|
|||
|
|
assert_param(IS_FL_GPTIM_OC_FASTMODE(oc_init->OCFastMode));
|
|||
|
|
assert_param(IS_FL_GPTIM_OC_ETR_CLEARN(oc_init->OCETRFStatus));
|
|||
|
|
/* 通道关闭 */
|
|||
|
|
FL_GPTIM_OC_DisableChannel(TIMx, channel);
|
|||
|
|
/* 通道极性 */
|
|||
|
|
FL_GPTIM_OC_SetChannelPolarity(TIMx, oc_init->OCPolarity, channel);
|
|||
|
|
/* 捕获映射到输出通道 */
|
|||
|
|
FL_GPTIM_CC_SetChannelMode(TIMx, FL_GPTIM_CHANNEL_MODE_OUTPUT, channel);
|
|||
|
|
/* 输出比较模式寄存器配置 */
|
|||
|
|
OCConfig(TIMx, channel, oc_init);
|
|||
|
|
/* 通道使能 */
|
|||
|
|
FL_GPTIM_OC_EnableChannel(TIMx, channel);
|
|||
|
|
/* 手动触发更新事件,将配置值写入 */
|
|||
|
|
FL_GPTIM_GenerateUpdateEvent(TIMx);
|
|||
|
|
FL_GPTIM_ClearFlag_Update(TIMx);
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* @brief 配置
|
|||
|
|
* @param TIMx Timer Instance
|
|||
|
|
* @param Channel This parameter can be one of the following values:
|
|||
|
|
* @arg @ref FL_GPTIM_CHANNEL_0
|
|||
|
|
* @arg @ref FL_GPTIM_CHANNEL_1
|
|||
|
|
* @arg @ref FL_GPTIM_CHANNEL_2
|
|||
|
|
* @arg @ref FL_GPTIM_CHANNEL_3
|
|||
|
|
* @param oc_init 指向需要将值设置为默认配置的结构体 @ref FL_GPTIM_OC_InitTypeDef 结构体包含配置参数.
|
|||
|
|
* @retval ErrorStatus枚举值
|
|||
|
|
* -FL_FAIL 配置过程发生错误
|
|||
|
|
* -FL_PASS 成功
|
|||
|
|
*/
|
|||
|
|
static FL_ErrorStatus OCConfig(GPTIM_Type *TIMx, uint32_t channel, FL_GPTIM_OC_InitTypeDef *oc_init)
|
|||
|
|
{
|
|||
|
|
FL_ErrorStatus result = FL_PASS;
|
|||
|
|
/* 配置比较输出通道模式 */
|
|||
|
|
FL_GPTIM_OC_SetMode(TIMx, oc_init->OCMode, channel);
|
|||
|
|
/* 配置ETRF清零使能 */
|
|||
|
|
if(oc_init->OCETRFStatus == FL_ENABLE)
|
|||
|
|
{
|
|||
|
|
FL_GPTIM_OC_EnableClear(TIMx, channel);
|
|||
|
|
}
|
|||
|
|
/* 比较输出通道快速模式 */
|
|||
|
|
if(oc_init->OCFastMode == FL_ENABLE)
|
|||
|
|
{
|
|||
|
|
FL_GPTIM_OC_EnableFastMode(TIMx, channel);
|
|||
|
|
}
|
|||
|
|
/* 比较输出通道缓冲模式 */
|
|||
|
|
if(oc_init->OCPreload == FL_ENABLE)
|
|||
|
|
{
|
|||
|
|
FL_GPTIM_OC_EnablePreload(TIMx, channel);
|
|||
|
|
}
|
|||
|
|
/* 设置比较值 */
|
|||
|
|
switch(channel)
|
|||
|
|
{
|
|||
|
|
case FL_GPTIM_CHANNEL_1:
|
|||
|
|
FL_GPTIM_WriteCompareCH1(TIMx, oc_init->compareValue);
|
|||
|
|
break;
|
|||
|
|
case FL_GPTIM_CHANNEL_2:
|
|||
|
|
FL_GPTIM_WriteCompareCH2(TIMx, oc_init->compareValue);
|
|||
|
|
break;
|
|||
|
|
case FL_GPTIM_CHANNEL_3:
|
|||
|
|
FL_GPTIM_WriteCompareCH3(TIMx, oc_init->compareValue);
|
|||
|
|
break;
|
|||
|
|
case FL_GPTIM_CHANNEL_4:
|
|||
|
|
FL_GPTIM_WriteCompareCH4(TIMx, oc_init->compareValue);
|
|||
|
|
break;
|
|||
|
|
default :
|
|||
|
|
result = FL_FAIL;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* @brief 设置 FL_GPTIM_OC_InitTypeDef 为默认配置
|
|||
|
|
* @param oc_init 指向需要将值设置为默认配置的结构体 @ref FL_GPTIM_OC_InitTypeDef 结构体
|
|||
|
|
*
|
|||
|
|
* @retval None
|
|||
|
|
*/
|
|||
|
|
void FL_GPTIM_OC_StructInit(FL_GPTIM_OC_InitTypeDef *oc_init)
|
|||
|
|
{
|
|||
|
|
/* Set the default configuration */
|
|||
|
|
oc_init->OCMode = FL_GPTIM_OC_MODE_FROZEN;
|
|||
|
|
oc_init->OCETRFStatus = FL_DISABLE;
|
|||
|
|
oc_init->OCFastMode = FL_DISABLE;
|
|||
|
|
oc_init->compareValue = 0x00000000U;
|
|||
|
|
oc_init->OCPolarity = FL_GPTIM_OC_POLARITY_NORMAL;
|
|||
|
|
oc_init->OCPreload = FL_DISABLE;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* @brief 配置TIM的输入捕获通道.
|
|||
|
|
* @param TIMx Timer Instance
|
|||
|
|
* @param Channel This parameter can be one of the following values:
|
|||
|
|
* @arg @ref FL_GPTIM_CHANNEL_0
|
|||
|
|
* @arg @ref FL_GPTIM_CHANNEL_1
|
|||
|
|
* @arg @ref FL_GPTIM_CHANNEL_2
|
|||
|
|
* @arg @ref FL_GPTIM_CHANNEL_3
|
|||
|
|
* @param ic_init 指向一个 @ref FL_GPTIM_IC_InitTypeDef 结构体
|
|||
|
|
* @retval ErrorStatus枚举值
|
|||
|
|
* -FL_FAIL 配置过程发生错误
|
|||
|
|
* -FL_PASS 成功
|
|||
|
|
*/
|
|||
|
|
FL_ErrorStatus FL_GPTIM_IC_Init(GPTIM_Type *TIMx, uint32_t channel, FL_GPTIM_IC_InitTypeDef *ic_init)
|
|||
|
|
{
|
|||
|
|
FL_ErrorStatus result = FL_PASS;
|
|||
|
|
/* 参数检查 */
|
|||
|
|
assert_param(IS_FL_GPTIM_CHANNEL(channel));
|
|||
|
|
assert_param(IS_FL_GPTIM_IC_CAPTURE_STATE(ic_init->captureState));
|
|||
|
|
assert_param(IS_FL_GPTIM_IC_POLARITY(ic_init->ICPolarity));
|
|||
|
|
assert_param(IS_FL_GPTIM_CHANNEL_MODE(ic_init->ICActiveInput));
|
|||
|
|
assert_param(IS_FL_GPTIM_IC_PSC(ic_init->ICPrescaler));
|
|||
|
|
assert_param(IS_FL_GPTIM_IC_FILTER(ic_init->ICFilter));
|
|||
|
|
/* 时钟总线使能配置 */
|
|||
|
|
if(TIMx == GPTIM0)
|
|||
|
|
{
|
|||
|
|
FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM0);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
if(TIMx == GPTIM1)
|
|||
|
|
{
|
|||
|
|
FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM2);
|
|||
|
|
}
|
|||
|
|
/* 通道关闭 */
|
|||
|
|
FL_GPTIM_IC_DisableChannel(TIMx, channel);
|
|||
|
|
/*捕获极性 */
|
|||
|
|
FL_GPTIM_IC_SetChannelPolarity(TIMx, ic_init->ICPolarity, channel);
|
|||
|
|
/* 捕获映射通道 */
|
|||
|
|
FL_GPTIM_CC_SetChannelMode(TIMx, ic_init->ICActiveInput, channel);
|
|||
|
|
/* 捕获预分频 */
|
|||
|
|
FL_GPTIM_IC_SetPrescaler(TIMx, ic_init->ICPrescaler, channel);
|
|||
|
|
/* 捕获滤波器 */
|
|||
|
|
FL_GPTIM_IC_SetFilter(TIMx, ic_init->ICFilter, channel);
|
|||
|
|
if(ic_init->captureState == FL_ENABLE)
|
|||
|
|
{
|
|||
|
|
FL_GPTIM_IC_EnableChannel(TIMx, channel);
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置 FL_GPTIM_IC_InitTypeDef 为默认配置
|
|||
|
|
* @param ic_init 指向需要将值设置为默认配置的结构体 @ref FL_GPTIM_IC_InitTypeDef 结构体
|
|||
|
|
*
|
|||
|
|
* @retval None
|
|||
|
|
*/
|
|||
|
|
void FL_GPTIM_IC_StructInit(FL_GPTIM_IC_InitTypeDef *ic_init)
|
|||
|
|
{
|
|||
|
|
/* Set the default configuration */
|
|||
|
|
ic_init->ICPolarity = FL_GPTIM_IC_POLARITY_NORMAL;
|
|||
|
|
ic_init->ICActiveInput = FL_GPTIM_CHANNEL_MODE_INPUT_NORMAL;
|
|||
|
|
ic_init->ICPrescaler = FL_GPTIM_IC_PSC_DIV1;
|
|||
|
|
ic_init->ICFilter = FL_GPTIM_IC_FILTER_DIV1;
|
|||
|
|
ic_init->captureState = FL_DISABLE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @}
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#endif /* FL_GPTIM_DRIVER_ENABLED */
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @}
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @}
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/
|