今天记录下杰理gpio的相关函数功能。
1. GPIO引脚输入输出模式
初始化gpio,支持同组最多16个,或者单个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);
释放gpio,配置为高阻态,支持同组最多16个,或者单个io操作。
//恢复PA3/PA10为高阻态
gpio_deinit(PORTA, PORT_PIN_3 | PORT_PIN_10);
初始化gpio,配置同组多个io模式,支持同组最多16个,或者单个io操作。与gpio_init相比少了io强驱配置。
int ret = gpio_set_mode(PORTB, PORT_PIN_1, PORT_OUTPUT_LOW);
if (ret < 0) {
printf("gpio init error");
}else{
printf("gpio init succ");
}
gpio输入模式下,读取io状态,兼容旧接口,只获取单个io状态。
int gpio_read(u32 gpio);// 读取单个io输入值. gpio:IO_PORTA_00
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);
gpio输出模式下,设置io输出状态,兼容旧接口,只配置单个io状态。
// 设置单个io输出电平(需先配置为输出). gpio:IO_PORTA_00; value:0:out 0, 1:out 1
int gpio_write(u32 gpio, u32 value);
gpio输出模式下,设置io输出状态,支持配置同组最多16个,或者单个io状态。
// 设置同组多个io输出电平(需先配置为输出).
int gpio_write_port(enum gpio_port port, u32 pin, int out_state);
gpio输出模式下,翻转io输出状态,支持配置同组最多16个,或者单个io。
//需先配置为输出
int gpio_toggle_port(enum gpio_port port, u32 pin);
gpio任意模式下,获取io输出寄存器的状态,支持配置同组最多16个,或者单个io。
int gpio_get_out_level(enum gpio_port port, u32 pin);
配置io输出驱动等级,支持配置同组最多16个,或者单个io。
int gpio_set_drive_strength(enum gpio_port port, u32 pin, enum gpio_drive_strength drive);
获取gpio输出强度等级,只支持单个io
// 获取单个io输出强度 pin:只能带入1个io
enum gpio_drive_strength gpio_get_drive_strength(enum gpio_port port, u32 pin);
2. GPIO中断
配置io外部中断功能,所有io共用同一个中断回调,内部会根据触发边沿配置好上下拉。
初始化gpio中断功能,内部会根据触发边沿配置好上下拉,支持同组最多16个,或者单个io操作。不同芯片中断io及数目不同,请参阅对应Soc规格书。
//默认开中断
//禁止同一个io同一边沿多次注册
//单边沿与双边沿切换: 请先注销(PORT_IRQ_DISABLE)再注册
int gpio_irq_config(enum gpio_port port, const struct gpio_irq_config_st *config);
示例:
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
.callback = gpio_irq_callback_p_test1,
};
gpio_irq_config(PORTA, &gpio_irq_config_test);
设置或修改io中断回调函数,可以设置为null,支持同组最多16个,或者单个io操作。
int gpio_irq_set_callback(enum gpio_port port, u32 pin, gpio_irq_callback_p callback);
设置或修改io中断触发沿,只有注册单边沿触发才能调用该函数切换边沿,支持同组最多16个,或者单个io操作。
//只有注册单边沿触发才能调用该函数切换边沿
//单边沿与双边沿切换: 请先注销再注册
int gpio_irq_set_edge(enum gpio_port port, u32 pin, enum gpio_irq_edge irq_edge);
获取io中断触发沿,只支持单个io操作。
// 获取单个io触发边沿 pin:只能带入1个io
enum gpio_irq_edge gpio_irq_get_edge(enum gpio_port port, u32 pin);
临时打开io中断,支持同组最多16个,或者单个io操作。
int gpio_irq_enable(enum gpio_port port, u32 pin);
临时关闭io中断,支持同组最多16个,或者单个io操作。
int gpio_irq_disable(enum gpio_port port, u32 pin);
3. GPIO crossbar功能配置
将外设功能映射到io。只支持单个io操作。
// 配置单个io为特殊功能. pin:只能带入1个io
int gpio_set_function(enum gpio_port port, u32 pin, enum gpio_function fn);
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");
}
将映射到io的外设功能注销,同时配置释放io,配置为高阻。只支持单个io操作。
// 注销单个io的特殊功能. pin:只能带入1个io
int gpio_disable_function(enum gpio_port port, u32 pin, enum gpio_function fn);