/*****************************************************************************//*!
* @ 通过GPIO_Pin初始化GPIO端口指定的单个引脚
*
* @ 输入 GPIO_Pin GPIO引脚名字
* @ 输入 GPIO_PinConfig 配置输入和输出
*
* @ 无返回
*****************************************************************************/
void GPIO_PinInit(GPIO_PinType GPIO_Pin, GPIO_PinConfigType GPIO_PinConfig)
{
/*完整性核对*/
ASSERT(GPIO_Pin <= GPIO_PTI7);
/*配置GPIO上拉*/
#if defined(CPU_NV32)
if (GPIO_Pin < GPIO_PTE0) /*GPIOA寄存器分配位*/
{
switch (GPIO_PinConfig)
{
case GPIO_PinOutput: /*GPIO端口设置为输出*/
GPIOA->PDDR |= (1<<GPIO_Pin); /*使能端口数据方向寄存器,引脚配置为输出*/
GPIOA->PIDR |= (1<<GPIO_Pin); /* 置位端口输入禁用寄存器,引脚未配置为通用输入 */
PORT->PUEL &= ~(1<<GPIO_Pin); /*禁用上拉*/
break;
case GPIO_PinInput: /*GPIO端口配置为输入*/
GPIOA->PDDR &= ~(1<<GPIO_Pin); /* 复位端口数据方向寄存器,引脚配置为通用输入 */
GPIOA->PIDR &= ~(1<<GPIO_Pin); /* 清除端口输入禁用寄存器,引脚配置为通用输入 */
PORT->PUEL &= ~(1<<GPIO_Pin); /* 禁用上拉 */
break;
case GPIO_PinInput_InternalPullup: /*GPIO端口配置为输入内部上拉*/
GPIOA->PDDR &= ~(1<<GPIO_Pin); /* 复位端口数据方向寄存器,引脚配置为通用输入 */
GPIOA->PIDR &= ~(1<<GPIO_Pin); /* 清除端口输入禁用寄存器,引脚配置为通用输入 */
PORT->PUEL |= (1<<GPIO_Pin); /*使能内部上拉*/
break;
case GPIO_PinOutput_HighCurrent: /*GPIO端口配置为输出,高电流驱动*/
GPIOA->PDDR |= (1<<GPIO_Pin); /*使能端口数据方向寄存器,引脚配置为输出*/
GPIOA->PIDR |= (1<<GPIO_Pin); /* 置位端口输入禁用寄存器,引脚未配置为通用输入*/
PORT->PUEL &= ~(1<<GPIO_Pin); /*禁用内部上拉*/
break;
}
}
else if (GPIO_Pin < GPIO_PTI0)
{
GPIO_Pin = (GPIO_PinType)(GPIO_Pin - 32); /*GPIOB寄存器分配位*/
switch (GPIO_PinConfig)
{
case GPIO_PinOutput: /*GPIO端口配置为输出*/
GPIOB->PDDR |= (1<<GPIO_Pin); /*使能数据方向寄存器,引脚配置为通用输出*/
GPIOB->PIDR |= (1<<GPIO_Pin); /*置位端口输入禁用寄存器,引脚未配置为通用输入*/
PORT->PUEH &= ~(1<<GPIO_Pin); /*禁用上拉输入*/
break;
case GPIO_PinInput: /*GPIO端口配置为输入*/
GPIOB->PDDR &= ~(1<<GPIO_Pin); /*复位端口数据方向寄存器,引脚配置为通用输入*/
GPIOB->PIDR &= ~(1<<GPIO_Pin); /*清除端口输入禁用寄存器,引脚配置为通用输入 */
PORT->PUEH &= ~(1<<GPIO_Pin); /*禁用上拉*/
break;
case GPIO_PinInput_InternalPullup: /*GPIO设置为输出内部上拉*/
GPIOB->PDDR &= ~(1<<GPIO_Pin); /* 复位端口数据方向寄存器,引脚配置为通用输入 */
GPIOB->PIDR &= ~(1<<GPIO_Pin); /*清除端口输入禁用寄存器,引脚配置为通用输入 */
PORT->PUEH |= (1<<GPIO_Pin); /*使能上拉*/
break;
case GPIO_PinOutput_HighCurrent: /*GPIO配置为输出高电流驱动*/
GPIOB->PDDR |= (1<<GPIO_Pin); /*使能数据方向寄存器,引脚配置为通用输出*/
GPIOB->PIDR |= (1<<GPIO_Pin); /*置位端口输入禁用寄存器,引脚未配置为通用输入*/
PORT->PUEH &= ~(1<<GPIO_Pin); /*禁用上拉输入*/
break;
}
}
#endif
#if defined(CPU_NV32M3)
if (GPIO_Pin < GPIO_PTE0)
{
switch (GPIO_PinConfig)
{
case GPIO_PinOutput:
GPIOA->PDDR |= (1<<GPIO_Pin);
GPIOA->PIDR |= (1<<GPIO_Pin);
PORT->PUEL &= ~(1<<GPIO_Pin);
break;
case GPIO_PinInput:
GPIOA->PDDR &= ~(1<<GPIO_Pin);
GPIOA->PIDR &= ~(1<<GPIO_Pin);
PORT->PUEL &= ~(1<<GPIO_Pin);
break;
case GPIO_PinInput_InternalPullup:
GPIOA->PDDR &= ~(1<<GPIO_Pin);
GPIOA->PIDR &= ~(1<<GPIO_Pin);
PORT->PUEL |= (1<<GPIO_Pin);
case GPIO_PinOutput_HighCurrent:
GPIOA->PDDR |= (1<<GPIO_Pin);
GPIOA->PIDR |= (1<<GPIO_Pin);
PORT->PUEL &= ~(1<<GPIO_Pin);
break;
}
}
#endif
#if defined(CPU_NV32M4)
if (GPIO_Pin < GPIO_PTE0) /*GPIOA寄存器分配位*/
{
switch (GPIO_PinConfig)
{
case GPIO_PinOutput:
GPIOA->PDDR |= (1<<GPIO_Pin);
GPIOA->PIDR |= (1<<GPIO_Pin);
PORT->PUE0 &= ~(1<<GPIO_Pin);
break;
case GPIO_PinInput:
GPIOA->PDDR &= ~(1<<GPIO_Pin);
GPIOA->PIDR &= ~(1<<GPIO_Pin);
PORT->PUE0 &= ~(1<<GPIO_Pin);
break;
case GPIO_PinInput_InternalPullup:
GPIOA->PDDR &= ~(1<<GPIO_Pin);
GPIOA->PIDR &= ~(1<<GPIO_Pin);
PORT->PUE0 |= (1<<GPIO_Pin);
break;
case GPIO_PinOutput_HighCurrent:
GPIOA->PDDR |= (1<<GPIO_Pin);
GPIOA->PIDR |= (1<<GPIO_Pin);
PORT->PUE0 &= ~(1<<GPIO_Pin);
break;
}
}
else if (GPIO_Pin < GPIO_PTI0)
{
GPIO_Pin = (GPIO_PinType)(GPIO_Pin - 32); /*GPIOB寄存器分配位*/
switch (GPIO_PinConfig)
{
case GPIO_PinOutput:
GPIOB->PDDR |= (1<<GPIO_Pin);
GPIOB->PIDR |= (1<<GPIO_Pin);
PORT->PUE1 &= ~(1<<GPIO_Pin);
break;
case GPIO_PinInput:
GPIOB->PDDR &= ~(1<<GPIO_Pin);
GPIOB->PIDR &= ~(1<<GPIO_Pin);
PORT->PUE1 &= ~(1<<GPIO_Pin);
break;
case GPIO_PinInput_InternalPullup:
GPIOB->PDDR &= ~(1<<GPIO_Pin);
GPIOB->PIDR &= ~(1<<GPIO_Pin);
PORT->PUE1 |= (1<<GPIO_Pin);
break;
case GPIO_PinOutput_HighCurrent:
GPIOB->PDDR |= (1<<GPIO_Pin);
GPIOB->PIDR |= (1<<GPIO_Pin);
PORT->PUE1 &= ~(1<<GPIO_Pin);
break;
}
}
else
{
GPIO_Pin = (GPIO_PinType)(GPIO_Pin - 64); /*GPIOC寄存器分配位*/
switch (GPIO_PinConfig)
{
case GPIO_PinOutput:
GPIOC->PDDR |= (1<<GPIO_Pin);
GPIOC->PIDR |= (1<<GPIO_Pin);
PORT->PUE2 &= ~(1<<GPIO_Pin);
break;
case GPIO_PinInput:
GPIOC->PDDR &= ~(1<<GPIO_Pin);
GPIOC->PIDR &= ~(1<<GPIO_Pin);
PORT->PUE2 &= ~(1<<GPIO_Pin);
break;
case GPIO_PinInput_InternalPullup:
GPIOC->PDDR &= ~(1<<GPIO_Pin);
GPIOC->PIDR &= ~(1<<GPIO_Pin);
PORT->PUE2 |= (1<<GPIO_Pin);
break;
case GPIO_PinOutput_HighCurrent:
GPIOC->PDDR |= (1<<GPIO_Pin);
GPIOC->PIDR |= (1<<GPIO_Pin);
PORT->PUE2 &= ~(1<<GPIO_Pin);
break;
}
}
#endif
/*配置GPIO端口高强度驱动使能寄存器*/
if(GPIO_PinConfig == GPIO_PinOutput_HighCurrent) /*端口配置为输出,高电流驱动*/
{
#if defined(CPU_NV32M3)
switch (GPIO_Pin) /*选择端口*/
{
case GPIO_PTB5:
PORT->HDRVE |= PORT_HDRVE_PTB5_MASK; /*使能PB5端口高电流驱动*/
break;
case GPIO_PTC1:
PORT->HDRVE |= PORT_HDRVE_PTC1_MASK;
break;
case GPIO_PTC5:
PORT->HDRVE |= PORT_HDRVE_PTC5_MASK;
break;
default:
break;
}
#endif
#if defined(CPU_NV32M4) | defined(CPU_NV32)
switch (GPIO_Pin)
{
case GPIO_PTB4:
PORT->HDRVE |= PORT_HDRVE_PTB4_MASK;
break;
case GPIO_PTB5:
PORT->HDRVE |= PORT_HDRVE_PTB5_MASK;
break;
case GPIO_PTD0:
PORT->HDRVE |= PORT_HDRVE_PTD0_MASK;
break;
case GPIO_PTD1:
PORT->HDRVE |= PORT_HDRVE_PTD1_MASK;
break;
case GPIO_PTE0:
PORT->HDRVE |= PORT_HDRVE_PTE0_MASK;
break;
case GPIO_PTE1:
PORT->HDRVE |= PORT_HDRVE_PTE1_MASK;
break;
case GPIO_PTH0:
PORT->HDRVE |= PORT_HDRVE_PTH0_MASK;
break;
case GPIO_PTH1:
PORT->HDRVE |= PORT_HDRVE_PTH1_MASK;
break;
default:
break;
}
#endif
}
}
/*****************************************************************************//*!
* @ 通过GPIO_Pin,切换指定的单个引脚的输出
*
* @ 输入 GPIO_Pin 引脚名字
*
* @ 无返回
*
*****************************************************************************/
void GPIO_PinToggle(GPIO_PinType GPIO_Pin)
{
/*完整性核对 */
ASSERT(GPIO_Pin <= GPIO_PTI7);
if (GPIO_Pin < GPIO_PTE0)
{
/* PTA0-7, PTB0-7, PTC0-7, PTD0-7 */
GPIOA->PTOR = (1<<GPIO_Pin); /*端口切换输出寄存器置一,PDORn中对应位置为现有逻辑电平的反相电平*/
}
#if (defined(CPU_NV32) | defined(CPU_NV32M4))
else if (GPIO_Pin < GPIO_PTI0)
{
/* PTE0-7, PTF0-7, PTH0-7, PTI0-7 */
GPIO_Pin = (GPIO_PinType)(GPIO_Pin - GPIO_PTE0);
GPIOB->PTOR = (1<<GPIO_Pin);
}
#endif
#if defined(CPU_NV32M4)
else if(GPIO_Pin < GPIO_PIN_MAX)
{
/* PTI0-7 */
GPIO_Pin = (GPIO_PinType)(GPIO_Pin - GPIO_PTI0);
GPIOC->PTOR = (1<<GPIO_Pin);
}
#endif
}
/*****************************************************************************//*!
* @ 通过GPIO_Pin设置指定的单个GPIO端口逻辑电平为1
*
* @ 输入 GPIO_Pin 引脚名字
*
* @ 无返回
*
*****************************************************************************/
void GPIO_PinSet(GPIO_PinType GPIO_Pin)
{
/*完整性核对*/
ASSERT(GPIO_Pin <= GPIO_PTI7);
if (GPIO_Pin < GPIO_PTE0)
{
/* PTA0-7, PTB0-7, PTC0-7, PTD0-7 */
GPIOA->PSOR = (1<<GPIO_Pin); /*PDORn中的对应位位置为逻辑电平1*/
}
#if (defined(CPU_NV32) | defined(CPU_NV32M4))
else if (GPIO_Pin < GPIO_PTI0)
{
/* PTE0-7, PTF0-7, PTH0-7, PTI0-7 */
GPIO_Pin = (GPIO_PinType)(GPIO_Pin - GPIO_PTE0);
GPIOB->PSOR = (1<<GPIO_Pin);
}
#endif
#if defined(CPU_NV32M4)
else if(GPIO_Pin < GPIO_PIN_MAX)
{
/* PTI0-7 */
GPIO_Pin = (GPIO_PinType)(GPIO_Pin - GPIO_PTI0);
GPIOC->PSOR = (1<<GPIO_Pin);
}
#endif
}
/*****************************************************************************//*!
* @ 通过GPIO_Pin设置指定的单个GPIO端口逻辑电平为0
*
* @ 输入 GPIO_Pin 引脚名字
*
* @ 无返回
*
*****************************************************************************/
void GPIO_PinClear(GPIO_PinType GPIO_Pin)
{
/* Sanity check */
ASSERT(GPIO_Pin <= GPIO_PTI7);
if (GPIO_Pin < GPIO_PTE0)
{
/* PTA0-7, PTB0-7, PTC0-7, PTD0-7 */
GPIOA->PCOR = (1<<GPIO_Pin); /*PD0Rn中的对应位清零为逻辑电平0*/
}
#if (defined(CPU_NV32) | defined(CPU_NV32M4))
else if (GPIO_Pin < GPIO_PTI0)
{
/* PTE0-7, PTF0-7, PTH0-7, PTI0-7 */
GPIO_Pin = (GPIO_PinType)(GPIO_Pin - GPIO_PTE0);
GPIOB->PCOR = (1<<GPIO_Pin);
}
#endif
#if defined(CPU_NV32M4)
else if(GPIO_Pin < GPIO_PIN_MAX)
{
/* PTI0-7 */
GPIO_Pin = (GPIO_PinType)(GPIO_Pin - GPIO_PTI0);
GPIOC->PCOR = (1<<GPIO_Pin);
}
#endif
}
/*! @} End of gpio_api_list */
|