GPIO
更新时间:2019-04-19 17:19:07
接口列表
接口详情
int32_t hal_gpio_init(gpio_dev_t *gpio)
描述 |
初始化指定GPIO管脚 |
参数 |
gpio:GPIO设备描述,定义需要初始化的GPIO管脚的相关特性 |
返回值 |
类型:int 返回成功或失败, 返回0表示GPIO初始化成功,非0表示失败 |
int32_t hal_gpio_output_high(gpio_dev_t *gpio)
描述 |
使指定GPIO输出高电平 |
参数 |
gpio:GPIO设备描述,定义需要初始化的GPIO管脚的相关特性 |
返回值 |
类型:int 返回成功或失败, 返回0表示GPIO输出高电平成功,非0表示失败 |
int32_t hal_gpio_output_low(gpio_dev_t *gpio)
描述 |
使指定GPIO输出低电平 |
参数 |
gpio:GPIO设备描述,定义需要初始化的GPIO管脚的相关特性 |
返回值 |
类型:int 返回成功或失败, 返回0表示GPIO输出低电平成功,非0表示失败 |
int32_t hal_gpio_output_toggle(gpio_dev_t *gpio)
描述 |
使指定GPIO输出翻转 |
参数 |
gpio:GPIO设备描述,定义需要初始化的GPIO管脚的相关特性 |
返回值 |
类型:int 返回成功或失败, 返回0表示timer创建成功,非0表示失败。 |
int32_t hal_gpio_input_get(gpio_dev_t gpio, uint32_t value)
描述 |
获取指定GPIO管脚的输入值 |
参数 |
gpio:GPIO设备描述,定义需要初始化的GPIO管脚的相关特性 |
|
value:存储输入值的数据指针 |
返回值 |
类型:int 返回成功或失败, 返回0表示timer创建成功,非0表示失败。 |
描述 |
使能指定GPIO的中断模式,挂载中断服务函数 |
参数 |
gpio:GPIO设备描述,定义需要初始化的GPIO管脚的相关特性 |
|
trigger:中断的触发模式,上升沿、下降沿还是都触发 |
|
gpio_irq_handler_t:中断服务函数指针,中断触发后将执行指向的函数 |
|
arg:中断服务函数的入参 |
返回值 |
类型:int 返回成功或失败, 返回0表示timer创建成功,非0表示失败。 |
int32_t hal_gpio_disable_irq(gpio_dev_t *gpio)
描述 |
关闭指定GPIO的中断 |
参数 |
gpio:GPIO设备描述,定义需要初始化的GPIO管脚的相关特性 |
返回值 |
类型:int 返回成功或失败, 返回0表示timer创建成功,非0表示失败。 |
int32_t hal_gpio_clear_irq(gpio_dev_t *gpio)
描述 |
清除指定GPIO的中断状态 |
参数 |
gpio:GPIO设备描述,定义需要初始化的GPIO管脚的相关特性 |
返回值 |
类型:int 返回成功或失败, 返回0表示timer创建成功,非0表示失败。 |
int32_t hal_gpio_finalize(gpio_dev_t *gpio)
描述 |
关闭指定GPIO |
参数 |
gpio:GPIO设备描述,定义需要初始化的GPIO管脚的相关特性 |
返回值 |
类型:int 返回成功或失败, 返回0表示timer创建成功,非0表示失败。 |
相关结数据结构
gpio_dev_t
typedef struct {
uint8_t port;
gpio_config_t config;
void *priv;
} gpio_dev_t;
gpio_config_t
typedef enum {
ANALOG_MODE,
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
gpio_dev_t led;
int application_start(int argc, char *argv[])
{
int ret = -1;
led.port = GPIO_LED_IO;
led.config = OUTPUT_PUSH_PULL;
ret = hal_gpio_init(&led);
if (ret != 0) {
printf("gpio init error !\n");
}
hal_gpio_output_high(&led);
hal_gpio_output_low(&led);
while(1) {
hal_gpio_output_toggle(&led);
aos_msleep(1000);
};
}
注:port为逻辑端口号,其与物理端口号的对应关系见具体的对接实现
GPIO作为中断输入
#include <aos/hal/gpio.h>
#define GPIO_BUTTON_IO 5
gpio_dev_t button1;
int button1_pressed = 0;
void button1_handler(void *arg)
{
button1_pressed = 1;
}
int application_start(int argc, char *argv[])
{
int ret = -1;
button1.port = GPIO_BUTTON_IO;
button1.config = IRQ_MODE;
ret = hal_gpio_init(&button1);
if (ret != 0) {
printf("gpio init error !\n");
}
ret = hal_gpio_enable_irq(&button1, IRQ_TRIGGER_BOTH_EDGES,
button1_handler, NULL);
if (ret != 0) {
printf("gpio irq enable error !\n");
}
while(1) {
if (button1_pressed == 1) {
button1_pressed = 0;
printf("button 1 is pressed !\n");
}
aos_msleep(100);
};
}
当button被按下后,串口会打印"button 1 is pressed !"
移植说明
新建hal_gpio_xxmcu.c和hal_gpio_xxmcu.h的文件,并将这两个文件放到platform/mcu/xxmcu/hal目录下。在hal_gpio_xxmcu.c中实现所需要的hal函数,hal_gpio_xxmcu.h中放置相关宏定义。<br /> 参考platform/mcu/stm32l4xx/src/STM32L496G-Discovery/hal/hal_gpio_stm32l4.c