【PC电脑windows-学习样例generic_gpio-ESP32的GPIO程序-基础样例学习】
- 1、概述
- 2、实验环境
- 3、 物品说明
- 4、自我总结
- 5、本次实验说明
- 6、实验过程
- (1)复制目录到桌面
- (2)手动敲写
- (3)反复改错
- (4)串口验证
- (5)逻辑分析仪验证
- 7-1、代码解读
- 7-2、代码连接
- 8、相关细节
- (1)编译环境配置
- (2)逻辑错误
- (3)样例代码目录
- (4)IO定义
- (5)打印连续输出
- (6)报错:包含文件
- (7)输入IO 4 和 5 有点差异
- 9、总结
1、概述
最为新手,想要快速入门相关设备,比如ESP32,可能最好的方式就是直接手动去敲一遍代码,而控制IO上下拉和输入捕获,算是基础了,官方已有相关样例代码,今天我们就是学习这个样例。
2、实验环境
硬件信息:开发板 ESP32-S3-DevKitM-1(EPS32-S3-wroom-1模块)
其它硬件:杜邦线,两个usb-type-c连接线。
3、 物品说明
ESP32对自己来说还是比较新的,最近也是刚刚接触,这里对自己使用ESP32进行简单说明。
博文链接:【在英伟达nvidia的jetson-orin-nx和PC电脑ubuntu20.04上-装配ESP32开发调试环境-基础测试】
另外如果对ESP32相关型号比较感兴趣,可以去官网查看,或者找些资。
官网文档:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/hw-reference/esp32s3/user-guide-devkitm-1.html
4、自我总结
(1)练习代码是你更快入门
练习代码比实际看代码要快些,这属于个人见解了,练习敲写代码过程汇总,就是帮助你熟悉相关代码结构,当你从一个固有套路结构代码中,切换到另一套方式时,可能直接手敲,更能让你理解。
(2)IO相关测试,手动更改
自己练习的代码,手动敲完,可能会报错,可能会有逻辑错误,在改的过程中,其实也是熟悉。
5、本次实验说明
本次实验是使用样例generic_gpio,直接复制一份在桌面,然后手动敲写一遍。
这个样例,是使用ESP32的GPIO 18,GPIO 19 , GPIO 4 GPIO 5.
其中 GPIO18,和GPIO19是输出, GPIO 4和GPIO 5是输入.如下,代码中也说明了,但是开始的时候,自己作为新手,可不敢说自己就和知道了,试过之后才能准确确定的。
6、实验过程
(1)复制目录到桌面
(2)手动敲写
我们只是删除如下文件内容,
然后自己手都敲写一遍。
(3)反复改错
可以看到,首次编译还是有很多错误的,拼写错误,都还好,逻辑错误有点难找。
就是根据原版,反复对照,可以看到原版有很多注释的,我们可以不用打。
(4)串口验证
下载成功后验证
(5)逻辑分析仪验证
7-1、代码解读
一般来说你要是自己敲写一遍,基本就明白了。按照自己理解写了一点解读,样例已有,只不过是英文的。
/* GPIO Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
/**
* Brief:
* This test code shows how to configure gpio and how to use gpio interrupt.
*
* GPIO status:
* GPIO18: output (ESP32C2/ESP32H2 uses GPIO8 as the second output pin)
* GPIO19: output (ESP32C2/ESP32H2 uses GPIO9 as the second output pin)
* GPIO4: input, pulled up, interrupt from rising edge and falling edge
* GPIO5: input, pulled up, interrupt from rising edge.
*
* Note. These are the default GPIO pins to be used in the example. You can
* change IO pins in menuconfig.
*
* Test:
* Connect GPIO18(8) with GPIO4
* Connect GPIO19(9) with GPIO5
* Generate pulses on GPIO18(8)/19(9), that triggers interrupt on GPIO4/5
*
*/
#define GPIO_OUTPUT_IO_0 CONFIG_GPIO_OUTPUT_0
#define GPIO_OUTPUT_IO_1 CONFIG_GPIO_OUTPUT_1
#define GPIO_OUTPUT_PIN_SEL ((1ULL<<GPIO_OUTPUT_IO_0)|(1ULL<<GPIO_OUTPUT_IO_1))
#define GPIO_INPUT_IO_0 CONFIG_GPIO_INPUT_0
#define GPIO_INPUT_IO_1 CONFIG_GPIO_INPUT_1
#define GPIO_INPUT_PIN_SEL ((1ULL<<GPIO_INPUT_IO_0) | (1ULL<<GPIO_INPUT_IO_1))
#define ESP_INTR_FLAG_DEFAULT 0
static QueueHandle_t gpio_evt_queue=NULL;
static void IRAM_ATTR gpio_isr_handler(void* arg){
uint32_t gpio_num=(uint32_t) arg;
xQueueSendFromISR(gpio_evt_queue,&gpio_num,NULL);
}
static void gpio_task_example(void* arg)
{
uint32_t io_num;
for(;;){
if(xQueueReceive(gpio_evt_queue,&io_num,portMAX_DELAY)){
printf("my_DATA_GPIO[%"PRIu32"] intr,val:%d\n",io_num,gpio_get_level(io_num));
}
}
}
void app_main(void)
{
//IO初始化配置
gpio_config_t io_conf={};
io_conf.intr_type=GPIO_INTR_DISABLE;
io_conf.mode=GPIO_MODE_OUTPUT;
io_conf.pin_bit_mask=GPIO_OUTPUT_PIN_SEL;
io_conf.pull_down_en=0;
io_conf.pull_up_en=0;
gpio_config(&io_conf);
io_conf.intr_type=GPIO_INTR_POSEDGE;
io_conf.pin_bit_mask=GPIO_INPUT_PIN_SEL;
io_conf.mode=GPIO_MODE_INPUT;
io_conf.pull_up_en=1;
gpio_config(&io_conf);
//初始化
gpio_set_intr_type(GPIO_INPUT_IO_0,GPIO_INTR_ANYEDGE);
gpio_evt_queue=xQueueCreate(10,sizeof(uint32_t));
//开一个任务
xTaskCreate(gpio_task_example,"gpio_task_example",2048,NULL,10,NULL);
//输出中断
gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
gpio_isr_handler_add(GPIO_INPUT_IO_0,gpio_isr_handler,(void * )GPIO_INPUT_IO_0);
//gpio_isr_handler_remove(GPIO_INPUT_IO_0);
gpio_isr_handler_add(GPIO_INPUT_IO_1,gpio_isr_handler,(void * )GPIO_INPUT_IO_1);
gpio_isr_handler_remove(GPIO_INPUT_IO_0);
gpio_isr_handler_add(GPIO_INPUT_IO_0,gpio_isr_handler,(void * )GPIO_INPUT_IO_0);
printf("Minmu free heap_size:%"PRIu32" bytes\n",esp_get_minimum_free_heap_size());
int cnt=0;
while (1)
{
printf("<<<my_learing_GPIO_cnt:%d>>>\n",cnt++);
vTaskDelay(1000/portTICK_PERIOD_MS);
gpio_set_level(GPIO_OUTPUT_IO_0,cnt%2);
gpio_set_level(GPIO_OUTPUT_IO_1,cnt%2);
}
}
7-2、代码连接
代码链接:https://download.csdn.net/download/qq_22146161/88483114
8、相关细节
(1)编译环境配置
相关配置情况自己的其他文章:【ESP32-PC电脑windows-环境搭建-记录-hello-world-运行基础样例学习】
(2)逻辑错误
一般来说逻辑错误比较难以发现。
(3)样例代码目录
如果是默认安装,找如下目录
C:\Espressif\frameworks\esp-idf-v5.0.2\examples\peripherals\gpio
(4)IO定义
自己打代码的时候,比较疑惑,没有看到GPIO18相关的信息,怎么就是GPIO19,GPIO4,等等,后来看到配置文件。
(5)打印连续输出
如下图,可以开电脑有一串1,那是因为手抖了,没有去除抖动。
(6)报错:包含文件
开始的时候是在Linux环境
在windows环境后,知道了原因
(7)输入IO 4 和 5 有点差异
实验过程中,发现4是可以检验高低的,但是5只能检测高。一直以为自己敲代码敲错了,后来,拿样例对比才知道,5就只检测高。
如下,如果不是抖动的话,5一直检测高
如下,如果不是抖动的话,GPIO4高低都检测
9、总结
一步一步