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->PullLL_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;
}

上一篇:windows平台的分布式微服务解决方案(2)--跨域访问


下一篇:javascript 浏览器定位