LGPIO ######## .. contents:: 目录 :depth: 3 介绍 ====== Nuclei LGPIO(逻辑通用输入输出)描述了逻辑通用输入输出控制器(LGPIO)的操作。LGPIO控制器是映射在内部存储器映射中的外设。通用输入输出(GPIO)端口的每个端口位都可以通过软件在多种模式下进行单独配置(方向、上拉使能、驱动值等),以及在这些信号的各种控制源之间进行选择(硬件I/O功能)。 主要特性 ========== LGPIO的主要特性如下: • 输出状态:推挽或开漏+上拉/下拉。 • 输出数据来自输出数据寄存器(GPIOx_OVAL)或外设(复用功能输出)。 • 输入状态:浮空、上拉/下拉。 • 输入数据到输入数据寄存器(GPIOx_IVAL)或外设(复用功能输入)。 • 对每个LGPIO的位操作敏捷: - 位设置(GPIOx_BIT_SET寄存器), - 位复位(GPIOx_BIT_RESET寄存器), - 位翻转(GPIOx_BIT_TOGGLE寄存器)。 • 锁定机制(GPIOx_MASK)提供冻结I/O端口输出值的功能。 • 高度灵活的引脚复用允许将I/O引脚用作LGPIO或多个外设功能之一。 • 支持噪声滤波器功能,噪声长度可通过软件配置。 功能描述 ========== 根据数据表中列出的每个I/O端口的具体硬件特性,通用输入输出(GPIO)端口的每个端口位都可以通过软件在多种模式下进行单独配置: • 输入浮空。 • 输入上拉。 • 输入下拉。 • 开漏输出,具有上拉或下拉能力。 • 推挽输出,具有上拉或下拉能力。 • 复用功能推挽,具有上拉或下拉能力。 • 复用功能开漏,具有上拉或下拉能力。 每个I/O端口位都可以自由编程,但是I/O端口寄存器必须作为32位字进行访问。 中断 -------- 每个LGPIO位可以生成一个中断位。中断可以由上升沿或下降沿驱动,或由电平值驱动,每个都可以单独使能。 输入在被中断逻辑采样之前进行同步,因此输入脉冲宽度必须足够长才能被同步逻辑检测到。 要使能中断,请将RISE_IE和/或FALL_IE和/或HIGH_IE和/或LOW_IE中的相应位设置为1。 如果RISE_IP或FALL_IP或HIGH_IP或LOW_IP中的相应位被设置,则会产生中断引脚。 所有端口都具有外部中断能力。要使用外部中断线,端口必须配置为输入模式。 注:此结构对每个引脚重复。 I/O端口控制寄存器 ----------------------- • GPIOx_IE:用于使能I/O输入模式。 • GPIOx_MODE0,GPIOx_MODE1:用于选择输出类型(推挽或开漏)。 • GPIOx_PULL_MODE0,GPIOx_PULL_MODE1:用于选择上拉/下拉,无论I/O方向如何。 I/O端口数据寄存器 ----------------------- • GPIOx_IVAL:存储通过I/O输入的输入数据,只读寄存器。 • GPIOx_OVAL:存储要输出的数据,可读/写访问。 I/O数据位操作处理 ----------------------- • GPIOx_SET/GPIOx_RESET:允许应用程序在输出数据寄存器中设置和复位每个单独的位。 • GPIOx_TOGGLE:允许应用程序在输出数据寄存器中翻转每个单独的位。 • GPIOx_MASK:允许应用程序在输出数据寄存器中屏蔽每个单独的位。 I/O复用功能输入/输出 -------------------------- 提供这些寄存器来为每个I/O选择可用的复用功能输入/输出之一。使用这些寄存器,用户可以根据应用程序的需要将复用功能连接到其他引脚。 这意味着使用GPIOx_AFIO_SEL0、GPIOx_AFIO_SEL1和GPIOx_AFIO_SEL2复用功能寄存器,在每个LGPIO上复用多个可能的外设功能。因此,应用程序可以为每个I/O选择任何一个可能的功能。AF选择信号对复用功能输入和复用功能输出是通用的,为给定I/O的复用功能输入/输出选择单个通道。 驱动强度 -------------- 当配置为输出时,每个引脚都有一个软件可控的驱动强度: {GPIOx_DS3,GPIOx_DS2,GPIOx_DS1,GPIOx_DS0}。 输出反转 -------------- 当配置为输出(软件或IOF控制)时,软件可写的输出异或寄存器(GPIOx_OUT_XOR)与输出组合以反转它。 噪声滤波器 ---------------- 在LGPIO中,用户可以根据需要配置噪声滤波器。每个PAD可以独立打开/关闭滤波器功能(通过GPIO_GRP*_DIGITAL_FILTER_EN寄存器)。 噪声长度可以通过GPIO_DIGITAL_NOISE_FILTER_LENGTH寄存器设置,单位是LGPIO的时钟。 小于GPIO_DIGITAL_NOISE_FILTER_LENGTH的信号长度将被视为噪声, 等于或大于GPIO_DIGITAL_NOISE_FILTER_LENGTH的信号长度将被视为正常功能信号。 数字功能的延迟是GPIO_DIGITAL_NOISE_FILTER_LENGTH+1。 中断 ====== 表 7.1 显示了LGPIO中断请求。 .. list-table:: 表 7.1: LGPIO中断请求 :header-rows: 1 :widths: auto * - 中断事件 - 事件标志 - 使能控制位 * - LGPIO PAD的上升沿 - RISE_IP - RISE_IE * - LGPIO PAD的下降沿 - FALL_IP - FALL_IE * - LGPIO PAD的高电平 - HIGH_IP - HIGH_IE * - LGPIO PAD的低电平 - LOW_IP - LOW_IE 注: (1) 每个LGPIO位可以从PAD采样四种类型的外部中断事件:上升沿、下降沿、高电平或低电平。 (2) 但LGPIO只向CPU生成高电平中断类型。 寄存器 ======== LGPIO寄存器 ----------------- 注: 1. 表 8.1 和 8.2 中的"i"是GPIO_NUM除以32。 例如:如果GPIO_NUM配置为35,则i=floor(35/32)=1。 2. 表 8.1 和 8.2 中所有寄存器的最大宽度是32位,这是GPIO_NUM为32且地址4字节对齐的配置示例。 如果GPIO_NUM小于32,寄存器的宽度取决于实际的GPIO_NUM配置。 如果GPIO_NUM大于32,每个寄存器的实际地址应加上特定偏移:"i" * 0x100。 寄存器及其在LGPIO中的相应偏移如表 8.1 所示。 .. list-table:: 表 8.1: LGPIO中寄存器的偏移地址 :header-rows: 1 :widths: auto * - 偏移 - 寄存器名称 - 功能描述 * - 0x0 - GPIO_GRP0_IVAL - 来自LGPIO的输入数据。 * - 0x8 - GPIO_GRP0_MODE0 - LGPIO的工作模式。 * - 0xC - GPIO_GRP0_MODE1 - LGPIO的工作模式。 * - 0x10 - GPIO_GRP0_OVAL - 到LGPIO的输出数据。 * - 0x14 - GPIO_GRP0_RISE_IE - 每个LGPIO的上升中断使能。 * - 0x18 - GPIO_GRP0_RISE_IP - 每个LGPIO的上升中断挂起。 * - 0x1C - GPIO_GRP0_FALL_IE - 每个LGPIO的下降中断使能。 * - 0x20 - GPIO_GRP0_FALL_IP - 每个LGPIO的下降中断挂起。 * - 0x24 - GPIO_GRP0_HIGH_IE - 每个LGPIO的高电平中断使能。 * - 0x28 - GPIO_GRP0_HIGH_IP - 每个LGPIO的高电平中断挂起。 * - 0x2C - GPIO_GRP0_LOW_IE - 每个LGPIO的低电平中断使能。 * - 0x30 - GPIO_GRP0_LOW_IP - 每个LGPIO的低电平中断挂起。 * - 0x44 - GPIO_GRP0_OUT_MASK - 每个LGPIO的输出数据掩码。 * - 0x48 - GPIO_GRP0_BIT_SET - 每个LGPIO的单独位设置。 * - 0x4C - GPIO_GRP0_BIT_RESET - 每个LGPIO的单独位复位。 * - 0x50 - GPIO_GRP0_BIT_TOGGLE - 每个LGPIO的单独位翻转。 * - 0x54 - GPIO_GRP0_PULL_MODE0 - 每个LGPIO的上拉/下拉模式。 * - 0x58 - GPIO_GRP0_PULL_MODE1 - 每个LGPIO的上拉/下拉模式。 * - 0x74 - GPIO_GRP0_SW_KEEP - 使能软件总线保持。 * - 0x84 - GPIO_GRP0_EVENT_RISE_EN - 使能上升事件。 * - 0x88 - GPIO_GRP0_EVENT_FALL_EN - 使能下降事件。 * - 0x8C - GPIO_GRP0_DIGITAL_NOISE_FILTER_EN - 使能pad_ival同步的数字滤波电路。 * - 0x90 - GPIO_GRP0_IRQ_STATUS - 所有LGPIO的中断状态。 * - 0x94 - GPIO_VERSION - IP版本。 * - 0x98 - GPIO_GRP0_EVENT_HIGH - 使能高电平事件 * - 0x9C - GPIO_GRP0_EVENT_LOW - 使能低电平事件 * - 0xA0 - GPIO_DIGITAL_NOISE_LENGTH - LGPIO将滤除的噪声长度 GPIO_GRP0_IVAL ~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x0。 .. list-table:: 表 8.2: GPIO_GRP0_IVAL格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_IVAL - 31:0 - RO - 0x0 - 从 PAD 到内核的接收数据 GPIO_GRP0_MODE0 ~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x8。 .. list-table:: 表 8.3: GPIO_GRP0_MODE0格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_MODE0 - 31:0 - RW - 0x0 - - 为每个特定 PAD 选择发送器类型。此寄存器应与 GPIO_GRP0_MODE1 配合使用 - 例如: - 对于 PAD0,设置如下: - {GPIO_GRP0_MODE1[0], GPIO_GRP0_MODE0[0]}: - 2'b00:高阻 - 2'b01:推挽 - 2'b10:开漏 - 2'b11:保留 GPIO_GRP0_MODE1 ~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0xC。 .. list-table:: 表 8.4: GPIO_GRP0_MODE1格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_MODE1 - 31:0 - RW - 0x0 - - 为每个特定 PAD 选择发送器类型。此寄存器应与 GPIO_GRP0_MODE0 配合使用 - 例如: - 对于 PAD0,设置如下: - {GPIO_GRP0_MODE1[0], GPIO_GRP0_MODE0[0]}: - 2'b00:高阻 - 2'b01:推挽 - 2'b10:开漏 - 2'b11:保留 GPIO_GRP0_OVAL ~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x10。 .. list-table:: 表 8.5: GPIO_GRP0_OVAL格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_OVAL - 31:0 - RW - 0x0 - 从内核到 PAD 的发送数据 GPIO_GRP0_RISE_IE ~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x14。 .. list-table:: 表 8.6: GPIO_GRP0_RISE_IE格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_RISE_IE - 31:0 - RW - 0x0 - - 上升中断使能 - 1'b0:禁用上升中断 - 1'b1:使能上升中断 GPIO_GRP0_RISE_IP ~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x18。 .. list-table:: 表 8.7: GPIO_GRP0_RISE_IP格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_RISE_IP - 31:0 - RW - 0x0 - 上升中断挂起 GPIO_GRP0_FALL_IE ~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x1C。 .. list-table:: 表 8.8: GPIO_GRP0_FALL_IE格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_FALL_IE - 31:0 - RW - 0x0 - - 下降中断使能 - 1'b0:禁用下降中断 - 1'b1:使能下降中断 GPIO_GRP0_FALL_IP ~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x20。 .. list-table:: 表 8.9: GPIO_GRP0_FALL_IP格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_FALL_IP - 31:0 - RW - 0x0 - 下降中断挂起 GPIO_GRP0_HIGH_IE ~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x24。 .. list-table:: 表 8.10: GPIO_GRP0_HIGH_IE格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_HIGH_IE - 31:0 - RW - 0x0 - - 高电平中断使能 - 1'b0:禁用高电平中断 - 1'b1:使能高电平中断 GPIO_GRP0_HIGH_IP ~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x28。 .. list-table:: 表 8.11: GPIO_GRP0_HIGH_IP格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_HIGH_IP - 31:0 - RW - 0x0 - 高电平中断挂起 GPIO_GRP0_LOW_IE ~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x2C。 .. list-table:: 表 8.12: GPIO_GRP0_LOW_IE格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_LOW_IE - 31:0 - RW - 0x0 - - 低电平中断使能 - 1'b0:禁用低电平中断 - 1'b1:使能低电平中断 GPIO_GRP0_LOW_IP ~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x30。 .. list-table:: 表 8.13: GPIO_GRP0_LOW_IP格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_LOW_IP - 31:0 - RW - 0x0 - 低电平中断挂起 GPIO_GRP0_OUT_MASK ~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x44。 .. list-table:: 表 8.14: GPIO_GRP0_OUT_MASK格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_OUT_MASK - 31:0 - RW - 0xFFFF_FFFF - - 每个 PAD 的输出数据掩码 - 1'b0:当软件设置 LGPIO_GPRx_OVAL 时,PAD 的电平将保持旧值 - 1'b1:当软件设置 LGPIO_GPRx_OVAL 时,PAD 的电平将同时改变 GPIO_GRP0_BIT_SET ~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x48。 .. list-table:: 表 8.15: GPIO_GRP0_BIT_SET格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_BIT_SET - 31:0 - WO - 0x0 - - 为每个 PAD 设置输出值 - 1'b0:无效果 - 1'b1:为每个 PAD 设置输出值 GPIO_GRP0_BIT_RESET ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x4C。 .. list-table:: 表 8.16: GPIO_GRP0_BIT_RESET格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_BIT_RESET - 31:0 - WO - 0x0 - - 为每个 PAD 复位输出值 - 1'b0:无效果 - 1'b1:为每个 PAD 复位输出值 GPIO_GRP0_BIT_TOGGLE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x50。 .. list-table:: 表 8.17: GPIO_GRP0_BIT_TOGGLE格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_BIT_TOGGLE - 31:0 - WO - 0x0 - - 为每个 PAD 翻转输出值 - 1'b0:无效果 - 1'b1:为每个 PAD 翻转输出值 GPIO_GRP0_PULL_MODE0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x54。 .. list-table:: 表 8.18: GPIO_GRP0_PULL_MODE0格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_PULL_MODE0 - 31:0 - RW - 0x0 - - 为每个特定 PAD 选择输出类型。此寄存器应与 GPIO_GRP0_PULL_MODE1 配合使用 - 例如: - 对于 PAD0,设置如下: - {GPIO_GRP0_PULL_MODE1[0], GPIO_GRP0_PULL_MODE0[0]}: - 2'b00:PULL_UP = 0, PULL_DOWN = 0 - 2'b01:PULL_UP = 1, PULL_DOWN = 0 - 2'b10:保留 - 2'b11:PULL_UP = 0, PULL_DOWN = 1 GPIO_GRP0_PULL_MODE1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x58。 .. list-table:: 表 8.19: GPIO_GRP0_PULL_MODE1格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_PULL_MODE1 - 31:0 - RW - 0x0 - - 为每个特定 PAD 选择输出类型。此寄存器应与 GPIO_GRP0_PULL_MODE0 配合使用 - 例如: - 对于 PAD0,设置如下: - {GPIO_GRP0_PULL_MODE1[0], GPIO_GRP0_PULL_MODE0[0]}: - 2'b00:PULL_UP = 0, PULL_DOWN = 0 - 2'b01:PULL_UP = 1, PULL_DOWN = 0 - 2'b10:保留 - 2'b11:PULL_UP = 0, PULL_DOWN = 1 GPIO_GRP0_SW_KEEP ~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x74。 .. list-table:: 表 8.20: GPIO_GRP0_SW_KEEP格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_SW_KEEP - 31:0 - RW - 0x0 - 使能 PAD 的软件总线保持 GPIO_GRP0_EVENT_RISE_EN ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x84。 .. list-table:: 表 8.21: GPIO_GRP0_EVENT_RISE_EN格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_EVENT_RISE_EN - 31:0 - RW - 0x0 - 如果 PAD 有上升沿且工作在发送器模式时,使能上升事件 GPIO_GRP0_EVENT_FALL_EN ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x88。 .. list-table:: 表 8.22: GPIO_GRP0_EVENT_FALL_EN格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_EVENT_FALL_EN - 31:0 - RW - 0x0 - 如果 PAD 有下降沿且工作在发送器模式时,使能下降事件 GPIO_GRP0_DIGITAL_FILTER_EN ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x8C。 .. list-table:: 表 8.23: GPIO_GRP0_DIGITAL_NOISE_FILTER_EN格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_DIGITAL_NOISE_FILTER_EN - 31:0 - RW - 0x0 - - 使能 pad_ival 同步的数字滤波电路 - 1'b1:为接收数据(来自 PAD)使能数字噪声滤波器功能 - 1'b0:禁用数字噪声滤波器功能 GPIO_GRP0_IRQ_STATUS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x90。 .. list-table:: 表 8.24: GPIO_GRP0_IRQ_STATUS格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GPIO_GRP0_IRQ_STATUS - 31:0 - RO - 0x0 - - 此字段代表所有 PAD 的中断状态 - 例如:如果 GPIO_NUM 为 32,此寄存器的每一位是 PAD0~PAD31 的中断状态 - 当 [n] 为"1":PADn 的中断活跃;当 [n] 为"0":PADn 的中断不活跃 GPIO_VERSION ~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x94。 .. list-table:: 表 8.25: GPIO_VERSION格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - VERSION_NUM - 31:0 - RO - 0x0001_0300 - LGPIO 的 IP 版本 GPIO_GRP0_EVENT_HIGH ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x98。 .. list-table:: 表 8.26: GPIO_GRP0_EVENT_HIGH格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - HIGH_EN - 31:0 - RW - 0x0 - 如果 PAD 有高电平且工作在发送器模式时,使能高电平事件 GPIO_GRP0_EVENT_LOW ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0x9C。 .. list-table:: 表 8.27: GPIO_GRP0_EVENT_LOW格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - LOW_EN - 31:0 - RW - 0x0 - 如果 PAD 有低电平且工作在发送器模式时,使能低电平事件 GPIO_DIGITAL_NOISE_FILTER_LENGTH ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:0xA0。 .. list-table:: 表 8.28: GPIO_DIGITAL_NOISE_LENGTH格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - VALUE - 24:0 - RW - 0x0 - - 数字噪声的长度 - 这些位用于配置 PAD 输入上的数字噪声长度 - 数字滤波器滤除长度高达 digital_noise_filter_num[24:0] * t_lgpioclk 的尖峰