无锡知名网站制作,wordpress 登录密码,网页模板下载不了,网站图片做多大文章目录 前言一、有哪些工作模式#xff1f;1.1 GPIO的详细介绍1.2 GPIO的内部框图输入模式输出部分 二、GPIO操作函数2.1 GPIO 汇总2.2 GPIO操作函数gpio_config配置引脚reset 引脚函数设置引脚电平选中对应引脚设置引脚的方向 2.3 点亮第一个灯 三、流水灯总结 前言
ESP32… 文章目录 前言一、有哪些工作模式1.1 GPIO的详细介绍1.2 GPIO的内部框图输入模式输出部分 二、GPIO操作函数2.1 GPIO 汇总2.2 GPIO操作函数gpio_config配置引脚reset 引脚函数设置引脚电平选中对应引脚设置引脚的方向 2.3 点亮第一个灯 三、流水灯总结 前言
ESP32是一款功能强大的微控制器广泛应用于物联网IoT和嵌入式系统开发中。ESP32的开发环境包括ESP-IDFEspressif IoT Development Framework它提供了丰富的工具和库使开发人员能够充分利用ESP32的性能和功能。
本文旨在介绍ESP32 IDF的快速入门通过简单的示例演示如何点亮第一个LED灯和实现流水灯效果。这些基础示例将帮助初学者了解如何使用ESP32 IDF进行开发并为后续的项目打下基础。 一、有哪些工作模式
1.1 GPIO的详细介绍
GPIO是General-purpose and alternate-function I/Os的缩写 他的含义是通用和复用的引脚
GPIO是分组的每一组有很多引脚 比如说PA0、PA1…PA15一组GPIO有16个引脚 组数是由芯片决定的具体的组数可以看对应的芯片的原理图
1.2 GPIO的内部框图
我们可以在芯片手册中找到GPIO的对应框图他说对于某一个引脚的 他可以分为两部分上部分就是输入下部分就是输出
输入模式
输入模式的框图如下 要理解他我们可以看下面的图
我们通过配置pin1让他为输入然后我们读某个寄存器就可以得到他的状态。 当k1按下接到电源那么pin肯定状态是1高电平如果没有按下相当于这个引脚是悬空状态 那么你读这个值你知道他是什么状态吗可能读出来是1可以是0
再比如我们配置pin2让他为输入和上面一样我们也去读按下时为0那么没有按下是什么状态呢就和上面的是一样的了
那么我们怎么解决他这个问题呢 对于pin1我们可以加一个下拉电阻 那么他按下时就就会是高电平没按就是低电平
同样的对于pin2就需要加上拉电阻了 那么他按下时就就会是低电平没按就是高电平
所以上下拉电阻是需要看实际的情况来选择的。
这些电阻集成到了芯片我们可以直接设置他是上拉还是下拉我们就不用每一个都搞一个电阻了
回到框图 其中里面的VDD为上拉电阻 Vss为下拉电阻他在芯片中已经设计好的了
还有一种输入就是 Analog Input模拟输入那么模拟输入的话他需要得到具体的电压值所以我们不能设置上下拉电阻完全由外部电路控制要不然模拟输入和直接输入没两样了
那么输入就是这几部分上拉输入、下拉输入、浮空输入、模拟输入
在最后我们通过读取输入寄存器Input data register得到1/0
如果说他有毛刺怎么办他会在某一个范围电压内为1某一个电压范围为0
输出部分 他这个GPIO可以接到一个灯或者其他的芯片 如果是点灯那么电压肯定是越高越好 如果是关灯电压肯定是越低越好
当输出1时I/O pin连接到P-MOS的VDD然后就能点灯了 如果输出0P-MOS断开连接地所以就关灯 推挽输出当你要高电平就推到VDD如果要低电平就推到VSS这样就是推挽输出可以输出高低电平
开漏输出 在开漏输出中有两种状态开和关。当开漏输出为开启状态时它会将电路连接到地或负极使得电路的输出变为低电平。而当开漏输出为关闭状态时它不会连接到任何地方使得电路的输出由外部设备或其他电路来控制。
开漏输出一般是用来解决两个芯片通信的问题的 不至于把两个芯片搞坏
二、GPIO操作函数
2.1 GPIO 汇总
ESP32 芯片具有 34 个物理 GPIO 管脚GPIO0 ~ GPIO19、GPIO21 ~ GPIO23、GPIO25 ~ GPIO27 和 GPIO32 ~ GPIO39。每个管脚都可用作一个通用 IO或连接一个内部的外设信号。通过 IO MUX、RTC IO MUX 和 GPIO 交换矩阵可配置外设模块的输入信号来源于任何的 IO 管脚并且外设模块的输出信号也可连接到任意 IO 管脚。这些模块共同组成了芯片的 IO 控制。
2.2 GPIO操作函数
在使用GPIO之前你需要加上这个头文件:#include driver/gpio.h
gpio_config配置引脚
我们可以使用下面这个函数对一个GPIO进行配置
esp_err_t gpio_config(const gpio_config_t *pGPIOConfig);他的参数是一个结构体他的类型如下
typedef struct {uint64_t pin_bit_mask; /*! GPIO pin: set with bit mask, each bit maps to a GPIO */gpio_mode_t mode; /*! GPIO mode: set input/output mode */gpio_pullup_t pull_up_en; /*! GPIO pull-up */gpio_pulldown_t pull_down_en; /*! GPIO pull-down */gpio_int_type_t intr_type; /*! GPIO interrupt type */
} gpio_config_t;pin_bit_mask 作用用于设置GPIO引脚。每个位bit对应一个GPIO引脚通过位掩码的方式来选择要配置的GPIO引脚。 类型uint64_t64位的整数类型。 比如把GPIO10设置
gpio_config_t gpio_conf;
gpio_conf.pin_bit_mask (1ULL 10); // 将第10位设置为1表示选择GPIO10mode 作用设置GPIO引脚的工作模式即输入模式input还是输出模式output。 类型gpio_mode_t是一个枚举类型可能的取值包括 GPIO_MODE_INPUT 和 GPIO_MODE_OUTPUT。
pull_up_en 作用启用或禁用GPIO引脚的上拉电阻。 类型gpio_pullup_t是一个枚举类型可能的取值包括 GPIO_PULLUP_DISABLE 和 GPIO_PULLUP_ENABLE。 pull_down_en
作用启用或禁用GPIO引脚的下拉电阻。 类型gpio_pulldown_t是一个枚举类型可能的取值包括 GPIO_PULLDOWN_DISABLE 和 GPIO_PULLDOWN_ENABLE。 intr_type
作用配置GPIO引脚的中断类型即何种事件会触发中断。 类型gpio_int_type_t是一个枚举类型可能的取值包括 GPIO_INTR_DISABLE、GPIO_INTR_ANYEDGE、GPIO_INTR_NEGEDGE 和 GPIO_INTR_POSEDGE。分别表示禁用中断、任意边沿触发、下降沿触发和上升沿触发。
他的放回值为esp_err_t类型他是一个int类型
他有如下的取值
/* Definitions for error constants. */
#define ESP_OK 0 /*! esp_err_t value indicating success (no error) */
#define ESP_FAIL -1 /*! Generic esp_err_t code indicating failure */#define ESP_ERR_NO_MEM 0x101 /*! Out of memory */
#define ESP_ERR_INVALID_ARG 0x102 /*! Invalid argument */
#define ESP_ERR_INVALID_STATE 0x103 /*! Invalid state */
#define ESP_ERR_INVALID_SIZE 0x104 /*! Invalid size */
#define ESP_ERR_NOT_FOUND 0x105 /*! Requested resource not found */
#define ESP_ERR_NOT_SUPPORTED 0x106 /*! Operation or feature not supported */
#define ESP_ERR_TIMEOUT 0x107 /*! Operation timed out */
#define ESP_ERR_INVALID_RESPONSE 0x108 /*! Received response was invalid */
#define ESP_ERR_INVALID_CRC 0x109 /*! CRC or checksum was invalid */
#define ESP_ERR_INVALID_VERSION 0x10A /*! Version was invalid */
#define ESP_ERR_INVALID_MAC 0x10B /*! MAC address was invalid */#define ESP_ERR_WIFI_BASE 0x3000 /*! Starting number of WiFi error codes */
#define ESP_ERR_MESH_BASE 0x4000 /*! Starting number of MESH error codes */
#define ESP_ERR_FLASH_BASE 0x6000 /*! Starting number of flash error codes */
#define ESP_ERR_HW_CRYPTO_BASE 0xc000 /*! Starting number of HW cryptography module error codes */reset 引脚函数
我们可以使用下面这个函数重置指定的引脚
esp_err_t gpio_reset_pin(gpio_num_t gpio_num);他的参数是一个枚举里面有所有的引脚定义
typedef enum {GPIO_NUM_NC -1, /*! Use to signal not connected to S/W */GPIO_NUM_0 0, /*! GPIO0, input and output */GPIO_NUM_1 1, /*! GPIO1, input and output */GPIO_NUM_2 2, /*! GPIO2, input and output */GPIO_NUM_3 3, /*! GPIO3, input and output */GPIO_NUM_4 4, /*! GPIO4, input and output */GPIO_NUM_5 5, /*! GPIO5, input and output */GPIO_NUM_6 6, /*! GPIO6, input and output */GPIO_NUM_7 7, /*! GPIO7, input and output */GPIO_NUM_8 8, /*! GPIO8, input and output */GPIO_NUM_9 9, /*! GPIO9, input and output */GPIO_NUM_10 10, /*! GPIO10, input and output */GPIO_NUM_11 11, /*! GPIO11, input and output */GPIO_NUM_12 12, /*! GPIO12, input and output */GPIO_NUM_13 13, /*! GPIO13, input and output */GPIO_NUM_14 14, /*! GPIO14, input and output */GPIO_NUM_15 15, /*! GPIO15, input and output */GPIO_NUM_16 16, /*! GPIO16, input and output */GPIO_NUM_17 17, /*! GPIO17, input and output */GPIO_NUM_18 18, /*! GPIO18, input and output */GPIO_NUM_19 19, /*! GPIO19, input and output */GPIO_NUM_20 20, /*! GPIO20, input and output */GPIO_NUM_21 21, /*! GPIO21, input and output */GPIO_NUM_22 22, /*! GPIO22, input and output */GPIO_NUM_23 23, /*! GPIO23, input and output */GPIO_NUM_25 25, /*! GPIO25, input and output */GPIO_NUM_26 26, /*! GPIO26, input and output */GPIO_NUM_27 27, /*! GPIO27, input and output */GPIO_NUM_28 28, /*! GPIO28, input and output */GPIO_NUM_29 29, /*! GPIO29, input and output */GPIO_NUM_30 30, /*! GPIO30, input and output */GPIO_NUM_31 31, /*! GPIO31, input and output */GPIO_NUM_32 32, /*! GPIO32, input and output */GPIO_NUM_33 33, /*! GPIO33, input and output */GPIO_NUM_34 34, /*! GPIO34, input mode only */GPIO_NUM_35 35, /*! GPIO35, input mode only */GPIO_NUM_36 36, /*! GPIO36, input mode only */GPIO_NUM_37 37, /*! GPIO37, input mode only */GPIO_NUM_38 38, /*! GPIO38, input mode only */GPIO_NUM_39 39, /*! GPIO39, input mode only */GPIO_NUM_MAX,
/** endcond */
} gpio_num_t;你可以直接填写引脚数字即可。
设置引脚电平
我们可以使用下面这个函数来设置指定引脚的电平
esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level)参数1为设置哪个引脚参数2为是高电平还是低电平
选中对应引脚
我们可以使用下面的函数使物理引脚转换成GPIO引脚
void gpio_pad_select_gpio(uint8_t gpio_num);例如
gpio_pad_select_gpio(10);设置引脚的方向
我们可以使用下面函数来设置引脚是输入模式还是输出模式
esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode)其参数2为一个枚举类型下面为他的定义
typedef enum {GPIO_MODE_DISABLE GPIO_MODE_DEF_DISABLE, /*! GPIO mode : disable input and output */GPIO_MODE_INPUT GPIO_MODE_DEF_INPUT, /*! GPIO mode : input only */GPIO_MODE_OUTPUT GPIO_MODE_DEF_OUTPUT, /*! GPIO mode : output only mode */GPIO_MODE_OUTPUT_OD ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)), /*! GPIO mode : output only with open-drain mode */GPIO_MODE_INPUT_OUTPUT_OD ((GPIO_MODE_DEF_INPUT) | (GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)), /*! GPIO mode : output and input with open-drain mode*/GPIO_MODE_INPUT_OUTPUT ((GPIO_MODE_DEF_INPUT) | (GPIO_MODE_DEF_OUTPUT)), /*! GPIO mode : output and input mode */
} gpio_mode_t;2.3 点亮第一个灯
gpio_reset_pin(22);
gpio_pad_select_gpio(22);
gpio_set_direction(22,GPIO_MODE_OUTPUT);for(int i 0;i10;i)
{gpio_set_level(22,1);vTaskDelay(100);gpio_set_level(22,0);vTaskDelay(100);
}三、流水灯
#include stdio.h
#include freertos/FreeRTOS.h
#include freertos/task.h
#include driver/gpio.h#define LED_GPIO_1 GPIO_NUM_25
#define LED_GPIO_2 GPIO_NUM_26
#define LED_GPIO_3 GPIO_NUM_27void app_main() {// 配置GPIO引脚gpio_pad_select_gpio(LED_GPIO_1);gpio_pad_select_gpio(LED_GPIO_2);gpio_pad_select_gpio(LED_GPIO_3);gpio_set_direction(LED_GPIO_1, GPIO_MODE_OUTPUT);gpio_set_direction(LED_GPIO_2, GPIO_MODE_OUTPUT);gpio_set_direction(LED_GPIO_3, GPIO_MODE_OUTPUT);while (1) {// 依次点亮LEDgpio_set_level(LED_GPIO_1, 1);vTaskDelay(500 / portTICK_PERIOD_MS);gpio_set_level(LED_GPIO_1, 0);gpio_set_level(LED_GPIO_2, 1);vTaskDelay(500 / portTICK_PERIOD_MS);gpio_set_level(LED_GPIO_2, 0);gpio_set_level(LED_GPIO_3, 1);vTaskDelay(500 / portTICK_PERIOD_MS);gpio_set_level(LED_GPIO_3, 0);}
} 总结
通过本文的介绍读者可以快速了解如何在ESP32上使用ESP-IDF进行开发。我们首先介绍了如何点亮第一个LED灯通过简单的代码演示了如何配置GPIO并控制LED的状态。接着我们进一步展示了如何实现流水灯效果通过循环控制多个LED的状态从而创建动态的灯光效果。
这些示例不仅帮助读者熟悉ESP32的开发流程和基本操作还为他们提供了一个良好的起点使他们能够深入学习ESP32的更高级功能和应用。ESP32 IDF提供了丰富的文档和示例代码读者可以进一步探索和实践开发出更加复杂和功能丰富的项目。