///
//函 数:
//功 能: 获取端口的输入输出模式
//输入参 数:
//输出参 数: 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;
}
///
//函 数:
//功 能: 获取端口的输入输出模式
//输入参 数:
//输出参 数: 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;
}
举报