介绍关于GPIO管脚输入、输出、中断等功能设定时用到的抽象函数。

API列表

函数名称 功能描述
hal_gpio_init 初始化指定GPIO管脚
hal_gpio_output_high 使指定GPIO输出高电平
hal_gpio_output_low 使指定GPIO输出低电平
hal_gpio_output_toggle 使指定GPIO输出翻转
hal_gpio_input_get 获取指定GPIO管脚的输入值
hal_gpio_enable_irq 使能指定GPIO的中断模式,挂载中断服务函数
hal_gpio_disable_irq 关闭指定GPIO的中断
hal_gpio_clear_irq 清除指定GPIO的中断状态
hal_gpio_finalize 关闭指定GPIO

hal_gpio_init

定义描述
定义 描述
函数原型 int32_t hal_gpio_init(gpio_dev_t *gpio)
描述 初始化指定GPIO管脚
参数 gpio:GPIO设备描述,定义需要初始化的GPIO管脚的相关特性
返回值 类型:int 返回成功或失败,返回0表示GPIO初始化成功,非0表示失败

调用示例

具体请参见使用示例

hal_gpio_output_high

定义描述
定义 描述
函数原型 int32_t hal_gpio_output_high(gpio_dev_t *gpio)
描述 使指定GPIO输出高电平
参数 gpio:GPIO设备描述
返回值 类型:int 返回成功或失败,返回0表示GPIO输出高电平成功,非0表示失败

调用示例

具体请参见使用示例

hal_gpio_output_low

定义描述
定义 描述
函数原型 int32_t hal_gpio_output_low(gpio_dev_t *gpio)
描述 使指定GPIO输出低电平
参数 gpio:GPIO设备描述
返回值 类型:int 返回成功或失败,返回0表示GPIO输出低电平成功,非0表示失败

调用示例

具体请参见使用示例

hal_gpio_output_toggle

定义描述
定义 描述
函数原型 int32_t hal_gpio_output_toggle(gpio_dev_t *gpio)
描述 使指定GPIO输出翻转
参数 gpio:GPIO设备描述
返回值 类型:int 返回成功或失败, 返回0表示GIPO输出翻转成功,非0表示失败。

调用示例

具体请参见使用示例

hal_gpio_input_get

定义描述
定义 描述
函数原型 int32_t hal_gpio_input_get(gpio_dev_t *gpio, uint32_t *value)
描述 获取指定GPIO管脚的输入值
参数
  • gpio:GPIO设备描述
  • value:存储输入值的数据指针
返回值 类型:int 返回成功或失败,返回0表示GPIO管脚的输入值获取成功,非0表示失败。

调用示例

具体请参见使用示例

hal_gpio_enable_irq

定义描述
定义 描述
函数原型 int32_t hal_gpio_enable_irq(gpio_dev_t *gpio, gpio_irq_trigger_t trigger, gpio_irq_handler_t handler, void *arg)
描述 使能指定GPIO的中断模式,挂载中断服务函数
参数
  • gpio:GPIO设备描述
  • trigger:中断的触发模式,上升沿、下降沿还是都触发
  • gpio_irq_handler_t:中断服务函数指针,中断触发后将执行指向的函数
  • arg:中断服务函数的入参
返回值 类型:int 返回成功或失败,返回0表示GPIO的中断模式使能成功,非0表示失败。

调用示例

具体请参见使用示例

hal_gpio_disable_irq

定义描述
定义 描述
函数原型 int32_t hal_gpio_disable_irq(gpio_dev_t *gpio)
描述 关闭指定GPIO的中断
参数 gpio:GPIO设备描述
返回值 类型:int 返回成功或失败,返回0GPIO的中断关闭成功,非0表示失败。

调用示例

具体请参见使用示例

hal_gpio_clear_irq

定义描述
定义 描述
函数原型 int32_t hal_gpio_clear_irq(gpio_dev_t *gpio)
描述 清除指定GPIO的中断状态
参数 gpio:GPIO设备描述
返回值 类型:int 返回成功或失败,返回0表示GPIO的中断状态清除成功,非0表示失败。

调用示例

具体请参见使用示例

hal_gpio_finalize

定义描述
定义 描述
函数原型 int32_t hal_gpio_finalize(gpio_dev_t *gpio)
描述 关闭指定GPIO
参数 gpio:GPIO设备描述
返回值 类型:int 返回成功或失败,返回0表示GPIO关闭成功,非0表示失败。

调用示例

具体请参见使用示例

gpio_dev_t数据结构

typedef struct {
    uint8_t       port;    /* gpio逻辑端口号 */
    gpio_config_t config;  /* gpio配置信息 */
    void         *priv;    /* 私有数据 */
} gpio_dev_t;

gpio_config_t数据结构

typedef enum {
    ANALOG_MODE,               /* 管脚用作功能引脚,如用于pwm输出,uart的输入引脚 */
    IRQ_MODE,                  /* 中断模式,配置为中断源 */
    INPUT_PULL_UP,             /* 输入模式,内部包含一个上拉电阻 */
    INPUT_PULL_DOWN,           /* 输入模式,内部包含一个下拉电阻 */
    INPUT_HIGH_IMPEDANCE,      /* 输入模式,内部为高阻模式 */
    OUTPUT_PUSH_PULL,          /* 输出模式,普通模式 */
    OUTPUT_OPEN_DRAIN_NO_PULL, /* 输出模式,输出高电平时,内部为高阻状态 */
    OUTPUT_OPEN_DRAIN_PULL_UP, /* 输出模式,输出高电平时,被内部电阻拉高 */
} gpio_config_t;

gpio_irq_trigger_t数据结构

typedef enum {
    IRQ_TRIGGER_RISING_EDGE  = 0x1, /* 上升沿触发 */
    IRQ_TRIGGER_FALLING_EDGE = 0x2, /* 下降沿触发 */
    IRQ_TRIGGER_BOTH_EDGES   = IRQ_TRIGGER_RISING_EDGE | IRQ_TRIGGER_FALLING_EDGE, /* 上升沿下降沿均触发 */
} gpio_irq_trigger_t;

gpio_irq_handler_t数据结构

typedef void (*gpio_irq_handler_t)(void *arg);

使用示例

  • GPIO作为输出
    #include <aos/hal/gpio.h>
    
    #define GPIO_LED_IO 18
    
    /* define dev */
    gpio_dev_t led;
    
    int application_start(int argc, char *argv[])
    {
        int ret = -1;
    
        /* gpio port config */
        led.port = GPIO_LED_IO;
    
        /* set as output mode */
        led.config = OUTPUT_PUSH_PULL;
    
        /* configure GPIO with the given settings */
        ret = hal_gpio_init(&led);
        if (ret != 0) {
            printf("gpio init error !\n");
            return -1;
        }
    
        /* output high */
        hal_gpio_output_high(&led);
    
        /* output low */
        hal_gpio_output_low(&led);
    
        /* toggle the LED every 1s */
        while(1) {
    
            /* toggle output */
            hal_gpio_output_toggle(&led);
    
            /* sleep 1000ms */
            aos_msleep(1000);
        };
    }
    注意 port为逻辑端口号,其与物理端口号的对应关系见具体的对接实现。
  • GPIO作为中断输入
    #include <aos/hal/gpio.h>
    
    #define GPIO_BUTTON_IO 5
    
    /* define dev */
    gpio_dev_t button1;
    
    /* pressed flag */
    int button1_pressed = 0;
    
    void button1_handler(void *arg)
    {
        int value = 0;    
        hal_get_gpio_input(&button1, &value);    
        if (value == 1){
            button1_pressed = 1;
        }
    }
    
    int application_start(int argc, char *argv[])
    {
        int ret = -1;
    
        /* input pin config */
        button1.port = GPIO_BUTTON_IO;
    
        /* set as interrupt mode */
        button1.config = IRQ_MODE;
    
        /* configure GPIO with the given settings */
        ret = hal_gpio_init(&button1);
        if (ret != 0) {
            printf("gpio init error !\n");
            return -1;
        }
    
        /* gpio interrupt config */
        ret = hal_gpio_enable_irq(&button1, IRQ_TRIGGER_BOTH_EDGES, 
                                  button1_handler, NULL);
        if (ret != 0) {
            printf("gpio irq enable error !\n");
    hal_gpio_finalize(&button1);
            return -1;
        }
    
        /* if button is pressed, print "button 1 is pressed !" */
        while(1) {
            if (button1_pressed == 1) {
                button1_pressed = 0;
                printf("button 1 is pressed !\n");
            }
    
            /* sleep 100ms */
            aos_msleep(100);
        };
    }
    
    当button被按下后,串口会打印"button 1 is pressed !"
说明 移植前,请新建hal_gpio_xxmcu.chal_gpio_xxmcu.h的文件,并将这两个文件放到platform/mcu/xxmcu/hal目录下。在hal_gpio_xxmcu.c中实现所需要的hal函数,hal_gpio_xxmcu.h中放置相关宏定义。具体请参见platform/mcu/stm32l4xx_cube/hal/hal_gpio_stm32l4.c