GPIO

外设特性

../../_images/kiwi-gpio-banks.png
  • GPIO按照功能特性分为4组(Bank)

    • GPIOA: GPIO 00-21, 数字双向IO, 驱动能力 20mA, 耐压 IOVCC

    ../../_images/kiwi-gpio-bank-A.png
    • GPIOB: GPIO 22-23, 数字双向IO, 驱动能力 8mA, 耐压 5V

    ../../_images/kiwi-gpio-bank-B.png
    • GPIOC: GPIO 24-26, MIC ADC模拟IO,可复用为与GPIOA Bank同规格的数字双向IO

    • GPIOD: GPIO 27-28, PA功率IO, 驱动电压 5V。GPIOD可作为数字IO复用,但仅具备有限的功能。

GPIOA、GPIOB、GPIOC作为数字IO使用时都具备输入、输出、上拉、下拉能力,并支持输入、输出反向和出入环路功能。

备注

GPIOD Bank即GPIO27/28作为数字IO使用时,仅具备输出能力,不支持输入、上拉和下拉功能。 同样不支持需要满足数字输入端口前提条件的功能复用,如GPIO中断触发、作为外部时钟信号的输入端口等。 详情请参考 GPIO MFP信息


外设使用

典型使用场景

GPIO管脚根据使用方式,可以划分为以下典型场景:

A. 作为常规数字端口

../../_images/kiwi-gpio-irq.png

SPV1x SoC支持选择最多4路GPIO数字输入端口开启电平信号触发中断的功能(上图所示):

B. 根据MFP映射为外设端口

详情请参考指定外设单元的使用指南。

../../_images/kiwi-gpio-mfp.png

C. 作为ADC的模拟输入端口

详情请参考 GPADC 章节内容。

D. 作为外部时钟源信号输入端口

  • 用户从GPIO00-26中选择一路端口作为外部时钟源数字信号的输入口。

  • 配置相应的CTL寄存器,开启常规数字IO输入功能(CTL.IE = 1)。

  • 配置 GPIO外部时钟输入控制寄存器ECLK 中ECLK.SEL,选择相同的GPIO端口号。

  • 配置ECLK.EN = 1,选通从选定端口进入的外部时钟信号输入。

详情请参考 时钟源 章节内容。

E. ONOFF特殊功能端口

详情请参考 ONOFF多功能单元 章节内容。

特殊预设场景

警告

以下描述为SPV1x SoC特定GPIO的预设功能,对SoC的正常上电引导、复位、器件供电、低功耗设计等方面有重大作用, 请在进行PCB方案设计前务必参考该部分信息。

GPIO端口

预设功能

注意事项

GPIO6

BROM升级请求引脚

电平敏感,BROM运行阶段程序开启上拉,应保持常态高电平。

GPIO10

NOR Flash SCK信号引脚

NOR Flash默认工作于Single/Dual SPI Mode,用户需保证NOR Flash HOLD管脚保持于高电平。

GPIO11

NOR Flash NSS信号引脚

此GPIO端口在低功耗休眠模式(Hibernate)下的电平受PMU_PWR_CTL寄存器控制(PMU_PWR_CTL.NORM_NORNSS_PU)

GPIO12

NOR Flash DAT0信号引脚

GPIO13

NOR Flash DAT1信号引脚

GPIO19

NOR Flash供电引脚(NORVCC)

上电默认输出IOVCC电平,此功能使能受PMU单元控制。可经由PMU关闭NORVCC功能后,通过用户程序进行GPIO19管脚的MFP复用。

GPIO20

复位开关引脚(Reset)

电平敏感,默认开启引脚上拉,此功能下应保持常态高电平。可由用户程序进行MFP复用。

GPIO24

MIC正极性输入引脚(MIC_INP)

可由用户程序进行MFP复用。

GPIO25

MIC负极性输入引脚(MIC_INN)

可由用户程序进行MFP复用。

GPIO26

麦克风供电引脚(VMIC)

可由用户程序进行MFP复用。

GPIO27

PA正极性输出引脚(PA_OUTP)

可由用户程序进行MFP复用。

GPIO28

PA负极性输出引脚(PA_OUTN)

可由用户程序进行MFP复用。

A. Boot ROM(BROM)升级请求引脚

SPV1x SoC的Boot ROM程序在SoC上电或复位时执行,流程中将检测GPIO6电平。若此时GPIO6处于低电平,则BROM执行用户程序升级。 反之,BROM尝试执行用户程序引导。

更多BROM相关信息请参考 Boot ROM (BROM) 章节内容。

B. NOR Flash供电引脚(NORVCC)

相关使用建议请阅读 针对低功耗场景优化的NOR Flash接入策略 章节内容。

C. 复位开关引脚(Reset)

GPIO20默认作为SoC复位(Reset)功能管脚使用,提供低电平触发的SoC复位功能,该功能由 GPIO复位功能控制寄存器PRSTN 进行配置。 PRSTN.PU默认开启,提供管脚上拉能力,保证GPIO20端口处于常态高电平。 用户程序可以自行清除PRSTN,关闭GPIO20的Reset功能,从而将其进行MFP复用。API链接:


注意事项

  1. 只有GPIO00-26端口能够提供外部时钟信号输入能力,需要事先将所选端口配置为数字输入端口(CTL.IE = 1)。

  2. 用户在使用GPIO20的常规IO功能或映射为MFP前,需要事先清除PRSTN,以关闭GPIO20预设的低电平Reset功能。 否则GPIO20端口电平可能触发系统复位。


API说明

enum gpio_pin_t

GPIO端口号枚举

  • GPIO_Pin_00GPIO_Pin_28

enum gpio_pin_direction_t

GPIO端口输入/输出方向枚举

  • GPIO_Floating:端口浮空

  • GPIO_Digital_Output: 数字输出端口

  • GPIO_Digital_Input: 数字输入端口

enum gpio_pin_pull_t

GPIO端口上/下拉选择枚举

  • GPIO_Pull_None:无上拉/下拉

  • GPIO_Pull_Up:开启上拉

  • GPIO_Pull_Down:开启下拉

enum gpio_pin_irq_event_t

可触发GPIO中断的端口输入电平事件枚举

  • GPIO_IRQ_Event_None:任何电平事件都不会触发中断

  • GPIO_IRQ_Event_Rising_Edge:上升沿触发中断

  • GPIO_IRQ_Event_Falling_Edge:下降沿触发中断

  • GPIO_IRQ_Event_Both_Edges:双边沿触发中断

  • GPIO_IRQ_Event_High_Level:高电平触发中断

  • GPIO_IRQ_Event_Low_Level:低电平触发中断

void gpio_init_pin(gpio_pin_t pin, gpio_pin_direction_t direction, gpio_pin_pull_t pull)

对指定的GPIO端口进行常规数字IO功能(数字输入/数字输出)的初始化。

参数
  • pin – GPIO端口号,通过枚举定义 gpio_pin_t 选择。

  • direction – GPIO端口输入/输出方向,通过枚举定义 gpio_pin_direction_t 选择。

  • pull – GPIO端口上/下拉选择,通过枚举定义 gpio_pin_pull_t 选择。

返回

void gpio_deinit_pin(gpio_pin_t pin)

将指定的GPIO端口功能重置为浮空、无上/下拉状态。

参数
  • pin – GPIO端口号,通过枚举定义 gpio_pin_t 选择。

返回

int32_t gpio_read_pin_input(gpio_pin_t pin)

读取指定GPIO端口的数字输入电平。

参数
  • pin – GPIO端口号,通过枚举定义 gpio_pin_t 选择。

返回

该端口的当前数字输入电平值。

返回类型

int32

返回值
  • 0 – 数字低电平

  • 1 – 数字高电平

void gpio_set_pin_output(gpio_pin_t pin)

拉高指定GPIO端口的数字输出电平。

参数
  • pin – GPIO端口号,通过枚举定义 gpio_pin_t 选择。

返回

void gpio_reset_pin_output(gpio_pin_t pin)

拉低指定GPIO端口的数字输出电平。

参数
  • pin – GPIO端口号,通过枚举定义 gpio_pin_t 选择。

返回

void gpio_toggle_pin_output(gpio_pin_t pin)

翻转指定GPIO端口的数字输出电平。

参数
  • pin – GPIO端口号,通过枚举定义 gpio_pin_t 选择。

返回

void gpio_write_port_output(uint32_t val)

对GPIO端口输出寄存器进行整体写入。

参数
  • val – 待输出电平,逐位对应于GPIO00-28。

返回

uint32_t gpio_read_port_input(void)

读取GPIO输入寄存器当前值。

返回

GPIO输入寄存器当前值。

返回类型

uint32

uint32_t gpio_read_port_output(void)

读取GPIO输出寄存器当前值。

返回

GPIO输出寄存器当前值。

返回类型

uint32

int32_t gpio_irq_attach_pin(gpio_pin_t pin, gpio_pin_irq_event_t event)

将指定GPIO端口的输入电平事件注册为GPIO中断源(之一)。

参数
  • pin – GPIO端口号,通过枚举定义 gpio_pin_t 选择。

  • event – 可触发中断的输入电平事件,通过枚举定义 gpio_pin_irq_event_t 选择。

返回

注册成功的GPIO中断控制通道号

返回类型

int32

返回值
  • 0-3 – 注册成功,对应分配的GPIO中断控制通道号。

  • -1 – 注册失败,当前没有闲置的GPIO中断控制通道可供注册。

void gpio_irq_detach_pin(int32_t channel)

重置指定GPIO中断控制通道的配置。

参数
  • channel – 希望重置的GPIO中断控制通道号(0-3)。

返回

void gpio_irq_enable(int32_t channel)

使能指定GPIO中断控制通道。

参数
  • channel – 待使能的GPIO中断控制通道号(0-3)。

返回

void gpio_irq_disable(int32_t channel)

失能指定GPIO中断控制通道。

参数
  • channel – 待失能的GPIO中断控制通道号(0-3)。

返回

void gpio_irq_get_flag(int32_t channel)

查询指定GPIO中断控制通道的中断状态(Pending)。

参数
  • channel – GPIO中断控制通道号(0-3)。

返回

中断状态。

返回类型

int32

返回值
  • 0 – 该通道无待响应中断。

  • 1 – 该通道中断待响应。

void gpio_irq_clear_flag(int32_t channel)

清除指定GPIO中断控制通道的中断状态(Pending)。

参数
  • channel – GPIO中断控制通道号(0-3)。

返回

void gpio_prstn_enable()

开启GPIO20端口预设的硬件复位功能,设置上拉。

返回

void gpio_prstn_disable()

关闭GPIO20端口预设的硬件复位功能。

返回


寄存器定义

../../_images/kiwi-reg-gpio-ctl.png
../../_images/kiwi-reg-gpio-out0.png
../../_images/kiwi-reg-gpio-in0.png
../../_images/kiwi-reg-gpio-intcn.png
../../_images/kiwi-reg-gpio-inte0.png
../../_images/kiwi-reg-gpio-pd.png
../../_images/kiwi-reg-gpio-eclk.png
../../_images/kiwi-reg-gpio-prstn.png