/************************************************************************************************/
/**
* @file               std_gpio.h
* @author             MCU Ecosystem Development Team
* @brief              GPIO STD库驱动头文件。
*                     提供GPIO相关的STD库操作函数声明、数据类型以及常量的定义。                         
*                     
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/

/* 避免头文件重复引用 */
#ifndef STD_GPIO_H
#define STD_GPIO_H

/************************************************************************************************/
/** 
* @addtogroup STD_Driver
* @{
*/

/**
* @defgroup GPIO GPIO
* @brief 通用输入/输出接口的STD库驱动
* @{
*/
/************************************************************************************************/


#ifdef __cplusplus
 extern "C" {
#endif

/*------------------------------------------includes--------------------------------------------*/
#include "std_common.h"

/*-----------------------------------------type define------------------------------------------*/

/************************************************************************************************/
/** 
* @defgroup GPIO_Types GPIO Types
* @brief GPIO数据类型定义
* @{
*/
/************************************************************************************************/
/**
* @brief  GPIO初始化结构体定义
*/
typedef struct
{                         
    uint32_t pin;                 /**< 指定GPIO引脚，可以是GPIO引脚组合 
                                           @arg GPIO_PIN_0 ...                         */

    uint32_t mode;                /**< 指定GPIO引脚模式及输出类型配置 
                                           @arg GPIO_MODE_INPUT
                                           @arg GPIO_MODE_ANALOG
                                           @arg GPIO_MODE_OUTPUT
                                           @arg GPIO_MODE_ALTERNATE                    */

    uint32_t pull;                /**< 指定GPIO引脚上/下拉配置  
                                           @arg GPIO_NOPULL ...                        */

    uint32_t output_type;         /**< 指定GPIO输出类型  
                                           @arg GPIO_OUTPUT_PUSHPULL
                                           @arg GPIO_OUTPUT_OPENDRAIN                  */
    
    uint32_t alternate;           /**< 指定GPIO引脚复用功能配置   
                                           @arg GPIO_AF0_SWCLK ...                       */

} std_gpio_init_t;

/** 
* @} 
*/

/*--------------------------------------------define--------------------------------------------*/

/************************************************************************************************/
/**
* @defgroup GPIO_Constants GPIO Constants 
* @brief  GPIO常量定义及宏定义
* @{
*
*/
/************************************************************************************************/

/* GPIO PIN常量 */
#define  GPIO_PIN_0                            ((uint16_t)0x0001U)        /**< 选定  PIN 0   */
#define  GPIO_PIN_1                            ((uint16_t)0x0002U)        /**< 选定  PIN 1   */
#define  GPIO_PIN_2                            ((uint16_t)0x0004U)        /**< 选定  PIN 2   */
#define  GPIO_PIN_3                            ((uint16_t)0x0008U)        /**< 选定  PIN 3   */
#define  GPIO_PIN_4                            ((uint16_t)0x0010U)        /**< 选定  PIN 4   */
#define  GPIO_PIN_5                            ((uint16_t)0x0020U)        /**< 选定  PIN 5   */
#define  GPIO_PIN_6                            ((uint16_t)0x0040U)        /**< 选定  PIN 6   */
#define  GPIO_PIN_7                            ((uint16_t)0x0080U)        /**< 选定  PIN 7   */
#define  GPIO_PIN_8                            ((uint16_t)0x0100U)        /**< 选定  PIN 8   */
#define  GPIO_PIN_9                            ((uint16_t)0x0200U)        /**< 选定  PIN 9   */
#define  GPIO_PIN_10                           ((uint16_t)0x0400U)        /**< 选定  PIN 10  */
#define  GPIO_PIN_11                           ((uint16_t)0x0800U)        /**< 选定  PIN 11  */
#define  GPIO_PIN_12                           ((uint16_t)0x1000U)        /**< 选定  PIN 12  */
#define  GPIO_PIN_13                           ((uint16_t)0x2000U)        /**< 选定  PIN 13  */
#define  GPIO_PIN_14                           ((uint16_t)0x4000U)        /**< 选定  PIN 14  */
#define  GPIO_PIN_15                           ((uint16_t)0x8000U)        /**< 选定  PIN 15  */
#define  GPIO_PIN_All                          ((uint16_t)0xFFFFU)        /**< 选定  全部    */

/* GPIO 模式配置常量 */
#define  GPIO_MODE_INPUT                       (0x00000000U)              /**< 输入浮空 */
#define  GPIO_MODE_OUTPUT                      (0x00000001U)              /**< 输出功能 */
#define  GPIO_MODE_ALTERNATE                   (0x00000002U)              /**< 复用功能 */
#define  GPIO_MODE_ANALOG                      (0x00000003U)              /**< 模拟功能 */

/* GPIO 上下拉配置参数 */
#define  GPIO_NOPULL                           (0x00000000U)              /**< 无上、下拉 */
#define  GPIO_PULLUP                           (0x00000001U)              /**< 上拉       */
#define  GPIO_PULLDOWN                         (0x00000002U)              /**< 下拉       */

/* GPIO 输出类型 */
#define  GPIO_OUTPUT_PUSHPULL                  (0x00000000U)             /**< 推挽输出   */
#define  GPIO_OUTPUT_OPENDRAIN                 (0x00000001U)             /**< 开漏输出   */

/* 复用功能0 */
#define  GPIO_AF0_SWCLK                        ((uint8_t)0x00U)           /**< SWCLK 复用功能映射 */
#define  GPIO_AF0_SWDIO                        ((uint8_t)0x00U)           /**< SWDIO 复用功能映射 */
#define  GPIO_AF0_SPI1                         ((uint8_t)0x00U)           /**< SPI1  复用功能映射 */
#define  GPIO_AF0_SPI2                         ((uint8_t)0x00U)           /**< SPI2  复用功能映射 */

/* 复用功能1 */
#define  GPIO_AF1_UART1                        ((uint8_t)0x01U)           /**< UART1   复用功能映射 */
#define  GPIO_AF1_LPUART1                      ((uint8_t)0x01U)           /**< LPUART1复用功能映射  */

/* 复用功能2 */
#define  GPIO_AF2_UART2                        ((uint8_t)0x02U)           /**< UART2   复用功能映射 */
#define  GPIO_AF2_SPI1                         ((uint8_t)0x02U)           /**< SPI1    复用功能映射 */
#define  GPIO_AF2_SPI2                         ((uint8_t)0x02U)           /**< SPI2    复用功能映射 */

/* 复用功能3 */
#define  GPIO_AF3_TIM1                         ((uint8_t)0x03U)           /**< TIM1    复用功能映射 */
#define  GPIO_AF3_SPI1                         ((uint8_t)0x03U)           /**< SPI1    复用功能映射 */

/* 复用功能4 */
#define  GPIO_AF4_TIM3                         ((uint8_t)0x04U)           /**< TIM3    复用功能映射 */

/* 复用功能5 */
#define  GPIO_AF5_LPUART1                      ((uint8_t)0x05U)           /**< LPUART1 复用功能映射 */

/* 复用功能6 */
#define  GPIO_AF6_I2C1                         ((uint8_t)0x06U)           /**< I2C1    复用功能映射 */
#define  GPIO_AF6_LPTIM1                       ((uint8_t)0x06U)           /**< LPTIM1  复用功能映射 */

/* 复用功能7 */
#define  GPIO_AF7_MCO                          ((uint8_t)0x07U)           /**< MCO     复用功能映射 */
#define  GPIO_AF7_COMP1                        ((uint8_t)0x07U)           /**< COMP1   复用功能映射 */
#define  GPIO_AF7_COMP2                        ((uint8_t)0x07U)           /**< COMP2   复用功能映射 */
#define  GPIO_AF7_RTC                          ((uint8_t)0x07U)           /**< RTC     复用功能映射 */
#define  GPIO_AF7_IROUT                        ((uint8_t)0x07U)           /**< IROUT   复用功能映射 */

/* 复用功能寄存器GPIO源选择偏移位 */
#define  GPIO_AF_SELECT_OFFSET                 (0x0000000FU)              /**< GPIO源选择偏移位 */

/* 灌电流驱动能力 
*  PORTA端口PA3-PA7、PA15, PORTB端口PB3-PB8, PORTF端口PF4支持驱动能力配置
*/
#define GPIO_SINK_CURRENT_LOW_DRIVE          (0x00000000U)                /**< 灌电流驱动能力 低驱 */
#define GPIO_SINK_CURRENT_HIGH_DRIVE         (0x00000001U)                /**< 灌电流驱动能力 高驱 */

/* 拉电流驱动能力 
*  PORTA端口PA3-PA7、PA15, PORTB端口PB3-PB8, PORTF端口PF4支持驱动能力配置
*/
#define GPIO_SOURCE_CURRENT_LOW_DRIVE            (0x00000000U)              /**< 拉电流驱动能力 低驱   */
#define GPIO_SOURCE_CURRENT_MEDIUMLOW_DRIVE      (0x00000001U)              /**< 拉电流驱动能力 中低驱 */
#define GPIO_SOURCE_CURRENT_MEDIUMHIGH_DRIVE     (0x00000002U)              /**< 拉电流驱动能力 中高驱 */
#define GPIO_SOURCE_CURRENT_HIGH_DRIVE           (0x00000003U)              /**< 拉电流驱动能力 高驱   */

/** 
* @} 
*/

/*-------------------------------------------functions------------------------------------------*/

/************************************************************************************************/
/**
* @defgroup GPIO_External_Functions GPIO External Functions
* @brief    GPIO对外函数
* @{
*
*/
/************************************************************************************************/
/**
* @brief  设置GPIO引脚模式
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin  GPIO引脚
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_15
* @param  mode GPIO引脚模式
*             @arg GPIO_MODE_INPUT     输入模式
*             @arg GPIO_MODE_OUTPUT    输出模式
*             @arg GPIO_MODE_ALTERNATE 复用模式
*             @arg GPIO_MODE_ANALOG    模拟模式
* @note   仅支持单个引脚
* @retval 无
*/
__STATIC_INLINE void std_gpio_set_pin_mode(GPIO_t *gpiox, uint32_t pin, uint32_t mode)
{
    MODIFY_REG(gpiox->MODE, ((pin * pin) * GPIO_MODE_MODE0), ((pin * pin) * mode));
}

/**
* @brief  读取GPIO引脚模式
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin GPIO引脚
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_15
* @note   仅支持单个引脚
* @retval uint32_t GPIO引脚模式
*             @arg GPIO_MODE_INPUT     输入模式
*             @arg GPIO_MODE_OUTPUT    输出模式
*             @arg GPIO_MODE_ALTERNATE 复用模式
*             @arg GPIO_MODE_ANALOG    模拟模式
*/
__STATIC_INLINE uint32_t std_gpio_get_pin_mode(GPIO_t *gpiox, uint32_t pin)
{
    return ((gpiox->MODE & ((pin * pin) * GPIO_MODE_MODE0)) / (pin * pin));
}

/**
* @brief  设置GPIO引脚输出类型
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin_mask GPIO引脚组合
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_15
* @param  output_type GPIO引脚输出类型
*             @arg GPIO_OUTPUT_PUSHPULL  推挽输出
*             @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
* @retval 无
*/
__STATIC_INLINE void std_gpio_set_pin_output_type(GPIO_t *gpiox, uint32_t pin_mask, uint32_t output_type)
{
    MODIFY_REG(gpiox->OTYPE, pin_mask, pin_mask * output_type);
}

/**
* @brief  读取GPIO引脚输出类型
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin  GPIO引脚
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_15
* @note   仅支持单个引脚
* @retval uint32_t GPIO引脚输出类型
*             @arg GPIO_OUTPUT_PUSHPULL  推挽输出
*             @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
*/
__STATIC_INLINE uint32_t std_gpio_get_pin_output_type(GPIO_t *gpiox, uint32_t pin)
{
    return ((gpiox->OTYPE & (pin)) != 0U ? GPIO_OUTPUT_OPENDRAIN : GPIO_OUTPUT_PUSHPULL);
}

/**
* @brief  设置GPIO引脚上下拉配置
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin GPIO引脚
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_15
* @param  pull GPIO引脚上下拉配置
*             @arg GPIO_NOPULL   无上、下拉
*             @arg GPIO_PULLUP   上拉
*             @arg GPIO_PULLDOWN 下拉
* @note   仅支持单个引脚
* @retval 无
*/
__STATIC_INLINE void std_gpio_set_pin_pull(GPIO_t *gpiox, uint32_t pin, uint32_t pull)
{
    MODIFY_REG(gpiox->PUPD, ((pin * pin) * GPIO_PUPD_PUPD0), ((pin * pin) * pull));
}

/**
* @brief  读取GPIO引脚上下拉配置
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin  GPIO引脚
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_15
* @note   仅支持单个引脚
* @retval uint32_t GPIO引脚上下拉配置
*             @arg GPIO_NOPULL   无上、下拉
*             @arg GPIO_PULLUP   上拉
*             @arg GPIO_PULLDOWN 下拉
*/
__STATIC_INLINE uint32_t std_gpio_get_pin_pull(GPIO_t *gpiox, uint32_t pin)
{
  return ((gpiox->PUPD & ((pin * pin) * GPIO_PUPD_PUPD0)) / (pin * pin));
}

/**
* @brief  设置GPIO引脚（0~7）复用功能
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin  GPIO引脚
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_7
* @param  alternate GPIO引脚（0~7）复用功能
*             @arg GPIO_AF0_SWCLK  
*             @arg GPIO_AF0_SWDIO
*             @arg ...
*             @arg GPIO_AF7_RTC  
*             @arg GPIO_AF7_IROUT
* @note   仅支持单个引脚
* @retval 无
*/
__STATIC_INLINE void std_gpio_set_afpin_0_7(GPIO_t *gpiox, uint32_t pin, uint32_t alternate)
{
    MODIFY_REG(gpiox->AFL, ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET),
               ((((pin * pin) * pin) * pin) * alternate)); 
}

/**
* @brief  读取GPIO引脚（0~7）复用功能
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin GPIO引脚
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_7
* @note   仅支持单个引脚
* @retval uint32_t GPIO引脚（0~7）复用功能
*             @arg GPIO_AF0_SWCLK
*             @arg GPIO_AF0_SWDIO
*             @arg ...
*             @arg GPIO_AF7_RTC  
*             @arg GPIO_AF7_IROUT
*/
__STATIC_INLINE uint32_t std_gpio_get_afpin_0_7(GPIO_t *gpiox, uint32_t pin)
{
    return ((gpiox->AFL & ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET)) / 
            (((pin * pin) * pin) * pin));
}

/**
* @brief  设置GPIO引脚（8~15）复用功能
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
* @param  pin GPIO引脚
*             @arg GPIO_PIN_8
*             @arg GPIO_PIN_9
*             @arg ...
*             @arg GPIO_PIN_15
* @param  alternate GPIO引脚（8~15）复用功能
*             @arg GPIO_AF0_SWCLK
*             @arg GPIO_AF0_SWDIO
*             @arg ...
*             @arg GPIO_AF7_RTC  
*             @arg GPIO_AF7_IROUT
* @note   仅支持单个引脚
* @retval 无
*/
__STATIC_INLINE void std_gpio_set_afpin_8_15(GPIO_t *gpiox, uint32_t pin, uint32_t alternate)
{
    MODIFY_REG(gpiox->AFH,  (((((pin >> 8U) * (pin >> 8U)) * (pin >> 8U)) * (pin >> 8U)) * GPIO_AF_SELECT_OFFSET),
             (((((pin >> 8U) * (pin >> 8U)) * (pin >> 8U)) * (pin >> 8U)) * alternate)); 
}

/**
* @brief  读取GPIO引脚（8~15）复用功能
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
* @param  pin GPIO引脚
*             @arg GPIO_PIN_8
*             @arg GPIO_PIN_9
*             @arg ...
*             @arg GPIO_PIN_15
* @note   仅支持单个引脚
* @retval uint32_t GPIO引脚（8~15）复用功能
*             @arg GPIO_AF0_SWCLK
*             @arg GPIO_AF0_SWDIO
*             @arg ...
*             @arg GPIO_AF7_RTC  
*             @arg GPIO_AF7_IROUT
*/
__STATIC_INLINE uint32_t std_gpio_get_afpin_8_15(GPIO_t *gpiox, uint32_t pin)
{
    return ((gpiox->AFH & (((((pin >> 8U) * (pin >> 8U)) * (pin >> 8U)) * (pin >> 8U)) * GPIO_AF_SELECT_OFFSET)) / 
            ((((pin >> 8U) * (pin >> 8U)) * (pin >> 8U)) * (pin >> 8U)));
}
/**
* @brief  读取GPIO引脚输入状态
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin  GPIO引脚
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_15
* @note   仅支持单个引脚
* @retval bool GPIO引脚输入状态
*             @arg true  表示高电平
*             @arg false 表示低电平
*/
__STATIC_INLINE bool std_gpio_get_input_pin(GPIO_t* gpiox, uint32_t pin)
{
    return ((gpiox->IDR & (pin)) == (pin));
}

/**
* @brief  读取GPIO引脚输出状态
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin GPIO引脚
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_15
* @note   仅支持单个引脚
* @retval bool GPIO引脚输出状态
*             @arg true  表示高电平
*             @arg false 表示低电平
*/
__STATIC_INLINE bool std_gpio_get_output_pin(GPIO_t* gpiox, uint32_t pin)
{
    return ((gpiox->ODR & (pin)) == (pin));
}

/**
* @brief  读取GPIO端口输入数据
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @retval uint32_t GPIO端口输入数据
*/
__STATIC_INLINE uint32_t std_gpio_read_input_port(GPIO_t* gpiox)
{
    return (gpiox->IDR);
}

/**
* @brief  读取GPIO端口输出数据
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @retval uint32_t GPIO端口输出数据
*/
__STATIC_INLINE uint32_t std_gpio_read_output_port(GPIO_t* gpiox)
{
    return (gpiox->ODR);
}

/**
* @brief  写入GPIO端口输出数据
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  value 输出数据
* @retval 无
*/
__STATIC_INLINE void std_gpio_write_output_port(GPIO_t* gpiox, uint32_t value)
{
    gpiox->ODR = value;
}

/**
* @brief  设置GPIO输出高电平
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin_mask GPIO引脚组合
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_15
* @retval 无
*/
__STATIC_INLINE void std_gpio_set_pin(GPIO_t* gpiox, uint32_t pin_mask)
{
    gpiox->BSR = pin_mask;
}

/**
* @brief  设置GPIO输出低电平
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin_mask  GPIO引脚组合
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_15
* @retval 无
*/
__STATIC_INLINE void std_gpio_reset_pin(GPIO_t* gpiox, uint32_t pin_mask)
{
    gpiox->BR = pin_mask;
}

/**
* @brief  切换GPIO端口高/低电平
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin_mask  GPIO引脚组合
*             @arg GPIO_PIN_0
*             @arg GPIO_PIN_1
*             @arg ...
*             @arg GPIO_PIN_15
* @retval 无
*/
__STATIC_INLINE void std_gpio_toggle_pin(GPIO_t* gpiox, uint32_t pin_mask)
{
    gpiox->ODR ^= pin_mask;
}

/**
* @brief  设置GPIO引脚灌电流驱动档位
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin  GPIO引脚
*             @arg GPIO_PIN_3
*             @arg ...
*             @arg GPIO_PIN_15
* @param  drive_level GPIO引脚灌电流驱动档位
*             @arg GPIO_SINK_CURRENT_LOW_DRIVE   低驱
*             @arg GPIO_SINK_CURRENT_HIGH_DRIVE  高驱
* @note   仅支持单个引脚
* @note   PORTA端口PA3-PA7、PA15, PORTB端口PB3-PB8, PORTF端口PF4支持灌电流驱动能力配置
* @retval 无
*/
__STATIC_INLINE void std_gpio_set_pin_sink_current(GPIO_t* gpiox, uint32_t pin, uint32_t drive_level)
{
    MODIFY_REG(gpiox->HDCFG1, pin, pin * drive_level);
}

/**
* @brief  获取GPIO引脚灌电流驱动档位
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin  GPIO引脚
*             @arg GPIO_PIN_3
*             @arg ...
*             @arg GPIO_PIN_15
* @note   仅支持单个引脚
* @note   PORTA端口PA3-PA7、PA15, PORTB端口PB3-PB8, PORTF端口PF4支持灌电流驱动能力配置
* @retval  uint32_t GPIO引脚灌电流驱动档位
*             @arg GPIO_SINK_CURRENT_LOW_DRIVE   低驱
*             @arg GPIO_SINK_CURRENT_HIGH_DRIVE  高驱
*/
__STATIC_INLINE uint32_t std_gpio_get_pin_sink_current(GPIO_t* gpiox, uint32_t pin)
{
    return ((gpiox->HDCFG1 & (pin)) != 0U ? GPIO_SINK_CURRENT_HIGH_DRIVE : GPIO_SINK_CURRENT_LOW_DRIVE);
}

/**
* @brief  设置GPIO引脚拉电流驱动档位
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin  GPIO引脚
*             @arg GPIO_PIN_3
*             @arg ...
*             @arg GPIO_PIN_15
* @param  drive_level GPIO引脚拉电流驱动档位
*             @arg GPIO_SOURCE_CURRENT_LOW_DRIVE        低驱
*             @arg GPIO_SOURCE_CURRENT_MEDIUMLOW_DRIVE  中低驱
*             @arg GPIO_SOURCE_CURRENT_MEDIUMHIGH_DRIVE 中高驱
*             @arg GPIO_SOURCE_CURRENT_HIGH_DRIVE       高驱
* @note   仅支持单个引脚
* @note   PORTA端口PA3-PA7、PA15, PORTB端口PB3-PB8, PORTF端口PF4支持驱动能力配置
* @retval 无
*/
__STATIC_INLINE void std_gpio_set_pin_source_current(GPIO_t* gpiox, uint32_t pin, uint32_t drive_level)
{
    MODIFY_REG(gpiox->HDCFG2, ((pin * pin) * GPIO_HDCFG2_HDP0), ((pin * pin) * drive_level));
}

/**
* @brief  获取GPIO引脚拉电流驱动档位
* @param  gpiox GPIO外设
*             @arg GPIOA
*             @arg GPIOB
*             @arg GPIOF
* @param  pin  GPIO引脚
*             @arg GPIO_PIN_3
*             @arg ...
*             @arg GPIO_PIN_15
* @note   仅支持单个引脚
* @note   PORTA端口PA3-PA7、PA15, PORTB端口PB3-PB8, PORTF端口PF4支持驱动能力配置
* @retval uint32_t GPIO引脚拉电流驱动档位
*             @arg GPIO_SOURCE_CURRENT_LOW_DRIVE        低驱
*             @arg GPIO_SOURCE_CURRENT_MEDIUMLOW_DRIVE  中低驱
*             @arg GPIO_SOURCE_CURRENT_MEDIUMHIGH_DRIVE 中高驱
*             @arg GPIO_SOURCE_CURRENT_HIGH_DRIVE       高驱
*/
__STATIC_INLINE uint32_t std_gpio_get_pin_source_current(GPIO_t* gpiox, uint32_t pin)
{
    return ((gpiox->HDCFG2 & ((pin * pin) * GPIO_HDCFG2_HDP0)) / (pin * pin));
}

/* GPIO初始化函数 */
void std_gpio_init(GPIO_t* gpiox, std_gpio_init_t* gpio_init_param);

/* GPIO去初始化函数 */
void std_gpio_deinit(GPIO_t* gpiox, uint32_t pin_mask);

/* GPIO结构体初始化函数 */
void std_gpio_struct_init(std_gpio_init_t* gpio_init_struct);

/* GPIO灌电流配置 */
void std_gpio_sink_drive_config(GPIO_t* gpiox, uint32_t pin_mask, uint32_t drive_level);

/* GPIO拉电流配置 */
void std_gpio_source_drive_config(GPIO_t* gpiox, uint32_t pin_mask, uint32_t drive_level);
    
/** 
* @} 
*/


#ifdef __cplusplus
}
#endif

/**
* @} 
*/  

/**
* @}
*/

#endif /* STD_GPIO_H */


