2.2. GPIO

Overview

提供 GPIO 应用示例、常用相关 API 介绍和常见问题。

2.2.1. 应用示例

示例演示:

  • GPIO 输入,上下拉配置

  • GPIO 输出,强驱配置

  • GPIO 中断模式使用

  • 特殊引脚如 USB/配置为 GPIO 使用方法

  • 双重绑定 IO 配置方法

  • 无互斥高速度要求操作 GPIO 方法

  • 复位IO维持电平使用说明

  • IO口说明

example: 具体示例代码详见 apps/common/example/peripheral/gpio/gpio.c ,示例工程实现需在 apps/demo/demo_DevKitBoard/include/demo_config.h 中开启宏 USE_GPIO_TEST_DEMO

复位维持某IO电平使用说明:

  • 1、复位前设置IO状态

    • 注意有些封装多IO内绑在一起,则需要设置另外IO为高阻模式,如PB8高阻:

    gpio_set_die(IO_PORTB_08, 0);
    gpio_set_pull_up(IO_PORTB_08, 0);
    gpio_set_pull_down(IO_PORTB_08, 0);
    gpio_direction_input(IO_PORTB_08);
    

    • 硬件没外置上拉电阻则使用内部上下拉电阻

      硬件外部上下拉,则需要关闭内部的上下拉

      硬件没有上下拉,则使用内部上下拉:根据输出1开上拉关下拉,输出0关上拉开下拉

      如:使用内部上拉电阻,输出1,

      gpio_latch_en(IO_PORTC_00,0);//先解除IO
      gpio_direction_output(IO_PORTC_00, 1);//设置输出
      gpio_set_pull_up(IO_PORTC_00, 1)//开上拉,0则关上拉
      gpio_set_pull_down(IO_PORTC_00, 0);//关下拉,1则开上拉
      gpio_latch_en(IO_PORTC_00,1);//锁住IO
      
  • 2、使用system_reset()函数复位函数才能维持IO

  • 3、uboot启动配置

    • isd_tools_sdram.cfg 配置uboot启动的IO状态

    如port_output=PC00_0;//PC00输出0

    如port_output=PC00_1;//PC00输出1

    • 或者 isd_config_rule.c 文件配置uboot启动的IO状态

      PORT_OUTPUT=PC00_0;//PC00输出0

      PORT_OUTPUT=PC00_1;//PC00输出1

Note

uboot默认把PD6设置成SFGAT功能,若用户若想将PD6当作普通IO来使用,需要在SDK里面使能CONFIG_DISABLE_P3_FSPG_CON宏,关掉SFGAT功能即可

IO口说明:

如下图是IO口说明图

  • IO的驱动能力可通过 gpio_set_hd()gpio_set_hd0() 这两个函数控制,当默认都为0时普通IO的驱动能力为最大8mA + 120 欧姆的等效电阻。

  • 当使用IO为模拟功能时,如图中IE=0显示小于1.2V电压时input为0,同理IEH。

2.2.2. 常见问题

  • __gpio_ 和 gpio接口有什么不同?

    答:两套接口函数实现的功能是一样的,只是gpio的这套接口在操作寄存器的时候都上了锁,确保操作时不会影响到同组引脚。 如果同一组引脚之间没有互斥, 针对用户有高速度要求, 并且不需要考虑同一组引脚之间操作互斥推荐使用 __gpio_这套api。

  • 哪些口不能做中断检测?

    答:除了PB0和USB其他普通IO都可以。

  • 特殊引脚如 USB配置为 GPIO 时注意是否开启以下的宏:

#define IO_PORT_USB_DPA              (IO_PR_MAX + 0)

#define IO_PORT_USB_DMA              (IO_PR_MAX + 1)

#define IO_PORT_USB_DPB              (IO_PR_MAX + 2)

#define IO_PORT_USB_DMB              (IO_PR_MAX + 3)

2.2.3. API Reference

Functions

void gpio_port_lock(unsigned int port)

gpio_port_lock,自旋锁,即不能被另一个cpu打断,也不能被中断打断

Parameters

gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

void gpio_port_unlock(unsigned int port)

gpio_port_unlock,解除自旋锁

Parameters

gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

int gpio_direction_input(unsigned int gpio)

gpio_direction_input,将引脚直接设为输入模式

Parameters

gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

Returns

0:成功 非0:失败

int gpio_direction_output(unsigned int gpio, int value)

gpio_direction_output,设置引脚的方向为输出,并设置一下电平

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,输出1, 0,输出0

Returns

0:成功 非0:失败

int gpio_set_pull_up(unsigned int gpio, int value)

gpio_set_pull_up,设置引脚的上拉,上拉电阻10K,当引脚为输入模式时才有效

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,上拉;0,不上拉

Returns

0:成功 非0:失败

int gpio_set_pull_down(unsigned int gpio, int value)

gpio_set_pull_down,设置引脚的下拉,下拉电阻10K,当引脚为输入模式时才有效

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,下拉;0,不下拉

Returns

0:成功 非0:失败

int gpio_set_hd(unsigned int gpio, int value)

gpio_set_hd, 设置引脚的内阻,当引脚为输出模式时才有效

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,关闭内阻增强输出 0,存在内阻,芯片默认的

Returns

0:成功 非0:失败

int gpio_set_hd1(unsigned int gpio, int value)

gpio_set_hd1, 设置引脚的输出电流,当引脚为输出模式时才有效

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,电流变大增强输出; 0,默认电流

Returns

0:成功 非0:失败

int gpio_set_die(unsigned int gpio, int value)

gpio_set_die,设置引脚为数字功能还是模拟功能,比如引脚作为ADC的模拟输入,则die要置0

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,数字功能,即01信号; 0,跟电压先关的模拟功能

Returns

0:成功 非0:失败

int gpio_set_output_clk(unsigned int gpio, int clk)

gpio_set_output_clk,将引脚设为时钟输出

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • clk – 12,24分别是12M时钟和24M时钟,0是默认24M时钟

Returns

0:成功 非0:失败

int gpio_clear_output_clk(unsigned int gpio, int clk)

gpio_clear_output_clk,清除引脚时钟输出

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • clk – 12,24分别是12M时钟和24M时钟,0是默认24M时钟

Returns

0:成功 非0:失败

int gpio_read(unsigned int gpio)

gpio_read,读取引脚的输入电平,引脚为输入模式时才有效

Parameters

gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

Returns

电平值

int gpio_set_direction(unsigned int gpio, unsigned int dir)

gpio_set_direction,设置引脚方向

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • dir – 1,输入;0,输出

Returns

0:成功 非0:失败

void gpio_latch_en(unsigned int gpio, unsigned char en)

gpio_latch_en,保持引脚电平,软硬件无法改变它,如需取消则再调用一次并把en设置为0

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • en – 1,使能;0,取消使能

int gpio_set_dieh(unsigned int gpio, int value)

gpio_set_dieh, 设置引脚为数字功能还是模拟功能,但模拟功能时,跟die的不一样而已

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,数字功能,即01信号; 0,跟电压先关的模拟功能

Returns

0:成功 非0:失败

unsigned int gpio_output_channle(unsigned int gpio, enum gpio_out_channle clk)

gpio_set_output_channle, 将IO映射成特殊引脚

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • clk – 参考枚举CHx_UTx_TX,如CH0_UT0_TX

Returns

0:成功 非0:失败

unsigned int gpio_clear_output_channle(unsigned int gpio, enum gpio_out_channle clk)

gpio_clear_output_channle,取消将IO映射成特殊引脚

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • clk – 参考枚举CHx_UTx_TX,如CH0_UT0_TX

Returns

0:成功 非0:失败

unsigned int gpio_uart_rx_input(unsigned int gpio, unsigned int ut, unsigned int ch)

gpio_uart_rx_input,将引脚映射成RX脚

Parameters
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • ut – 0,1,2,分别代表串口0,1,2

  • ch – 0,1,2,3,分别代表input_channel0,1,2,3

Returns

0:成功 非0:失败

unsigned int gpio_close_uart0(void)

gpio_close_uart0,关闭串口0

Returns

0:成功 非0:失败

unsigned int gpio_close_uart1(void)

gpio_close_uart1,关闭串口1

Returns

0:成功 非0:失败

unsigned int gpio_close_uart2(void)

gpio_close_uart2,关闭串口2

Returns

0:成功 非0:失败

unsigned int gpio_set_uart0(unsigned int ch)

gpio_set_uart0

Parameters

ch – 0:3 选择对应IO wl82

ch

tx

rx

0

PA5_TX

PA6_RX

1

PB1_TX

PB2_RX

2

PA3_TX

PA4_RX

3

PH0_TX

PH1_RX

-1

关闭对应的IO口串口功能

no

Returns

unsigned int gpio_set_uart1(unsigned int ch)

gpio_set_uart1

Parameters

ch – 0:3 选择对应IO wl82

ch

tx

rx

0

PH6_TX

PH7_RX

1

PC3_TX

PC4_RX

2

PB3_TX

PB4_RX

3

USBDP

USBDM

-1

关闭对应的IO口串口功能

no

Returns

unsigned int gpio_set_uart2(unsigned int ch)

gpio_set_uart2

Parameters

ch – 0:3 选择对应IO wl82

ch

tx

rx

0

PH2_TX

PH3_RX

1

PC9_TX

PC10_RX

2

PB6_TX

PB7_RX

3

PE0_TX

PE1_RX

-1

关闭对应的IO口串口功能

no

Returns