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功能。 另外,关闭SFGAT后,PD6口会有一个较强的下拉,阻值1K左右。
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