1.1. GPIO
gpio接口类型:基本功能,外部io中断功能,crossbar功能,复用功能,io占用打印。
1.1.1. GPIO 基本功能
配置io输入,输出,高阻,强驱。gpio基本功能接口支持同组单个或多个任意io(1~16个)操作。传入0个io会触发断言提醒。
#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */
#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */
#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */
#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */
#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */
#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */
#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */
#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */
#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */
#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */
#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */
#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */
#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */
#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */
#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */
#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */
#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */
#define GPIO_PIN_MASK (0x0000FFFFu) /* PIN mask for assert test */
#include "asm/gpio_hw.h"
1.1.1.1. gpio_init
初始化gpio,配置同组多个io为同一种模式,支持同组单个io,或者最多16个io同时操作。
原型:
int gpio_init(enum gpio_port port, const struct gpio_config *config);
- 参数:
port
io端口号,详见枚举enum gpio_port
config
io配置信息
返回值
暂未使用
示例:
struct gpio_config gpio_config_test = {
.pin = PORT_PIN_0 | PORT_PIN_1 | PORT_PIN_2 | PORT_PIN_3,//多个IO一起初始化
.mode = PORT_OUTPUT_LOW,//PORT_INPUT_PULLUP_10K,
.hd = PORT_DRIVE_STRENGT_2p4mA,
};
//配置PB0/PB1/PB2/PB3输出模式并输出0
gpio_init(PORTB, &gpio_config_test);
1.1.1.2. gpio_deinit
释放gpio,配置多io为弱驱高阻态,支持同组最多16个,或者单个io操作。
原型:
int gpio_deinit(enum gpio_port port, u32 pin);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
返回值
暂未使用
示例:
//恢复PA3/PA10为高阻态
gpio_deinit(PORTA, PORT_PIN_3 | PORT_PIN_10);
1.1.1.3. gpio_set_mode
初始化gpio,配置同组多个io为同一种模式,支持同组最多16个,或者单个io操作。与gpio_init相比少了io强驱模式配置。
原型:
int gpio_set_mode(enum gpio_port port, u32 pin, enum gpio_mode mode);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
mode
io模式,如PORT_INPUT_PULLUP_10K,详见枚举enum gpio_mode
返回值
0:成功,<0:失败
示例:
int ret = gpio_set_mode(PORTB, PORT_PIN_1, PORT_OUTPUT_LOW);
if (ret < 0) {
printf("gpio init error");
}else{
printf("gpio init succ");
}
1.1.1.4. gpio_get_mode
该函数体未实现。
原型:
enum gpio_mode gpio_get_mode(enum gpio_port port, u32 pin);
1.1.1.5. gpio_read
gpio输入模式下,读取io状态,兼容旧接口,只获取单个io状态。
原型:
int gpio_read(u32 gpio);// 读取单个io输入值. gpio:IO_PORTA_00
- 参数:
gpio
具体某个io,如:IO_PORTA_00
返回值
0:io输入低;1:io输入高;<0:错误
1.1.1.6. gpio_read_port
gpio输入模式下,读取io状态,支持获取同组最多16个,或者单个io状态。
原型:
//读取同组多个io值. 形参详见枚举; pin:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
int gpio_read_port(enum gpio_port port, u32 pin);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
返回值
<0:失败;>=0:成功,低16个bit表示每个io状态(pin对应的bit有效)
1.1.1.7. gpio_write
gpio输出模式下,设置io输出状态,兼容旧接口,只配置单个io状态。
原型:
// 设置单个io输出电平(需先配置为输出). gpio:IO_PORTA_00; value:0:out 0, 1:out 1
int gpio_write(u32 gpio, u32 value);
- 参数:
gpio
具体某个io,如:IO_PORTA_00
value
1:输出高;0:输出低
返回值
无效
1.1.1.8. gpio_write_port
gpio输出模式下,设置io输出状态,支持配置同组最多16个,或者单个io状态。
原型:
// 设置同组多个io输出电平(需先配置为输出).
int gpio_write_port(enum gpio_port port, u32 pin, int out_state);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
out_state
1:输出高;0:输出低
返回值
无效
1.1.1.9. gpio_toggle_port
gpio输出模式下,翻转io输出状态,支持配置同组最多16个,或者单个io。
原型:
//需先配置为输出
int gpio_toggle_port(enum gpio_port port, u32 pin);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
返回值
<0:错误;0:成功
1.1.1.10. gpio_get_out_level
gpio任意模式下,获取io输出寄存器的状态,支持配置同组最多16个,或者单个io。
原型:
int gpio_get_out_level(enum gpio_port port, u32 pin);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
返回值
<0:错误;>=0:成功,低16个bit表示每个io状态(pin对应的bit有效)
1.1.1.11. gpio_set_drive_strength
配置io输出驱动等级,支持配置同组最多16个,或者单个io。
原型:
int gpio_set_drive_strength(enum gpio_port port, u32 pin, enum gpio_drive_strength drive);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
drive
驱动级别。详见枚举enum gpio_drive_strength
返回值
无效
1.1.1.12. gpio_get_drive_strength
获取gpio输出强度等级,只支持单个io。
原型:
// 获取单个io输出强度 pin:只能带入1个io
enum gpio_drive_strength gpio_get_drive_strength(enum gpio_port port, u32 pin);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 ,只支持单个io。
返回值
驱动级别。详见枚举enum gpio_drive_strength
1.1.1.13. gpio_hw_op_dir
1.1.1.14. gpio_hw_op_out
配置同组多个io为不同的状态。配置模式包括:赋值,与,或,异或。与以上接口区别:上面接口配置多io为同一状态;该接口配置多io为不同状态。
- gpio_hw_op_dir :配置输入输出
- gpio_hw_op_out :配置输出值
- gpio_hw_op_die :配置die
- gpio_hw_op_dieh:配置dieh
- gpio_hw_op_pu0 :配置上拉
- gpio_hw_op_pu1 :配置上拉
- gpio_hw_op_pd0 :配置下拉
- gpio_hw_op_pd1 :配置下拉
原型:
int gpio_hw_op_dir(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_out(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_die(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_dieh(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_pu0(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_pu1(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_pd0(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_pd1(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
- 参数:
port
io端口号,详见枚举enum gpio_port:PORTA,PORTB
pin
具体的io序号,如:PORT_PIN_0 | PORT_PIN_3等,支持单个io或多个io。
value
要配置的值,每个io可以配置不同的状态(pin对应的bit有效,其他bit无效)
op
操作模式。详见枚举enum port_op_mode :PORT_SET,PORT_AND,,,
返回值
<0 :error ;other:ok
1.1.2. GPIO 中断功能
配置io外部中断功能。支持单边沿,部分支持双边沿。io中断的数量及单双边沿情况请参阅对应Soc规格书。所有io共用同一个中断号。io中断驱动会根据边沿配置为上拉10K或下拉10K。
外部io中断没有滤波功能。
1.1.2.1. gpio_irq_config
初始化gpio中断功能,或关闭中断功能。内部会根据触发边沿配置好上下拉,支持同组最多16个,或者单个io操作。不同芯片中断io及数目不同,请参阅对应Soc规格书。
原型:
//默认使能中断
//禁止同一个io同一边沿多次注册
//单边沿与双边沿切换: 请先注销(irq_edge设为PORT_IRQ_DISABLE)再注册
int gpio_irq_config(enum gpio_port port, const struct gpio_irq_config_st *config);
- 参数:
port
io端口号,详见枚举enum gpio_port
config
io中断配置信息
返回值
暂未使用
示例:
void gpio_irq_callback_p_test1(enum gpio_port port, u32 pin, enum gpio_irq_edge edge)
{
printf("port%d.%d:%d-cb1\n", port, pin, edge);
}
struct gpio_irq_config_st gpio_irq_config_test = {
.pin = PORT_PIN_0 | PORT_PIN_2,//配置为相同状态
.irq_edge = PORT_IRQ_EDGE_FALL,//PORT_IRQ_ANYEDGE双边沿//PORT_IRQ_DISABLE关闭注销
.callback = gpio_irq_callback_p_test1,
};
gpio_irq_config(PORTA, &gpio_irq_config_test);
1.1.2.2. gpio_irq_set_callback
设置或修改io中断回调函数,可以设置为NULL,支持同组最多16个,或者单个io操作。
原型:
int gpio_irq_set_callback(enum gpio_port port, u32 pin, gpio_irq_callback_p callback);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
callback
回调函数指针,可以为NULL
返回值
暂未使用
1.1.2.3. gpio_irq_set_edge
修改io中断触发沿,只有注册单边沿触发才能调用该函数切换边沿,支持同组最多16个,或者单个io操作。单边沿与双边沿切换: 请先注销再注册
原型:
//只有注册单边沿触发才能调用该函数切换边沿
//单边沿与双边沿切换: 请先注销再注册
int gpio_irq_set_edge(enum gpio_port port, u32 pin, enum gpio_irq_edge irq_edge);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
irq_edge
触发边沿,详见枚举enum gpio_irq_edge
返回值
暂未使用
1.1.2.4. gpio_irq_get_edge
获取io中断触发沿,只支持单个io操作。
原型:
// 获取单个io触发边沿 pin:只能带入1个io
enum gpio_irq_edge gpio_irq_get_edge(enum gpio_port port, u32 pin);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0
返回值
触发边沿,详见枚举enum gpio_irq_edge
1.1.2.5. gpio_irq_enable
已初始化,临时打开io中断,支持同组最多16个,或者单个io操作。
原型:
int gpio_irq_enable(enum gpio_port port, u32 pin);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
返回值
暂未使用
1.1.2.6. gpio_irq_disable
已初始化,临时关闭io中断,支持同组最多16个,或者单个io操作。
原型:
int gpio_irq_disable(enum gpio_port port, u32 pin);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
返回值
暂未使用
1.1.3. GPIO crossbar功能配置
支持crossbar的功能可映射到任意io。具体功能详见枚举enum gpio_function。该类接口仅支持单个io,仅完成io映射,具体输入输出等功能另配。
1.1.3.1. gpio_set_function
将外设功能映射到io。只支持单个io操作。
原型:
// 配置单个io为特殊功能. pin:只能带入1个io
int gpio_set_function(enum gpio_port port, u32 pin, enum gpio_function fn);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 等
fn
外设功能,详见枚举:enum gpio_function
返回值
<0:错误;0:成功
示例:
int ret = gpio_set_function(PORTB, PORT_PIN_1, PORT_FUNC_UART0_TX);
if (ret < 0) {
printf("gpio uart0 tx error");
}else{
printf("gpio uart0 tx succ");
}
1.1.3.2. gpio_disable_function
将映射到io的外设功能注销,同时配置释放io,配置为高阻。只支持单个io操作。
原型:
// 注销单个io的特殊功能. pin:只能带入1个io
int gpio_disable_function(enum gpio_port port, u32 pin, enum gpio_function fn);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 等
fn
外设功能,详见枚举:enum gpio_function
返回值
<0:错误;0:成功
1.1.4. GPIO 复用功能配置
待开放。
1.1.4.1. gpio_request_function
注册io功能复用。只支持单个io操作。(暂未实现)
原型:
// io复用时,io资源申请
int gpio_request_function(enum gpio_port port, u32 pin, enum gpio_function fn, u32 timeout);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 等
fn
外设功能,详见枚举:enum gpio_function
timeout
获取io权限要等待的时间,单位:
返回值
<0:错误;0:成功
1.1.4.2. gpio_release_function
注销io功能复用。只支持单个io操作。(暂未实现)
原型:
// io复用时,io资源释放
int gpio_release_function(enum gpio_port port, u32 pin, enum gpio_function fn);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 等
fn
外设功能,详见枚举:enum gpio_function
返回值
<0:错误;0:成功
1.1.5. GPIO io占用打印
打印所有io基本功能及crossbar功能使用情况。不支持的功能显示为—–,未配置的crossbar显示dis。输入通道ich有默认值,可能出现单个io输入到多个内部外设。
1.1.5.1. gpio_dump
打印芯片全部gpio寄存器,crossbar信息
原型:
//打印芯片全部gpio寄存器,crossbar信息
void gpio_dump();
- 参数:
返回值
无
1.1.5.2. gpio_appoint_dump
打印同组单个或多个指定io寄存器,和crossbar信息。
原型:
//打印芯片指定io寄存器,crossbar信息
void gpio_appoint_dump(enum gpio_port port, u32 pin);
- 参数:
port
io端口号,详见枚举enum gpio_port
pin
具体的io序号,如:PORT_PIN_0 等(未指定的pin bit打印0)
返回值
无