current_v/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_gpio.c
2025-12-31 08:21:43 +08:00

335 lines
12 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 fm33lg0xx_fl_gpio.c
* @author FMSH Application Team
* @brief Src file of GPIO 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 GPIO
* @{
*/
#ifdef FL_GPIO_DRIVER_ENABLED
/* Private macros ------------------------------------------------------------*/
/** @addtogroup GPIO_FL_Private_Macros
* @{
*/
#define IS_GPIO_ALL_INSTANCE(INTENCE) (((INTENCE) == GPIOA)||\
((INTENCE) == GPIOB)||\
((INTENCE) == GPIOC)||\
((INTENCE) == GPIOD)||\
((INTENCE) == GPIOE))
#define IS_FL_GPIO_PIN(__VALUE__) ((((uint32_t)0x00000000U) < (__VALUE__)) &&\
((__VALUE__) <= (FL_GPIO_PIN_ALL)))
#define IS_FL_GPIO_MODE(__VALUE__) (((__VALUE__) == FL_GPIO_MODE_ANALOG)||\
((__VALUE__) == FL_GPIO_MODE_INPUT)||\
((__VALUE__) == FL_GPIO_MODE_OUTPUT)||\
((__VALUE__) == FL_GPIO_MODE_DIGITAL))
#define IS_FL_GPIO_OPENDRAIN(__VALUE__) (((__VALUE__) == FL_GPIO_OUTPUT_OPENDRAIN)||\
((__VALUE__) == FL_GPIO_OUTPUT_PUSHPULL))
#define IS_FL_GPIO_PULL_UP(__VALUE__) (((__VALUE__) == FL_DISABLE)||\
((__VALUE__) == FL_ENABLE))
#define IS_FL_GPIO_ANALOG_SWITCH(__VALUE__) (((__VALUE__) == FL_DISABLE)||\
((__VALUE__) == FL_ENABLE))
#define IS_FL_GPIO_WKUP_ENTRY(__VALUE__) (((__VALUE__) == FL_GPIO_WKUP_INT_ENTRY_NMI)||\
((__VALUE__) == FL_GPIO_WKUP_INT_ENTRY_NUM_38))
#define IS_FL_GPIO_WKUP_EDGE(__VALUE__) (((__VALUE__) == FL_GPIO_WAKEUP_TRIGGER_RISING)||\
((__VALUE__) == FL_GPIO_WAKEUP_TRIGGER_FALLING)||\
((__VALUE__) == FL_GPIO_WAKEUP_TRIGGER_BOTH))
#define IS_FL_GPIO_WKUP_NUM(__VALUE__) (((__VALUE__) == FL_GPIO_WAKEUP_0)||\
((__VALUE__) == FL_GPIO_WAKEUP_1)||\
((__VALUE__) == FL_GPIO_WAKEUP_2)||\
((__VALUE__) == FL_GPIO_WAKEUP_3)||\
((__VALUE__) == FL_GPIO_WAKEUP_4)||\
((__VALUE__) == FL_GPIO_WAKEUP_5)||\
((__VALUE__) == FL_GPIO_WAKEUP_6)||\
((__VALUE__) == FL_GPIO_WAKEUP_7)||\
((__VALUE__) == FL_GPIO_WAKEUP_8)||\
((__VALUE__) == FL_GPIO_WAKEUP_9))
/**
* @}
*/
/* Exported functions --------------------------------------------------------*/
/** @addtogroup GPIO_FL_EF_Init
* @{
*/
/**
* @brief 复位对应GPIO控制寄存器.
* @param GPIOx GPIO Port
* @retval ErrorStatus枚举值:
* -FL_PASS 外设寄存器值恢复复位值
* -FL_FAIL 未成功执行
*/
FL_ErrorStatus FL_GPIO_DeInit(GPIO_Type *GPIOx, uint32_t pin)
{
uint32_t pinPos = 0x00000000U;
uint32_t currentPin = 0x00000000U;
/* 入口参数检查 */
assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
assert_param(IS_FL_GPIO_PIN(pin));
/* 恢复寄存器值为默认值 */
while(((pin) >> pinPos) != 0x00000000U)
{
/* 获取当前遍历到的Pin脚 */
currentPin = (pin) & (0x00000001U << pinPos);
if(currentPin)
{
FL_GPIO_SetPinMode(GPIOx, currentPin, FL_GPIO_MODE_INPUT);
FL_GPIO_DisablePinInput(GPIOx, currentPin);
FL_GPIO_DisablePinOpenDrain(GPIOx, currentPin);
FL_GPIO_DisablePinPullup(GPIOx, currentPin);
FL_GPIO_DisablePinAnalogSwitch(GPIOx, currentPin);
FL_GPIO_DisablePinRemap(GPIOx, currentPin);
}
pinPos++;
}
return FL_PASS;
}
/**
* @brief 根据 GPIO_InitStruct的配置信息初始化对应外设.
* @param GPIOx GPIO Port
* @param GPIO_InitStruct 指向一个 @ref FL_GPIO_InitTypeDef 结构体
* 其中包含了外设的相关配置信息.
* @retval ErrorStatus枚举值
* -FL_FAIL 配置过程发生错误
* -FL_PASS 配置成功
*/
FL_ErrorStatus FL_GPIO_Init(GPIO_Type *GPIOx, FL_GPIO_InitTypeDef *initStruct)
{
uint32_t pinPos = 0x00000000U;
uint32_t currentPin = 0x00000000U;
/* 入口参数检查 */
assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
assert_param(IS_FL_GPIO_PIN(initStruct->pin));
assert_param(IS_FL_GPIO_MODE(initStruct->mode));
assert_param(IS_FL_GPIO_OPENDRAIN(initStruct->outputType));
assert_param(IS_FL_GPIO_PULL_UP(initStruct->pull));
assert_param(IS_FL_GPIO_ANALOG_SWITCH(initStruct->analogSwitch));
/* 使能时钟总线 */
FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_PAD);
/* 这里考虑到PIN有可能不止一个因此需要遍历 */
while(((initStruct->pin) >> pinPos) != 0x00000000U)
{
/* 获取当前遍历到的Pin脚 */
currentPin = (initStruct->pin) & (0x00000001U << pinPos);
if(currentPin)
{
/* Pin脚模拟模式设置 */
if(initStruct->mode == FL_GPIO_MODE_ANALOG)
{
FL_GPIO_DisablePinInput(GPIOx, currentPin);
FL_GPIO_DisablePinPullup(GPIOx, currentPin);
FL_GPIO_DisablePinOpenDrain(GPIOx, currentPin);
if(initStruct->analogSwitch == FL_ENABLE)
{
FL_GPIO_EnablePinAnalogSwitch(GPIOx, currentPin);
}
else
{
FL_GPIO_DisablePinAnalogSwitch(GPIOx, currentPin);
}
}
else
{
FL_GPIO_DisablePinAnalogSwitch(GPIOx, currentPin);
/* Pin脚输入使能控制 */
if(initStruct->mode == FL_GPIO_MODE_INPUT)
{
FL_GPIO_EnablePinInput(GPIOx, currentPin);
}
else
{
FL_GPIO_DisablePinInput(GPIOx, currentPin);
}
/* Pin脚输出模式设置 */
if(initStruct->outputType == FL_GPIO_OUTPUT_PUSHPULL)
{
FL_GPIO_DisablePinOpenDrain(GPIOx, currentPin);
}
else
{
FL_GPIO_EnablePinOpenDrain(GPIOx, currentPin);
}
/* Pin脚上拉模式设置 */
if(initStruct->pull)
{
FL_GPIO_EnablePinPullup(GPIOx, currentPin);
}
else
{
FL_GPIO_DisablePinPullup(GPIOx, currentPin);
}
}
/* 数字模式复用功能选择 */
if(initStruct->mode == FL_GPIO_MODE_DIGITAL)
{
/*重定向*/
if(initStruct->remapPin == FL_ENABLE)
{
FL_GPIO_EnablePinRemap(GPIOx, currentPin);
}
else
{
FL_GPIO_DisablePinRemap(GPIOx, currentPin);
}
}
/* Pin脚工作模式设置 */
FL_GPIO_SetPinMode(GPIOx, currentPin, initStruct->mode);
}
pinPos++;
}
return FL_PASS;
}
/**
* @brief 设置 GPIO_InitStruct 为默认配置
* @param GPIO_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_GPIO_InitTypeDef 结构体
*
* @retval None
*/
void FL_GPIO_StructInit(FL_GPIO_InitTypeDef *initStruct)
{
/* 复位配置信息 */
initStruct->pin = FL_GPIO_PIN_ALL;
initStruct->mode = FL_GPIO_MODE_INPUT;
initStruct->outputType = FL_GPIO_OUTPUT_OPENDRAIN;
initStruct->pull = FL_DISABLE;
initStruct->remapPin = FL_DISABLE;
initStruct->analogSwitch = FL_DISABLE;
}
/**
* @brief 根据 WKUP_InitTypeDef的配置信息初始化对应外设.
* @param WKUP_InitTypeDef 指向一个 @ref FL_WKUP_InitTypeDef 结构体
* 其中包含了外设的相关配置信息.
* @param Wkupx 唤醒入口
* FL_GPIO_WKUP_0
* FL_GPIO_WKUP_1
* FL_GPIO_WKUP_2
* FL_GPIO_WKUP_3
* FL_GPIO_WKUP_4
* FL_GPIO_WKUP_5
* FL_GPIO_WKUP_6
* FL_GPIO_WKUP_7
* FL_GPIO_WKUP_8
* FL_GPIO_WKUP_9
* @retval ErrorStatus枚举值
* -FL_FAIL 配置过程发生错误
* -FL_PASS 配置成功
*/
FL_ErrorStatus FL_WKUP_Init(FL_WKUP_InitTypeDef *initStruct, uint32_t wakeup)
{
/* 入口参数检查 */
assert_param(IS_FL_GPIO_WKUP_NUM(wakeup));
assert_param(IS_FL_GPIO_WKUP_EDGE(initStruct->polarity));
FL_GPIO_EnableWakeup(GPIO, wakeup);
FL_GPIO_SetWakeupEdge(GPIO, wakeup, initStruct->polarity);
return FL_PASS;
}
/**
* @brief 去初始化Wakeup设置.
* @param Wkupx 唤醒入口
* FL_GPIO_WKUP_0
* FL_GPIO_WKUP_1
* FL_GPIO_WKUP_2
* FL_GPIO_WKUP_3
* FL_GPIO_WKUP_4
* FL_GPIO_WKUP_5
* FL_GPIO_WKUP_6
* FL_GPIO_WKUP_7
* FL_GPIO_WKUP_8
* FL_GPIO_WKUP_9
* @retval ErrorStatus枚举值
* -FL_FAIL 配置过程发生错误
* -FL_PASS 配置成功
*/
FL_ErrorStatus FL_WKUP_DeInit(uint32_t wakeup)
{
/* 入口参数检查 */
assert_param(IS_FL_GPIO_WKUP_NUM(wakeup));
FL_GPIO_DisableWakeup(GPIO, wakeup);
return FL_PASS;
}
/**
* @brief 设置 GPIO_InitStruct 为默认配置
* @param GPIO_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_GPIO_InitTypeDef 结构体
*
* @retval None
*/
void FL_WKUP_StructInit(FL_WKUP_InitTypeDef *initStruct_Wakeup)
{
/* 复位配置信息 */
initStruct_Wakeup->polarity = FL_GPIO_WAKEUP_TRIGGER_FALLING;
}
/**
* @brief 配置所有IO口为输入模式、输入使能关闭高阻态SWD接口除外。
* @note PD7和PD8为调试接口
*
* @param None
*
* @retval None
*/
void FL_GPIO_ALLPIN_LPM_MODE(void)
{
FL_GPIO_DeInit(GPIOA, FL_GPIO_PIN_ALL);
FL_GPIO_DeInit(GPIOB, FL_GPIO_PIN_ALL);
FL_GPIO_DeInit(GPIOC, FL_GPIO_PIN_ALL);
FL_GPIO_DeInit(GPIOD, FL_GPIO_PIN_ALL &
(~FL_GPIO_PIN_7) & (~FL_GPIO_PIN_8));
FL_GPIO_DeInit(GPIOE, FL_GPIO_PIN_ALL);
}
/**
* @}
*/
#endif /* FL_GPIO_DRIVER_ENABLED */
/**
* @}
*/
/**
* @}
*/
/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/