linux应用程序中如何操作gpio口

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux应用程序中如何操作gpio口相关的知识,希望对你有一定的参考价值。

参考技术A gpio定义好了后,直接调用系统提供的 gio_read 和 gio_write 函数。
TI解决方案中都带有这两个接口。

ESP-C3入门3. 基于IDF的GPIO基本操作

ESP-C3入门3. 基于IDF的GPIO基本操作

一、ESP32-C3的GPIO口资源

ESP32-C3有22个物理GPIO管脚,编号从0~21。
每个管脚可用作通用IO,或连接一个内部的外设信号。

GPIO引脚特殊功能介绍:

GPIO模拟功能注释
GPIO0ADC1_CH0RTC
GPIO1ADC1_CH1RTC
GPIO2ADC1_CH2Strapping 管脚;RTC
GPIO3ADC1_CH3RTC
GPIO4ADC1_CH4RTC
GPIO5ADC2_CH0RTC
GPIO6
GPIO7
GPIO8Strapping 管脚
GPIO9Strapping 管脚
GPIO10
GPIO11
GPIO12SPI0/1
GPIO13SPI0/1
GPIO14SPI0/1
GPIO15SPI0/1
GPIO16SPI0/1
GPIO17SPI0/1
GPIO18USB-JTAG
GPIO19USB-JTAG
GPIO20
GPIO21

说明:

  • GPIO2、8、9是Strapping管脚;它们和芯片复位状态有关,在芯片的系统复位过程中,Strapping管脚对自己电平采样并存储到锁存器,一直保持到芯片掉电或关闭。避免把这几个端口使用到其它功能上。
  • GPIO12-17通常用于SPI flash和PSRAM,不推荐用作其它用途;
  • GPIO18、19默认用于USB-JTAG,如果用作GPIO将无法使用USB-JTAG;
  • RTC:GPIO0-5可以在Deep-sleep模式时使用。

二、重要的API

头文件位置:
components/driver/include/driver/gpio.h

1. gpio口配置函数

esp_err_t gpio_config(const gpio_config_t *pGPIOConfig)
端口可以设置以下模式:

  • pull-up
  • PullDown
  • IntrType
  • 参数: pGPIOConfig结构体
  • 返回: ERP_OK或ESP_ERR_INVALID_ARG

gpio_config_t 结构体

公共成员类型说明
pin_bit_maskunit64_tgpio引脚
modegpio_mode_t模式,input或oputput
pull_up_engpio_pullup_t是否启用内部上拉电阻,前提是已配置上拉电阻
pull_down_engpio_pulldown_t是否启用内部下拉电阻,前提是已配置下拉电阻
intr_typegpio_int_type_t中断类型

使用示例:

     gpio_set_pull_mode(3, GPIO_PULLUP_ONLY);
     gpio_set_pull_mode(4, GPIO_PULLUP_ONLY);
     gpio_set_pull_mode(5, GPIO_PULLUP_ONLY);
     gpio_config_t ioConfig = 
         .pin_bit_mask = (1ull<<3) || (1ull<<4) || (1ull<<5),
         .mode = GPIO_MODE_OUTPUT,
         .pull_up_en = 1
     ;
     gpio_config(&ioConfig);

2. gpio口复位函数

esp_err_t gpio_reset_pin(gpio_num_t gpio_num)

  • 设置为上拉、禁用输入、禁用输出
  • 参数: gpio口号
  • 返回: ESP_OK

3. 设置 gpio 方向

gpio_set_direction(gpio_num_tgpio_num, gpio_mode_tmode)

gpio_mode_tmode值

  • GPIO_MODE_DISABLE
  • GPIO_MODE_INPUT
  • GPIO_MODE_OUTPUT
  • GPIO_MODE_OUTPUT_OD
  • GPIO_MODE_INPUT_OUTPUT_OD
  • GPIO_MODE_INPUT_OUTPUT

4. GPIO输出高、低电平

gpio_set_level(gpio_num_t gpio_num, uint32_t level)
level:

  • 0 低电平
  • 1 高电平

5. 输入模式检测电平

gpio_get_level(gpio_num_t gpio_num)

6. 配置单个引脚内部上、下拉电阻

  • gpio_set_pull_mode(gpio_num_t gpio_num)
  • gpio_pullup_en(gpio_num_t gpio_num)
  • gpio_pullup_dis(gpio_num_t gpio_num)
  • gpio_pulldown_en(gpio_num_t gpio_num)
  • gpio_pulldown_dis(gpio_num_t gpio_num)

7. 配置内部上下拉电阻

esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull)
pull值列表:

  • GPIO_PULLUP_ONLY —— 仅上拉
  • GPIO_PULLDOWN_ONLY —— 仅下拉
  • GPIO_PULLUP_PULLDOWN —— 全部启用
  • GPIO_FLOATING —— 悬空

三、 示例

1. RGB轮流显示

#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void app_main()
    gpio_reset_pin(GPIO_NUM_3);
    gpio_reset_pin(GPIO_NUM_4);
    gpio_reset_pin(GPIO_NUM_5);
    gpio_set_direction(GPIO_NUM_3, GPIO_MODE_OUTPUT);
    gpio_set_direction(GPIO_NUM_4, GPIO_MODE_OUTPUT);
    gpio_set_direction(GPIO_NUM_5, GPIO_MODE_OUTPUT);

    int i=0;
    while(1)
        printf("r=%d,g=%d,b=%d \\n", i%3==0?0:1, i%3==1?0:1,i%3==2?0:1);
        //1为高电平,0为低电平
        gpio_set_level(GPIO_NUM_3,i%3==0?0:1);   // 红
        gpio_set_level(GPIO_NUM_4,i%3==1?0:1);   // 绿
        gpio_set_level(GPIO_NUM_5,i%3==2?0:1);   // 蓝

        vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
        i++;
        if(i>2)i=0;
    

2. 读取GPIO值示例

#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void app_main()

    gpio_reset_pin(GPIO_NUM_6);
    gpio_set_direction(GPIO_NUM_6, GPIO_MODE_INPUT);
    // 配置下拉,默认低电平
    gpio_pulldown_en(GPIO_NUM_6);

    while (1)
    
        vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
        int s = gpio_get_level(GPIO_NUM_6);
        printf("gpio6=%d \\n", s);
    

以上是关于linux应用程序中如何操作gpio口的主要内容,如果未能解决你的问题,请参考以下文章

Linux应用开发第九章GPIO编程应用开发

嵌入式开发是对gpio口控制的一般步骤是怎样的

RK3399平台开发系列讲解(应用开发篇)1.9GPIO 编程-操作/sys/class/gpio/目录下文件方式

如何在Linux系统中直接操作GPIO

使用linux内核hrtimer高精度定时器实现GPIO口模拟PWM,原创

如何在Linux系统中直接操作GPIO