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;
}
标签:LL,HC32L17x,BASE,InitStruct,GPIO,uint32,define 来源: https://blog.csdn.net/childbor/article/details/121675221