264 lines
9.7 KiB
C
264 lines
9.7 KiB
C
/**
|
||
****************************************************************************************************
|
||
* @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 ***********************/
|