HC32L17x的LL驱动库之GPIO

    #define FLASH_BASE                0x00000000U
    #define FLASH_END                0x0001FFFFU
    #define FLASH_BANK1_END            0x0001FFFFU
    #define SRAM_BASE                0x20000000U
    #define SRAM_ENDsss                0x20003FFFU
    #define PERIPH_BASE                0x40000000U
    //#define SRAM_BB_BASE            0x22000000U
    //#define PERIPH_BB_BASE        0x42000000U
    #define DBGMCU_BASE                0x04002038U 
    #define GPIO_SEL_OFFSET            (0x100/4)

    //===产品身份标识
    #define UID_BASE                0x00100E74U 
    //===产品型号
    #define PRODUCT_BASE            0x00100C60U 
    //===Flash容量
    #define FLASH_SIZE_BASE            0x00100C70U 
    //===SRAM容量
    #define SRAM_SIZE_BASE            0x00100C74U 
    //===引脚数量
    #define PIN_COUNT_BASE            0x00100C7AU 

    //===总线基地址
    #define APB0PERIPH_BASE            PERIPH_BASE
    #define APB1PERIPH_BASE            (PERIPH_BASE + 0x00004000U)
    #define AHBPERIPH_BASE            (PERIPH_BASE + 0x00020000U)

    //===外设基地址
    #define UART0_BASE                (APB0PERIPH_BASE + 0x00000000U)
    #define UART1_BASE                (APB0PERIPH_BASE + 0x00000100U)
    #define LPUART0_BASE            (APB0PERIPH_BASE + 0x00000200U)

    #define I2C0_BASE                (APB0PERIPH_BASE + 0x00000400U)
    #define SPI0_BASE                (APB0PERIPH_BASE + 0x00000800U)

    #define TIM0_BASE                (APB0PERIPH_BASE + 0x00000C00U)
    #define TIM1_BASE                (APB0PERIPH_BASE + 0x00000D00U)
    #define TIM2_BASE                (APB0PERIPH_BASE + 0x00000E00U)
    #define LPTIM0_BASE                (APB0PERIPH_BASE + 0x00000F00U)
    #define LPTIM1_BASE                (APB0PERIPH_BASE + 0x00000F40U)
    #define WDT_BASE                (APB0PERIPH_BASE + 0x00000F80U)
    #define PCA_BASE                (APB0PERIPH_BASE + 0x00001000U)
    #define RTC_BASE                (APB0PERIPH_BASE + 0x00001400U)

    //===时钟校准
    #define TRIM_BASE                (APB0PERIPH_BASE + 0x00001800U)
    #define RCC_BASE                (APB0PERIPH_BASE + 0x00002000U)
    #define BGR_BASE                (APB0PERIPH_BASE + 0x00002400U)
    #define ADC0_BASE                (APB0PERIPH_BASE + 0x00002404U)
    #define ADC_BASE                (APB0PERIPH_BASE + 0x00002404U)
    #define VC_BASE                    (APB0PERIPH_BASE + 0x00002410U)
    #define OPA_BASE                (APB0PERIPH_BASE + 0x00002430U)
    #define LVD_BASE                (APB0PERIPH_BASE + 0x00002428U)
    #define DAC0_BASE                (APB0PERIPH_BASE + 0x00002500U)
    #define DAC_BASE                (APB0PERIPH_BASE + 0x00002500U)
    #define TIM4_BASE                (APB0PERIPH_BASE + 0x00003000U)
    #define TIM5_BASE                (APB0PERIPH_BASE + 0x00003400U)
    #define TIM6_BASE                (APB0PERIPH_BASE + 0x00003800U)

    #define LPUART1_BASE            (APB0PERIPH_BASE + 0x00004000U)
    #define I2C1_BASE                (APB0PERIPH_BASE + 0x00004400U)
    #define SPI1_BASE                (APB0PERIPH_BASE + 0x00004800U)
    #define RNG_BASE                (APB0PERIPH_BASE + 0x00004C00U)
    #define PCNT_BASE                (APB0PERIPH_BASE + 0x00005400U)
    #define TIM3_BASE                (APB0PERIPH_BASE + 0x00005800U)
    #define LCD_BASE                (APB0PERIPH_BASE + 0x00005C00U)
    #define UART2_BASE                (APB0PERIPH_BASE + 0x00006000U)
    #define UART3_BASE                (APB0PERIPH_BASE + 0x00006400U)

    #define FLASH_CTR_BASE            (APB0PERIPH_BASE + 0x00020000U)
    #define RAM_CTR_BASE            (APB0PERIPH_BASE + 0x00020400U)
    #define CRC_BASE                (APB0PERIPH_BASE + 0x00020900U)
    #define DMAC_BASE                (APB0PERIPH_BASE + 0x00021000U)
    #define AES_BASE                (APB0PERIPH_BASE + 0x00021400U)

    //===端口功能选择寄存器
    #define GPIOA_SEL_BASE            (APB0PERIPH_BASE + 0x00020C00U)
    #define GPIOB_SEL_BASE            (APB0PERIPH_BASE + 0x00020C40U)
    #define GPIOC_SEL_BASE            (APB0PERIPH_BASE + 0x00020C80U)
    #define GPIOD_SEL_BASE            (APB0PERIPH_BASE + 0x00020CC0U)

    #define GPIOE_SEL_BASE            (APB0PERIPH_BASE + 0x00021C00U)
    #define GPIOF_SEL_BASE            (APB0PERIPH_BASE + 0x00021C40U)

    //===端口特殊功能,辅助功能寄存器
    #define GPIO_AF_BASE            (APB0PERIPH_BASE + 0x00020F04U)

//===定义端口功能
    #define GPIOA                    ((GPIO_TypeDef *) GPIOA_BASE)
    #define GPIOB                    ((GPIO_TypeDef *) GPIOB_BASE)
    #define GPIOC                    ((GPIO_TypeDef *) GPIOC_BASE)
    #define GPIOD                    ((GPIO_TypeDef *) GPIOD_BASE)
    #define GPIOE                    ((GPIO_TypeDef *) GPIOE_BASE)
    #define GPIOF                    ((GPIO_TypeDef *) GPIOF_BASE)

    #define GPIO_SELA                ((GPIO_SEL_TypeDef *) GPIOA_BASE)
    #define GPIO_SELB                ((GPIO_SEL_TypeDef *) GPIOB_BASE)
    #define GPIO_SELC                ((GPIO_SEL_TypeDef *) GPIOC_BASE)
    #define GPIO_SELD                ((GPIO_SEL_TypeDef *) GPIOD_BASE)
    #define GPIO_SELE                ((GPIO_SEL_TypeDef *) GPIOE_BASE)
    #define GPIO_SELF                ((GPIO_SEL_TypeDef *) GPIOF_BASE)

#pragma region GPIO
    //===端口复用功能配置寄存器
    typedef struct
    {
        __IO uint32_t SEL00;        //---端口选择功能
        __IO uint32_t SEL01;        //---端口选择功能
        __IO uint32_t SEL02;        //---端口选择功能
        __IO uint32_t SEL03;        //---端口选择功能
        __IO uint32_t SEL04;        //---端口选择功能
        __IO uint32_t SEL05;        //---端口选择功能
        __IO uint32_t SEL06;        //---端口选择功能
        __IO uint32_t SEL07;        //---端口选择功能
        __IO uint32_t SEL08;        //---端口选择功能
        __IO uint32_t SEL09;        //---端口选择功能
        __IO uint32_t SEL10;        //---端口选择功能
        __IO uint32_t SEL11;        //---端口选择功能
        __IO uint32_t SEL12;        //---端口选择功能
        __IO uint32_t SEL13;        //---端口选择功能
        __IO uint32_t SEL14;        //---端口选择功能
        __IO uint32_t SEL15;        //---端口选择功能
    } GPIO_SEL_TypeDef;

    //===端口通用功能配置寄存器
    typedef struct
    {
        __IO uint32_t DIR;        //---配置输入输出模式模式
        __IO uint32_t IDR;        //---输入数据寄存器
        __IO uint32_t ODR;        //---输出数据寄存器
        __IO uint32_t ADS;        //---数模配置寄存器
        __IO uint32_t BSET;        //---置位寄存器
        __IO uint32_t BCLR;        //---清零寄存器
        __IO uint32_t BSETCLR;    //---置位清零寄存器

        __IO uint32_t DRIVER;    //---驱动能力寄存器
        __IO uint32_t PU;        //---上拉使能寄存器
        __IO uint32_t PD;        //---下拉使能寄存器
        __IO uint32_t OD;        //---开漏输出寄存器
    } GPIO_TypeDef;

    //===端口辅助功能配置寄存器
    typedef struct
    {
        __IO uint32_t CTRL1;    //---端口辅助功能配置寄存器1
        __IO uint32_t CTRL2;    //---端口辅助功能配置寄存器1
        __IO uint32_t TIMGS;    //---端口辅助定时器门控选择
        __IO uint32_t TIMES;    //---端口辅助定时器ETR控选择
        __IO uint32_t TIMCPS;    //---端口辅助定时器输入捕获选择
        __IO uint32_t PCAS;        //---端口辅助PCA捕获选择
        __IO uint32_t PCNTS;    //---端口辅助PCNT脉冲输入选择
    } GPIO_AF_TypeDef;

    #define GPIO_AF_CTRL1_IR_POS            14
    #define GPIO_AF_CTRL1_IR_MASK            (0x01UL<<GPIO_AF_CTRL1_IR_POS)
    #define GPIO_AF_CTRL1_IR                GPIO_AF_CTRL1_IR_MASK

    #define GPIO_AF_CTRL1_HCLK_EN_POS        13
    #define GPIO_AF_CTRL1_HCLK_EN_MASK        (0x01UL<<GPIO_AF_CTRL1_HCLK_EN_POS)
    #define GPIO_AF_CTRL1_HCLK_EN            GPIO_AF_CTRL1_HCLK_EN_MASK

    #define GPIO_AF_CTRL1_PCLK_EN_POS        13
    #define GPIO_AF_CTRL1_PCLK_EN_MASK        (0x01UL<<GPIO_AF_CTRL1_PCLK_EN_POS)
    #define GPIO_AF_CTRL1_PCLK_EN            GPIO_AF_CTRL1_PCLK_EN_MASK

    #define GPIO_AF_CTRL1_HCLK_SEL_POS        10
    #define GPIO_AF_CTRL1_HCLK_SEL_MASK        (0x03UL<<GPIO_AF_CTRL1_HCLK_SEL_POS)
    #define GPIO_AF_CTRL1_HCLK_SEL            GPIO_AF_CTRL1_HCLK_SEL_MASK

    #define GPIO_AF_CTRL1_HCLK_PRS_1        (0x00UL<<GPIO_AF_CTRL1_HCLK_SEL_POS)
    #define GPIO_AF_CTRL1_HCLK_PRS_2        (0x01UL<<GPIO_AF_CTRL1_HCLK_SEL_POS)
    #define GPIO_AF_CTRL1_HCLK_PRS_4        (0x02UL<<GPIO_AF_CTRL1_HCLK_SEL_POS)
    #define GPIO_AF_CTRL1_HCLK_PRS_8        (0x03UL<<GPIO_AF_CTRL1_HCLK_SEL_POS)

    #define GPIO_AF_CTRL1_PCLK_SEL_POS        8
    #define GPIO_AF_CTRL1_PCLK_SEL_MASK        (0x03UL<<GPIO_AF_CTRL1_PCLK_SEL_POS)
    #define GPIO_AF_CTRL1_PCLK_SEL            GPIO_AF_CTRL1_PCLK_SEL_MASK

    #define GPIO_AF_CTRL1_PCLK_PRS_1        (0x00UL<<GPIO_AF_CTRL1_PCLK_SEL_POS)
    #define GPIO_AF_CTRL1_PCLK_PRS_2        (0x01UL<<GPIO_AF_CTRL1_PCLK_SEL_POS)
    #define GPIO_AF_CTRL1_PCLK_PRS_4        (0x02UL<<GPIO_AF_CTRL1_PCLK_SEL_POS)
    #define GPIO_AF_CTRL1_PCLK_PRS_8        (0x03UL<<GPIO_AF_CTRL1_PCLK_SEL_POS)

    #define GPIO_AF_CTRL1_SPI0_SS_POS        4
    #define GPIO_AF_CTRL1_SPI0_SS_MASK        (0x0FUL<<GPIO_AF_CTRL1_SPI0_SS_POS)
    #define GPIO_AF_CTRL1_SPI0_SS            GPIO_AF_CTRL1_SPI0_SS_MASK

    #define GPIO_AF_CTRL1_EXT_CLK_POS        0
    #define GPIO_AF_CTRL1_EXT_CLK_MASK        (0x0FUL<<GPIO_AF_CTRL1_EXT_CLK_POS)
    #define GPIO_AF_CTRL1_EXT_CLK            GPIO_AF_CTRL1_EXT_CLK_MASK

    #define GPIO_AF_CTRL2_AHB_POS            15
    #define GPIO_AF_CTRL2_AHB_MASK            (0x01UL<<GPIO_AF_CTRL2_AHB_POS)
    #define GPIO_AF_CTRL2_AHB                GPIO_AF_CTRL2_AHB_MASK

    #define GPIO_AF_CTRL2_TCLK_DIV_POS        6
    #define GPIO_AF_CTRL2_TCLK_DIV_MASK        (0x03UL<<GPIO_AF_CTRL2_TCLK_DIV_POS)
    #define GPIO_AF_CTRL2_TCLK_DIV            GPIO_AF_CTRL2_TCLK_DIV_MASK

    #define GPIO_AF_CTRL2_TCLK_SEL_POS        4
    #define GPIO_AF_CTRL2_TCLK_SEL_MASK        (0x03UL<<GPIO_AF_CTRL2_TCLK_SEL_POS)
    #define GPIO_AF_CTRL2_TCLK_SEL            GPIO_AF_CTRL2_TCLK_SEL_MASK

    #define GPIO_AF_CTRL2_SPI1_SS_POS        0
    #define GPIO_AF_CTRL2_SPI1_SS_MASK        (0x0FUL<<GPIO_AF_CTRL2_SPI1_SS_POS)
    #define GPIO_AF_CTRL2_SPI1_SS            GPIO_AF_CTRL2_SPI1_SS_MASK

    //===端口定时器门控选择
    #define GPIO_AF_TIMGS_LPTIM0_POS        12
    #define GPIO_AF_TIMGS_LPTIM0_MASK        (0x07UL<<GPIO_AF_TIMGS_LPTIM0_POS)
    #define GPIO_AF_TIMGS_LPTIM0            GPIO_AF_TIMGS_LPTIM0_MASK

    #define GPIO_AF_TIMGS_TIM3_POS            9
    #define GPIO_AF_TIMGS_TIM3_MASK            (0x07UL<<GPIO_AF_TIMGS_TIM3_POS)
    #define GPIO_AF_TIMGS_TIM3                GPIO_AF_TIMGS_TIM3_MASK

    #define GPIO_AF_TIMGS_TIM2_POS            6
    #define GPIO_AF_TIMGS_TIM2_MASK            (0x07UL<<GPIO_AF_TIMGS_TIM2_POS)
    #define GPIO_AF_TIMGS_TIM2                GPIO_AF_TIMGS_TIM2_MASK

    #define GPIO_AF_TIMGS_TIM1_POS            3
    #define GPIO_AF_TIMGS_TIM1_MASK            (0x07UL<<GPIO_AF_TIMGS_TIM1_POS)
    #define GPIO_AF_TIMGS_TIM1                GPIO_AF_TIMGS_TIM1_MASK

    #define GPIO_AF_TIMGS_TIM0_POS            0
    #define GPIO_AF_TIMGS_TIM0_MASK            (0x07UL<<GPIO_AF_TIMGS_TIM0_POS)
    #define GPIO_AF_TIMGS_TIM0                GPIO_AF_TIMGS_TIM0_MASK

    //===定时器ETR输入选择
    #define GPIO_AF_TIMES_LPTIM0_POS        12
    #define GPIO_AF_TIMES_LPTIM0_MASK        (0x07UL<<GPIO_AF_TIMES_LPTIM0_POS)
    #define GPIO_AF_TIMES_LPTIM0            GPIO_AF_TIMES_LPTIM0_MASK

    #define GPIO_AF_TIMES_TIM3_POS            9
    #define GPIO_AF_TIMES_TIM3_MASK            (0x07UL<<GPIO_AF_TIMES_TIM3_POS)
    #define GPIO_AF_TIMES_TIM3                GPIO_AF_TIMES_TIM3_MASK

    #define GPIO_AF_TIMES_TIM2_POS            6
    #define GPIO_AF_TIMES_TIM2_MASK            (0x07UL<<GPIO_AF_TIMES_TIM2_POS)
    #define GPIO_AF_TIMES_TIM2                GPIO_AF_TIMES_TIM2_MASK

    #define GPIO_AF_TIMES_TIM1_POS            3
    #define GPIO_AF_TIMES_TIM1_MASK            (0x07UL<<GPIO_AF_TIMES_TIM1_POS)
    #define GPIO_AF_TIMES_TIM1                GPIO_AF_TIMES_TIM1_MASK

    #define GPIO_AF_TIMES_TIM0_POS            0
    #define GPIO_AF_TIMES_TIM0_MASK            (0x07UL<<GPIO_AF_TIMES_TIM0_POS)
    #define GPIO_AF_TIMES_TIM0                GPIO_AF_TIMES_TIM0_MASK

    //===输入捕捉通道选择
    #define GPIO_AF_TIMCPS_TIM3_CH0B_POS    12
    #define GPIO_AF_TIMCPS_TIM3_CH0B_MASK    (0x07UL<<GPIO_AF_TIMCPS_TIM3_CH0B_POS)
    #define GPIO_AF_TIMCPS_TIM3_CH0B        GPIO_AF_TIMCPS_TIM3_CH0B_MASK

    #define GPIO_AF_TIMCPS_TIM3_CH0A_POS    9
    #define GPIO_AF_TIMCPS_TIM3_CH0A_MASK    (0x07UL<<GPIO_AF_TIMCPS_TIM3_CH0A_POS)
    #define GPIO_AF_TIMCPS_TIM3_CH0A        GPIO_AF_TIMCPS_TIM3_CH0A_MASK

    #define GPIO_AF_TIMCPS_TIM2_CH0A_POS    6
    #define GPIO_AF_TIMCPS_TIM2_CH0A_MASK    (0x07UL<<GPIO_AF_TIMCPS_TIM2_CH0A_POS)
    #define GPIO_AF_TIMCPS_TIM2_CH0A        GPIO_AF_TIMCPS_TIM2_CH0A_MASK

    #define GPIO_AF_TIMCPS_TIM1_CH0A_POS    3
    #define GPIO_AF_TIMCPS_TIM1_CH0A_MASK    (0x07UL<<GPIO_AF_TIMCPS_TIM1_CH0A_POS)
    #define GPIO_AF_TIMCPS_TIM1_CH0A        GPIO_AF_TIMCPS_TIM1_CH0A_MASK

    #define GPIO_AF_TIMCPS_TIM0_CH0A_POS    0
    #define GPIO_AF_TIMCPS_TIM0_CH0A_MASK    (0x07UL<<GPIO_AF_TIMCPS_TIM0_CH0A_POS)
    #define GPIO_AF_TIMCPS_TIM0_CH0A        GPIO_AF_TIMCPS_TIM0_CH0A_MASK

    //===PCA捕获选择
    #define GPIO_AF_PCAS_LPTIM1_ETR_POS        9
    #define GPIO_AF_PCAS_LPTIM1_ETR_MASK    (0x07UL<<GPIO_AF_PCAS_LPTIM1_ETR_POS)
    #define GPIO_AF_PCAS_LPTIM1_ETR            GPIO_AF_PCAS_LPTIM1_ETR_MASK

    #define GPIO_AF_PCAS_LPTIM1_GATE_POS    6
    #define GPIO_AF_PCAS_LPTIM1_GATE_MASK    (0x07UL<<GPIO_AF_PCAS_LPTIM1_GATE_POS)
    #define GPIO_AF_PCAS_LPTIM1_GATE        GPIO_AF_PCAS_LPTIM1_GATE_MASK

    #define GPIO_AF_PCAS_PCA_EC1_POS        3
    #define GPIO_AF_PCAS_PCA_EC1_MASK        (0x07UL<<GPIO_AF_PCAS_PCA_EC1_POS)
    #define GPIO_AF_PCAS_PCA_EC1            GPIO_AF_PCAS_PCA_EC1_MASK
    
    #define GPIO_AF_PCAS_PCA_CH0_POS        0
    #define GPIO_AF_PCAS_PCA_CH0_MASK        (0x07UL<<GPIO_AF_PCAS_PCA_CH0_POS)
    #define GPIO_AF_PCAS_PCA_CH0            GPIO_AF_PCAS_PCA_CH0_MASK

    //===PCNT输入选择
    #define GPIO_AF_PCNTS_PCNT_S1_POS        2
    #define GPIO_AF_PCNTS_PCNT_S1_MASK        (0x03UL<<GPIO_AF_PCNTS_PCNT_S1_POS)
    #define GPIO_AF_PCNTS_PCNT_S1            GPIO_AF_PCNTS_PCNT_S1_MASK

    #define GPIO_AF_PCNTS_PCNT_S0_POS        0
    #define GPIO_AF_PCNTS_PCNT_S0_MASK        (0x03UL<<GPIO_AF_PCNTS_PCNT_S0_POS)
    #define GPIO_AF_PCNTS_PCNT_S0            GPIO_AF_PCNTS_PCNT_S0_MASK

#pragma endregion

 

#ifndef HC32L1XX_LL_GPIO_H_
#define HC32L1XX_LL_GPIO_H_

#ifdef __cplusplus
extern "C" {
#endif 
    
    #include "hc32l1xx.h"
    #include "string.h"
    ///
    //===GPIO的复用模式
    #define LL_GPIO_AF_0                    (0x0000000U) 
    #define LL_GPIO_AF_1                    (0x0000001U) 
    #define LL_GPIO_AF_2                    (0x0000002U) 
    #define LL_GPIO_AF_3                    (0x0000003U) 
    #define LL_GPIO_AF_4                    (0x0000004U) 
    #define LL_GPIO_AF_5                    (0x0000005U) 
    #define LL_GPIO_AF_6                    (0x0000006U) 
    #define LL_GPIO_AF_7                    (0x0000007U) 
    #define LL_GPIO_AF_8                    (0x0000008U) 
    #define LL_GPIO_AF_9                    (0x0000009U) 
    #define LL_GPIO_AF_10                    (0x000000AU) 
    #define LL_GPIO_AF_11                    (0x000000BU) 
    #define LL_GPIO_AF_12                    (0x000000CU) 
    #define LL_GPIO_AF_13                    (0x000000DU) 
    #define LL_GPIO_AF_14                    (0x000000EU) 
    #define LL_GPIO_AF_15                    (0x000000FU) 

    //===选择PIN的序号
    #define LL_GPIO_PIN_0                    (0x1U<<0)
    #define LL_GPIO_PIN_1                    (0x1U<<1)
    #define LL_GPIO_PIN_2                    (0x1U<<2)
    #define LL_GPIO_PIN_3                    (0x1U<<3)
    #define LL_GPIO_PIN_4                    (0x1U<<4)
    #define LL_GPIO_PIN_5                   (0x1U<<5)
    #define LL_GPIO_PIN_6                   (0x1U<<6)
    #define LL_GPIO_PIN_7                   (0x1U<<7)
    #define LL_GPIO_PIN_8                   (0x1U<<8)
    #define LL_GPIO_PIN_9                   (0x1U<<9)
    #define LL_GPIO_PIN_10                  (0x1U<<10)
    #define LL_GPIO_PIN_11                  (0x1U<<11)
    #define LL_GPIO_PIN_12                  (0x1U<<12)
    #define LL_GPIO_PIN_13                  (0x1U<<13)
    #define LL_GPIO_PIN_14                  (0x1U<<14)
    #define LL_GPIO_PIN_15                  (0x1U<<15)
    #define LL_GPIO_PIN_ALL                 (LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_3\
                                            LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7\
                                            LL_GPIO_PIN_8|LL_GPIO_PIN_9|LL_GPIO_PIN_10|LL_GPIO_PIN_11\
                                            LL_GPIO_PIN_12|LL_GPIO_PIN_13|LL_GPIO_PIN_14|LL_GPIO_PIN_15)

    //===GPIO模式
    #define LL_GPIO_MODE_ANALOG              0x00000000U
    #define LL_GPIO_MODE_FLOATING            0x00000001U
    #define LL_GPIO_MODE_INPUT               0x00000002U
    #define LL_GPIO_MODE_OUTPUT              0x00000003U
    #define LL_GPIO_MODE_ALTERNATE           0x00000004U

    //===GPIO输出模式
    #define LL_GPIO_OUTPUT_PUSHPULL          0x00000000U           
    #define LL_GPIO_OUTPUT_OPENDRAIN         0x00000001U           

    //===GPIO输出评率
    #define LL_GPIO_MODE_OUTPUT_10MHz        0x00000000U          
    #define LL_GPIO_MODE_OUTPUT_2MHz         0x00000001U          
    #define LL_GPIO_MODE_OUTPUT_50MHz        0x00000002U          

    //===GPIO熟读设置
    #define LL_GPIO_SPEED_FREQ_LOW           LL_GPIO_MODE_OUTPUT_2MHz   
    #define LL_GPIO_SPEED_FREQ_MEDIUM        LL_GPIO_MODE_OUTPUT_10MHz  
    #define LL_GPIO_SPEED_FREQ_HIGH          LL_GPIO_MODE_OUTPUT_50MHz  

    //===GPIO上下拉模式
    #define LL_GPIO_PULL_NO                  0x00000000U    
    #define LL_GPIO_PULL_DOWN                0x00000001U    
    #define LL_GPIO_PULL_UP                  0x00000002U    

    //===驱动能力配置
    #define LL_GPIO_DRIVER_HIGH                0
    #define LL_GPIO_DRIVER_LOW                1

    //===端口功能复用
    #define LL_GPIO_AF_MASK                    0x00000007U

    ///
    //函        数:
    //功        能: 读取端口输入信息
    //输入参    数:
    //输出参    数:
    //说        明:
    //
    static inline uint32_t LL_GPIO_ReadInputPort(GPIO_TypeDef* GPIOx)
    {
        return (uint32_t)(READ_REG(GPIOx->IDR));
    }

    ///
    //函        数:
    //功        能: 读取指定端口输入信息
    //输入参    数:
    //输出参    数: 1---高电平,0---低电平
    //说        明:
    //
    static inline uint32_t LL_GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, uint32_t PinMask)
    {
        return ((READ_BIT(GPIOx->IDR,PinMask)!=0)?1:0);
    }

    ///
    //函        数:
    //功        能: 设置端口输出信息
    //输入参    数:
    //输出参    数:
    //说        明:
    //
    static inline void LL_GPIO_WriteOutputPort(GPIO_TypeDef* GPIOx, uint32_t PortValue)
    {
        WRITE_REG(GPIOx->ODR, PortValue);
    }

    ///
    //函        数:
    //功        能: 读取端口输出信息
    //输入参    数:
    //输出参    数:
    //说        明:
    //
    static inline uint32_t LL_GPIO_ReadOutputPort(GPIO_TypeDef* GPIOx)
    {
        return (uint32_t)(READ_REG(GPIOx->ODR));
    }

    ///
    //函        数:
    //功        能: 指定端口输出高电平
    //输入参    数:
    //输出参    数:
    //说        明:
    //
    static inline void LL_GPIO_SetOutputPin(GPIO_TypeDef* GPIOx, uint32_t PinMask)
    {
        WRITE_REG(GPIOx->BSETCLR, PinMask<<16);
    }

    ///
    //函        数:
    //功        能: 指定端口输出低电平
    //输入参    数:
    //输出参    数:
    //说        明:
    //
    static inline void LL_GPIO_ResetOutputPin(GPIO_TypeDef* GPIOx, uint32_t PinMask)
    {
        WRITE_REG(GPIOx->BSETCLR, PinMask);
    }

    ///
    //函        数:
    //功        能: 指定端口输出取反输出
    //输入参    数:
    //输出参    数:
    //说        明:
    //
    static inline void LL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint32_t PinMask)
    {
        WRITE_REG(GPIOx->ODR, READ_REG(GPIOx->ODR) ^ PinMask);
    }

    ///
    //函        数:
    //功        能: 设置端口的输入输出模式
    //输入参    数: LL_GPIO_MODE_OUTPUT,LL_GPIO_MODE_INPUT
    //输出参    数:
    //说        明:
    //
    static inline void LL_GPIO_SetPinMode(GPIO_TypeDef* GPIOx, uint32_t Pin, uint32_t Mode)
    {
        if (Mode==LL_GPIO_MODE_OUTPUT)
        {
            CLEAR_BIT(GPIOx->DIR, Pin);
        }
        else
        {
            SET_BIT(GPIOx->DIR, Pin);
        }
    }

    ///
    //函        数:
    //功        能: 获取端口的输入输出模式
    //输入参    数: 
    //输出参    数: LL_GPIO_MODE_OUTPUT,LL_GPIO_MODE_INPUT
    //说        明:
    //
    static inline uint32_t LL_GPIO_GetPinMode(GPIO_TypeDef* GPIOx, uint32_t Pin)
    {
        return (uint32_t)(READ_BIT(GPIOx->DIR, Pin));
    }

    ///
    //函        数:
    //功        能: 调试端口复用为SWD模式
    //输入参    数:
    //输出参    数:
    //说        明:
    //
    static inline void LL_GPIO_Debug_AF_SWD(void)
    {
        CLEAR_BIT(RCC->CR1, RCC_CR1_SWD_AF);
    }

    ///
    //函        数:
    //功        能: 调试端口复用为GPIO模式
    //输入参    数:
    //输出参    数:
    //说        明:
    //
    static inline void LL_GPIO_Debug_AF_GPIO(void)
    {
        SET_BIT(RCC->CR1, RCC_CR1_SWD_AF);
    }    

    //===GPIO初始化结构体
    typedef struct
    {
        uint32_t Pin;                         //---引脚            
        uint32_t Mode;                        //---模式
        uint32_t Speed;                        //---速度
        uint32_t OutputType;                //---输出模式
        uint32_t Pull;                        //---上下拉模式
        uint32_t Alternate;                    //---复用模式
        uint32_t DriverLevel;                //---驱动能力
    } LL_GPIO_InitTypeDef;
    
    //===函数定义
    uint8_t LL_GPIO_Init(GPIO_TypeDef* GPIOx, LL_GPIO_InitTypeDef* GPIO_InitStruct);

    ///
#ifdef __cplusplus
}
#endif 

#endif /* HC32L1XX_LL_GPIO_H */

#include "hc32l1xx_ll_gpio.h"

///
//函        数:
//功        能: 端口复用模式的初始化
//输入参    数:
//输出参    数:
//说        明:
//
uint8_t LL_GPIO_SEL_Init(GPIO_TypeDef* GPIOx, LL_GPIO_InitTypeDef* GPIO_InitStruct)
{
    //---端口复用功能的配置寄存器
    GPIO_SEL_TypeDef* pSEl = (GPIO_SEL_TypeDef*)(((uint32_t*)GPIOx)- GPIO_SEL_OFFSET);
    //---依据端口序号,配置端口的复用模式
    switch (GPIO_InitStruct->Pin)
    {
        case LL_GPIO_PIN_0    :
        {
            WRITE_REG(pSEl->SEL00, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_1    :
        {
            WRITE_REG(pSEl->SEL01, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_2    :
        {
            WRITE_REG(pSEl->SEL02, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_3    :
        {
            WRITE_REG(pSEl->SEL03, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_4    :
        {
            WRITE_REG(pSEl->SEL04, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_5    :
        {
            WRITE_REG(pSEl->SEL05, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_6    :
        {
            WRITE_REG(pSEl->SEL06, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_7    :
        {
            WRITE_REG(pSEl->SEL07, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_8    :
        {
            WRITE_REG(pSEl->SEL08, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_9    :
        {
            WRITE_REG(pSEl->SEL09, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_10    :
        {
            WRITE_REG(pSEl->SEL10, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_11    :
        {
            WRITE_REG(pSEl->SEL11, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_12    :
        {
            WRITE_REG(pSEl->SEL12, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_13    :
        {
            WRITE_REG(pSEl->SEL13, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_14    :
        {
            WRITE_REG(pSEl->SEL14, GPIO_InitStruct->Alternate);
            break;
        }
        case LL_GPIO_PIN_15    :
        {
            WRITE_REG(pSEl->SEL15, GPIO_InitStruct->Alternate);
            break;
        }
        default:
        {
            memset(pSEl, 0x00UL, sizeof(GPIO_SEL_TypeDef) / sizeof(uint32_t));
            break;
        }
    }
    return 0;
}

///
//函        数: 
//功        能: 端口模式的初始化
//输入参数: 
//输出参数: 
//说        明: 
//
uint8_t LL_GPIO_Init(GPIO_TypeDef* GPIOx, LL_GPIO_InitTypeDef* GPIO_InitStruct)
{
    switch (GPIO_InitStruct->Mode)
    {
        case LL_GPIO_MODE_INPUT:
        {
            //---数模模式配置为数字模式
            CLEAR_BIT(GPIOx->ADS, GPIO_InitStruct->Pin);
            //---输入输出模式配置为输入模式
            SET_BIT(GPIOx->DIR, GPIO_InitStruct->Pin);
            break;
        }
        case LL_GPIO_MODE_OUTPUT:
        {
            //---数模模式配置为数字模式
            CLEAR_BIT(GPIOx->ADS, GPIO_InitStruct->Pin);
            //---输入输出模式配置为输出模式
            CLEAR_BIT(GPIOx->DIR, GPIO_InitStruct->Pin);
            break;
        }
        case LL_GPIO_MODE_ANALOG:
        case LL_GPIO_MODE_FLOATING:
        case LL_GPIO_MODE_ALTERNATE:
        default:
        {
            //---数模模式配置为模拟模式
            SET_BIT(GPIOx->ADS, GPIO_InitStruct->Pin);
            //---输入输出模式配置为输入模式
            SET_BIT(GPIOx->DIR, GPIO_InitStruct->Pin);
            //---上拉不使能
            CLEAR_BIT(GPIOx->PU, GPIO_InitStruct->Pin);
            //---下拉不使能
            CLEAR_BIT(GPIOx->PD, GPIO_InitStruct->Pin);
            //---低驱动能力
            SET_BIT(GPIOx->DRIVER, GPIO_InitStruct->Pin);
            break;
        }
    }
    //---上下拉配置和驱动能力配置
    if ((GPIO_InitStruct->Mode== LL_GPIO_MODE_INPUT)||
        (GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT))
    {
        //---上下拉配置
        if (GPIO_InitStruct->Pull==LL_GPIO_PULL_UP)
        {
            //---上拉使能
            SET_BIT(GPIOx->PU, GPIO_InitStruct->Pin);
            //---下拉不使能
            CLEAR_BIT(GPIOx->PD, GPIO_InitStruct->Pin);
        }
        else if (GPIO_InitStruct->Pull == LL_GPIO_PULL_DOWN)
        {
            //---上拉不使能
            CLEAR_BIT(GPIOx->PU, GPIO_InitStruct->Pin);
            //---下拉使能
            SET_BIT(GPIOx->PD, GPIO_InitStruct->Pin);
        }
        else
        {
            //---上拉不使能
            CLEAR_BIT(GPIOx->PU, GPIO_InitStruct->Pin);
            //---下拉不使能
            CLEAR_BIT(GPIOx->PD, GPIO_InitStruct->Pin);
        }
        //---驱动能力配置
        if (GPIO_InitStruct->DriverLevel == LL_GPIO_DRIVER_HIGH)
        {
            //---高驱动能力
            CLEAR_BIT(GPIOx->DRIVER, GPIO_InitStruct->Pin);
        }
        else
        {
            //---低驱动能力
            SET_BIT(GPIOx->DRIVER, GPIO_InitStruct->Pin);
        }
    }
    //---输出模式
    if (GPIO_InitStruct->OutputType== LL_GPIO_OUTPUT_PUSHPULL)
    {
        //---推挽输出
        CLEAR_BIT(GPIOx->OD, GPIO_InitStruct->Pin);
    }
    else
    {
        //---开漏输出
        SET_BIT(GPIOx->OD, GPIO_InitStruct->Pin);
    }
    //---复用模式设置
    LL_GPIO_SEL_Init(GPIOx, GPIO_InitStruct);
    return 0;
}

///
//函        数:
//功        能: 端口模式的注销
//输入参    数:
//输出参    数:
//说        明: 数字输入,上下拉功能不使能
//
uint8_t LL_GPIO_DeInit(GPIO_TypeDef* GPIOx,uint32_t Pin)
{
    LL_GPIO_InitTypeDef GPIO_InitStruct = { 0 };
    GPIO_InitStruct.Pin = Pin;
    GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
    GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
    GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
    GPIO_InitStruct.DriverLevel = LL_GPIO_DRIVER_HIGH;
    GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
    LL_GPIO_Init(GPIOx, &GPIO_InitStruct);
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值