杰理-GPIO

今天记录下杰理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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值