1. 概述
通用型之输入输出(General-purpose input/output,通常称为GPIO),GPIO管理功能提供GPIO控制寄存器,实现软件对 GPIO 属性的配置,使用户能够方便地操作 GPIO。每个GPIO可以配置为输入、输出和可选功能三种模式。在每个模式下(除模拟可选功能),提供设置上拉,下拉,浮空三种端口状态,此外GPIO还提供中断功能,可以配置为上升沿触发,下降沿触发或者高电平/低电平触发。
2. API参考
2.1 GPIO初始化
- 函数原型:
int hosal_gpio_init(hosal_gpio_dev_t *gpio);
- 功能描述:初始化相关的GPIO
函数参数:
- gpio:需要初始化的GPIO的句柄
typedef struct { uint8_t port; /**< @brief gpio port */ hosal_gpio_config_t config; /**< @brief gpio config */ void *priv; /**< @brief priv data */ } hosal_gpio_dev_t;
- gpio:需要初始化的GPIO的句柄
返回值:
函数原型:
int hosal_gpio_output_set(hosal_gpio_dev_t *gpio, uint8_t value);
- 功能描述:设置相关gpio为output模式。
- 函数参数:
- gpio:需要初始化的GPIO的句柄
- value:0表示输出低电平,1表示输出高电平
返回值:
函数原型:
int hosal_gpio_input_get(hosal_gpio_dev_t *gpio, uint8_t *value);
- 功能描述:获取设置为input模式GPIO的电平。
- 函数参数:
- gpio:GPIO的句柄
- value:存储电压值
返回值:
函数原型:
int hosal_gpio_irq_set(hosal_gpio_dev_t *gpio,
hosal_gpio_irq_trigger_t trigger_type,
hosal_gpio_irq_handler_t handler, void *arg);
- 功能描述:注册中断回调函数
- 函数参数:
- gpio:GPIO的句柄
- trigger_type:触发类型
- handler:用户回调函数
- arg:用户回调函数参数 ```c typedef enum { HOSAL_GPIO_INT_TRIG_SYNC_FALLING_EDGE = 0, /!< GPIO interrupt sync mode, GPIO falling edge trigger interrupt / HOSAL_GPIO_INT_TRIG_SYNC_RISING_EDGE = 1, /!< GPIO interrupt sync mode, GPIO rising edge trigger interrupt / HOSAL_GPIO_INT_TRIG_SYNC_LOW_LEVEL = 2, /!< GPIO interrupt sync mode, GPIO low level trigger interrupt (32k 3T) / HOSAL_GPIO_INT_TRIG_SYNC_HIGH_LEVEL = 3, /!< GPIO interrupt sync mode, GPIO high level trigger interrupt (32k 3T) / HOSAL_GPIO_INT_TRIG_SYNC_FALLING_RISING_EDGE = 4, /!< GPIO interrupt sync mode, GPIO falling and rising edge trigger interrupt / HOSAL_GPIO_INT_TRIG_ASYNC_FALLING_EDGE = 8, /!< GPIO interrupt async mode, GPIO falling edge trigger interrupt / HOSAL_GPIO_INT_TRIG_ASYNC_RISING_EDGE = 9, /!< GPIO interrupt async mode, GPIO rising edge trigger interrupt / HOSAL_GPIO_INT_TRIG_ASYNC_LOW_LEVEL = 10, /!< GPIO interrupt async mode, GPIO low level trigger interrupt (32k 3T) / HOSAL_GPIO_INT_TRIG_ASYNC_HIGH_LEVEL = 11, /!< GPIO interrupt async mode, GPIO high level trigger interrupt (32k 3T) / } hosal_gpio_irq_trigger_t;
- 返回值:
- 成功返回0。
- 错误返回-1。
<a name="zqNFf"></a>
## 2.5 开关GPIO中断
- 函数原型:<br />`int hosal_gpio_irq_mask(hosal_gpio_dev_t *gpio, uint8_t mask);`
- 功能描述:屏蔽某个gpio中断
- 函数参数:
- gpio:GPIO的句柄
- mask:0 不屏蔽, 1屏蔽
- 返回值:
- 成功返回0。
- 错误返回-1。
<a name="ZCGap"></a>
## 2.6 反初始化GPIO
- 函数原型:<br />`int hosal_gpio_finalize(hosal_gpio_dev_t *gpio);`
- 功能描述:deinit gpio。
- 函数参数:
- gpio:GPIO的句柄
- 返回值:
- 成功返回0。
- 错误返回-1。
<a name="r8Yi5"></a>
# 3. Demo示例
```c
#include <stdio.h>
#include <hosal_gpio.h>
#include <hosal_dma.h>
#include <blog.h>
static hosal_gpio_dev_t gp1;
void gpio_set_led_on(void)
{
gp1.port = 11;
gp1.config = OUTPUT_OPEN_DRAIN_NO_PULL;
hosal_gpio_init(&gp1);
hosal_gpio_output_set(&gp1, 1);
}
void gpio_set_led_off(void)
{
hosal_gpio_output_set(&gp1, 0);
}
- 通过hosal_gpio_dev_t定义一个gpio设备,port对应pin脚,调用 hosal_gpio_init 初始化gpio,调用 hosal_gpio_output_set(&gp1, 1)使相应pin脚输出高电平,hosal_gpio_output_set(&gp1, 0) 输出低电平。
static hosal_gpio_dev_t key1;
static hosal_gpio_dev_t key2;
static uint8_t arg1 = 2, arg2 = 3;
void key1_irq(void *arg)
{
uint8_t val1 = *(uint8_t *)arg;
if (val1 == arg1) {
blog_info("[HOSAL][GPIO] irq1 ok\r\n");
}
}
void key2_irq(void *arg)
{
uint8_t val2 = *(uint8_t *)arg;
if (val2 == arg2) {
blog_info("[HOSAL][GPIO] irq2 ok\r\n");
}
}
void gpio_irq_test(void)
{
key1.port = 3;
key1.config = INPUT_PULL_UP;
hosal_gpio_init(&key1);
key2.port = 4;
key2.config = INPUT_PULL_UP;
hosal_gpio_init(&key2);
hosal_gpio_irq_set_yoc(&key1, HOSAL_IRQ_TRIG_NEG_PULSE, key1_irq, &arg1);
hosal_gpio_irq_set_yoc(&key2, HOSAL_IRQ_TRIG_NEG_PULSE, key2_irq, &arg2);
}
void key1_irq_mask_test(uint8_t mask)
{
hosal_gpio_irq_mask(&key1, mask);
}
- 通过 hosal_gpio_irq_set(&key1, HOSAL_IRQ_TRIG_NEG_PULSE, key1_irq, &arg1) 注册下降沿中断函数 key1_irq ,传入参数 arg1 。
hosal_gpio_finalize(&gp1);
不再使用该gpio可调用 hosal_gpio_finalize 释放相应内存。