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 | 模拟功能 | 注释 |
---|---|---|
GPIO0 | ADC1_CH0 | RTC |
GPIO1 | ADC1_CH1 | RTC |
GPIO2 | ADC1_CH2 | Strapping 管脚;RTC |
GPIO3 | ADC1_CH3 | RTC |
GPIO4 | ADC1_CH4 | RTC |
GPIO5 | ADC2_CH0 | RTC |
GPIO6 | ||
GPIO7 | ||
GPIO8 | Strapping 管脚 | |
GPIO9 | Strapping 管脚 | |
GPIO10 | ||
GPIO11 | ||
GPIO12 | SPI0/1 | |
GPIO13 | SPI0/1 | |
GPIO14 | SPI0/1 | |
GPIO15 | SPI0/1 | |
GPIO16 | SPI0/1 | |
GPIO17 | SPI0/1 | |
GPIO18 | USB-JTAG | |
GPIO19 | USB-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_mask | unit64_t | gpio引脚 |
mode | gpio_mode_t | 模式,input或oputput |
pull_up_en | gpio_pullup_t | 是否启用内部上拉电阻,前提是已配置上拉电阻 |
pull_down_en | gpio_pulldown_t | 是否启用内部下拉电阻,前提是已配置下拉电阻 |
intr_type | gpio_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_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口的主要内容,如果未能解决你的问题,请参考以下文章
RK3399平台开发系列讲解(应用开发篇)1.9GPIO 编程-操作/sys/class/gpio/目录下文件方式