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;
      
  • 返回值:

    • 成功返回0。
    • 错误返回-1。

      2.2 GPIO设置为output模式

  • 函数原型:
    int hosal_gpio_output_set(hosal_gpio_dev_t *gpio, uint8_t value);

  • 功能描述:设置相关gpio为output模式。
  • 函数参数:
    • gpio:需要初始化的GPIO的句柄
    • value:0表示输出低电平,1表示输出高电平
  • 返回值:

    • 成功返回0。
    • 错误返回-1。

      2.3 获取设置为input模式GPIO的电平

  • 函数原型:
    int hosal_gpio_input_get(hosal_gpio_dev_t *gpio, uint8_t *value);

  • 功能描述:获取设置为input模式GPIO的电平。
  • 函数参数:
    • gpio:GPIO的句柄
    • value:存储电压值
  • 返回值:

    • 成功返回0。
    • 错误返回-1。

      2.4 注册中断回调函数

  • 函数原型:
    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 释放相应内存。