335 lines
12 KiB
C
335 lines
12 KiB
C
/**
|
||
****************************************************************************************************
|
||
* @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 ***********************/
|