- /*****************************************************************************//*!
- * @ 通过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 */
|