current_v/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_exti.c

264 lines
9.7 KiB
C
Raw Normal View History

2025-12-31 08:21:43 +08:00
/**
****************************************************************************************************
* @file fm33lg0xx_fl_exti.c
* @author FMSH Application Team
* @brief Src file of EXTI 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 EXTI
* @{
*/
#ifdef FL_EXTI_DRIVER_ENABLED
/* Private macros ------------------------------------------------------------*/
/** @addtogroup EXTI_FL_Private_Macros
* @{
*/
#define IS_EXTI_ALL_INSTANCE(INSTANCE) (((INSTANCE) == FL_GPIO_EXTI_LINE_0)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_1)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_2)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_3)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_4)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_5)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_6)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_7)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_8)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_9)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_10)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_11)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_12)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_13)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_14)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_15)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_16)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_17)||\
((INSTANCE) == FL_GPIO_EXTI_LINE_18))
#define IS_EXTI_CLK_SOURCE(__VALUE__) (((__VALUE__) == FL_CMU_EXTI_CLK_SOURCE_HCLK)||\
((__VALUE__) == FL_CMU_EXTI_CLK_SOURCE_LSCLK))
#define IS_EXTI_INPUT_GROUP(__VALUE__) (((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP0)||\
((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP1)||\
((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP2)||\
((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP3))
#define IS_EXTI_TRIG_EDGE(__VALUE__) (((__VALUE__) == FL_GPIO_EXTI_TRIGGER_EDGE_RISING)||\
((__VALUE__) == FL_GPIO_EXTI_TRIGGER_EDGE_FALLING)||\
((__VALUE__) == FL_GPIO_EXTI_TRIGGER_EDGE_BOTH))
#define IS_EXTI_FILTER(__VALUE__) (((__VALUE__) == FL_ENABLE)||\
((__VALUE__) == FL_DISABLE))
/**
* @}
*/
/* Private consts ------------------------------------------------------------*/
/** @addtogroup EXTI_FL_Private_Consts
* @{
*/
typedef void (*pSetExtiLineFunc)(GPIO_COMMON_Type *, uint32_t);
static const pSetExtiLineFunc setExtiLineFuncs[] =
{
FL_GPIO_SetExtiLine0,
FL_GPIO_SetExtiLine1,
FL_GPIO_SetExtiLine2,
FL_GPIO_SetExtiLine3,
FL_GPIO_SetExtiLine4,
FL_GPIO_SetExtiLine5,
FL_GPIO_SetExtiLine6,
FL_GPIO_SetExtiLine7,
FL_GPIO_SetExtiLine8,
FL_GPIO_SetExtiLine9,
FL_GPIO_SetExtiLine10,
FL_GPIO_SetExtiLine11,
FL_GPIO_SetExtiLine12,
FL_GPIO_SetExtiLine13,
FL_GPIO_SetExtiLine14,
FL_GPIO_SetExtiLine15,
FL_GPIO_SetExtiLine16,
FL_GPIO_SetExtiLine17,
FL_GPIO_SetExtiLine18,
};
typedef void (*pSetTrigEdgeFunc)(GPIO_COMMON_Type *, uint32_t, uint32_t);
static const pSetTrigEdgeFunc setTrigEdgeFuncs[] =
{
FL_GPIO_SetTriggerEdge0,
FL_GPIO_SetTriggerEdge1,
};
/**
* @}
*/
/* Exported functions --------------------------------------------------------*/
/** @addtogroup EXTI_FL_EF_Init
* @{
*/
/**
* @brief EXTI通用配置设置
*
* @param EXTI_CommonInitStruct @ref FL_EXTI_CommonInitTypeDef EXTI外设通用配置信息
*
* @retval ErrorStatus枚举值
* -FL_FAIL
* -FL_PASS EXTI配置成功
*/
FL_ErrorStatus FL_EXTI_CommonInit(FL_EXTI_CommonInitTypeDef *EXTI_CommonInitStruct)
{
assert_param(IS_EXTI_CLK_SOURCE(EXTI_CommonInitStruct->clockSource));
/* 使能IO时钟寄存器总线时钟 */
FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_PAD);
/* 使能并配置外部中断时钟源 */
FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_EXTI);
FL_CMU_SetEXTIClockSource(EXTI_CommonInitStruct->clockSource);
return FL_PASS;
}
/**
* @brief EXTI通用配置设置
*
* @retval ErrorStatus枚举值
* -FL_FAIL
* -FL_PASS EXTI通用设置复位成功
*/
FL_ErrorStatus FL_EXTI_CommonDeinit(void)
{
/* 关闭外部中断时钟源 */
FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_EXTI);
return FL_PASS;
}
/**
* @brief EXTI_CommonInitStruct
* @param EXTI_CommonInitStruct @ref FL_EXTI_CommonInitTypeDef
*
* @retval None
*/
void FL_EXTI_CommonStructInit(FL_EXTI_CommonInitTypeDef *EXTI_CommonInitStruct)
{
EXTI_CommonInitStruct->clockSource = FL_CMU_EXTI_CLK_SOURCE_LSCLK;
}
/**
* @brief EXTI配置设置
*
* @param extiLineX
* @param EXTI_InitStruct @ref FL_EXTI_InitTypeDef EXTI外设配置信息
*
* @retval ErrorStatus枚举值
* -FL_FAIL
* -FL_PASS EXTI配置成功
*/
FL_ErrorStatus FL_EXTI_Init(uint32_t extiLineX, FL_EXTI_InitTypeDef *EXTI_InitStruct)
{
uint8_t extiLineId;
uint32_t tmpExtiLineX;
uint32_t i = 0;
/* 通过内核时钟计算200us延时的计数个数 */
uint32_t temp = SystemCoreClock / 1000000 * 200 ;
/* 检查参数合法性 */
assert_param(IS_EXTI_ALL_INSTANCE(extiLineX));
assert_param(IS_EXTI_INPUT_GROUP(EXTI_InitStruct->input));
assert_param(IS_EXTI_TRIG_EDGE(EXTI_InitStruct->triggerEdge));
assert_param(IS_EXTI_FILTER(EXTI_InitStruct->filter));
/* 获取EXTI中断线对应id号 */
tmpExtiLineX = extiLineX;
for(extiLineId = 0; tmpExtiLineX != FL_GPIO_EXTI_LINE_0; tmpExtiLineX >>= 1, extiLineId++);
/* 设置中断线连接的IO */
setExtiLineFuncs[extiLineId](GPIO, EXTI_InitStruct->input << (2 * (extiLineId % 16)));
/* 设置数字滤波 */
EXTI_InitStruct->filter == FL_ENABLE ? FL_GPIO_EnableDigitalFilter(GPIO, extiLineX) : FL_GPIO_DisableDigitalFilter(GPIO, extiLineX);
/* 设置中断线触发边沿 */
setTrigEdgeFuncs[extiLineId / 16](GPIO, extiLineX, EXTI_InitStruct->triggerEdge);
/* 等待至少周期6个LSCLK周期约200us */
for(i = 0; i < temp; i++)
{
__NOP();
}
/* 清除外部中断标志 */
FL_GPIO_ClearFlag_EXTI(GPIO, extiLineX);
/* 清除中断挂起 */
NVIC_ClearPendingIRQ(GPIO_IRQn);
return FL_PASS;
}
/**
* @brief EXTI配置设置
*
* @retval ErrorStatus枚举值
* -FL_FAIL
* -FL_PASS EXTI设置复位成功
*/
FL_ErrorStatus FL_EXTI_DeInit(uint32_t extiLineX)
{
uint8_t extiLineId;
uint32_t tmpExtiLineX;
/* 检查参数合法性 */
assert_param(IS_EXTI_ALL_INSTANCE(extiLineX));
/* 获取EXTI中断线对应id号 */
tmpExtiLineX = extiLineX;
for(extiLineId = 0; tmpExtiLineX != FL_GPIO_EXTI_LINE_0; tmpExtiLineX >>= 1, extiLineId++);
/* 清除外部中断标志 */
FL_GPIO_ClearFlag_EXTI(GPIO, extiLineX);
/* 中断线触发边沿禁止 */
setTrigEdgeFuncs[extiLineId / 16](GPIO, extiLineX, FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE);
/* 禁止数字滤波 */
FL_GPIO_DisableDigitalFilter(GPIO, extiLineX);
return FL_PASS;
}
/**
* @brief EXTI_InitStruct
* @param EXTI_InitStruct @ref FL_EXTI_InitTypeDef
*
* @retval None
*/
void FL_EXTI_StructInit(FL_EXTI_InitTypeDef *EXTI_InitStruct)
{
EXTI_InitStruct->filter = FL_DISABLE;
EXTI_InitStruct->input = FL_GPIO_EXTI_INPUT_GROUP0;
EXTI_InitStruct->triggerEdge = FL_GPIO_EXTI_TRIGGER_EDGE_RISING;
}
/**
* @}
*/
#endif /* FL_EXTI_DRIVER_ENABLED */
/**
* @}
*/
/**
* @}
*/
/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/